使用NOPI导入Excel文档

NOPI版本:2.3.0,依赖于NPOI的SharpZipLib版本:0.86,经测试适用于.net4.0+

记录遇到的几个问题

  1. NOPI中的IWorkbook接口:xls使用HSSFWorkbook类实现,xlsx使用XSSFWorkbook类实现
  2. 日期转换,判断row.GetCell(j).CellType == NPOI.SS.UserModel.CellType.Numeric && HSSFDateUtil.IsCellDateFormatted(row.GetCell(j)
    不能直接使用row.GetCell(j).DateCellValue,这玩意会直接抛出异常来~

1. 将文件流转换为DataTable

    /// <summary>/// 根据Excel格式读取Excel/// </summary>/// <param name="stream">文件流</param>/// <param name="type">Excel格式枚举类型,xls/xlsx</param>/// <param name="sheetName">表名,默认取第一张</param>/// <returns>DataTable</returns>private static DataTable ImportExcel(Stream stream, ExcelExtType type, string sheetName){DataTable dt = new DataTable();IWorkbook workbook;try{//xls使用HSSFWorkbook类实现,xlsx使用XSSFWorkbook类实现switch (type){case ExcelExtType.xlsx:workbook = new XSSFWorkbook(stream);break;default:workbook = new HSSFWorkbook(stream);break;}ISheet sheet = null;//获取工作表 默认取第一张if (string.IsNullOrWhiteSpace(sheetName))sheet = workbook.GetSheetAt(0);elsesheet = workbook.GetSheet(sheetName);if (sheet == null)return null;IEnumerator rows = sheet.GetRowEnumerator();#region 获取表头IRow headerRow = sheet.GetRow(0);int cellCount = headerRow.LastCellNum;for (int j = 0; j < cellCount; j++){ICell cell = headerRow.GetCell(j);if (cell != null){dt.Columns.Add(cell.ToString());}else{dt.Columns.Add("");}}#endregion#region 获取内容for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++){IRow row = sheet.GetRow(i);DataRow dataRow = dt.NewRow();for (int j = row.FirstCellNum; j < cellCount; j++){if (row.GetCell(j) != null){//判断单元格是否为日期格式if (row.GetCell(j).CellType == NPOI.SS.UserModel.CellType.Numeric && HSSFDateUtil.IsCellDateFormatted(row.GetCell(j))){if (row.GetCell(j).DateCellValue.Year >=1970){dataRow[j] = row.GetCell(j).DateCellValue.ToString();}else{dataRow[j] = row.GetCell(j).ToString();}}else{dataRow[j] = row.GetCell(j).ToString();}}}dt.Rows.Add(dataRow);}#endregion}catch (Exception ex){dt=null;}finally{//if (stream != null)//{//    stream.Close();//    stream.Dispose();//}}return dt;}

2. 文件上载导入

    /// <summary>/// 上传Excel导入/// </summary>/// <param name="file">上载文件对象</param>/// <param name="errorMsg">错误信息</param>/// <param name="sheetName">表名,默认取第一张</param>/// <returns></returns>public static DataTable Import(System.Web.HttpPostedFileBase file, ref string errorMsg, string sheetName = ""){if (file == null || file.InputStream == null || file.InputStream.Length == 0){errorMsg = "请选择要导入的Excel文件";return null;}var excelType = GetExcelFileType(file.FileName);if (excelType == null){errorMsg = "请选择正确的Excel文件";return null;}using (var stream = new MemoryStream()){file.InputStream.Position = 0;file.InputStream.CopyTo(stream);var dt = ImportExcel(stream, excelType.Value, sheetName);if (dt == null)errorMsg = "导入失败,请选择正确的Excel文件";return dt;}}

3. 本地路径读取导入

    /// <summary>/// 根据文件路径导入Excel/// </summary>/// <param name="filePath"></param>/// <param name="errorMsg">错误信息</param>/// <param name="sheetName">表名,默认取第一张</param>/// <returns>可能为null的DataTable</returns>public static DataTable Import(string filePath, ref string errorMsg, string sheetName = ""){var excelType = GetExcelFileType(filePath);if (GetExcelFileType(filePath) == null){errorMsg = "请选择正确的Excel文件";return null;}if (!File.Exists(filePath)){errorMsg = "没有找到要导入的Excel文件";return null;}DataTable dt;using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){dt = ImportExcel(stream, excelType.Value, sheetName);}if (dt == null)errorMsg = "导入失败,请选择正确的Excel文件";return dt;}

4.完整demo

附赠一个winform导入Excel的Demo。
https://github.com/yimogit/NopiExcelDemo

转载于:https://www.cnblogs.com/morang/p/nopiexcelimport.html

C#使用NOPI导入Excel相关推荐

  1. NOPI导入excel

    //创建文件流 using (FileStream fs = File.OpenRead("ReadExcel.xls")) { //创建一个workbook对象      IWo ...

  2. word录入表单数据 java 导入系统,java导入excel | 怎么把excel中的数据批量导入到word中的表格中...

    用javascript怎么实现把excel中的数据批量导入到数据库表中 这个js不能直接实现吧 我们程序用到 先读取excel内容转换成数组 然后放到页面上 再提交表单 储存 MySql如何批量添加数 ...

  3. python绘制动态图表怎么存下来_用python如何实现导入excel数据后自动生成图表?python如何实现交互式动态图表?...

    这个需求涉及的环节太多了.导入excel文件,获取数据 -- 需要xlrd模块把数据导入python 2. 设定输出图表类型 -- 需要matplot模块.根据数据复杂度,可能需要ETL,那么需要pa ...

  4. wxwidgets mysql_wxWidgets导入Excel文件详细教程

    开始写教师端程序,首先要实现导入EXCEL文件,读取数据后再添加到mysql数据库.wxWidgets提供了wxAutomationObject类,用来调用OLE automation的方法.网上找到 ...

  5. html导入excel文件,使用js-xlsx简单实现一个导入excel

    因为是老项目,所以我用的是jquery,css库是bootsharp. 需求是点击按钮实现上传excel转换成表格,代码如下 html 导入Excel 复制代码 js $(".btn-exp ...

  6. mysql导入Excel数据

    我们有时候会往数据库导入一些数据,比如说Excel数据,我们可以按照以下步骤导入: 一,将Excel数据复制在一个记事本里面,或者另存为一个txt文件. 二,在数据库里面建好一个表. 三,导入数据 l ...

  7. 导入excel文件处理流程节点的解决方案

    导入excel文件处理流程节点的解决方案 参考文章: (1)导入excel文件处理流程节点的解决方案 (2)https://www.cnblogs.com/webreport/archive/2012 ...

  8. Java的poi技术读取和导入Excel

    2019独角兽企业重金招聘Python工程师标准>>> 项目结构: 用到的Excel文件: XlsMain .java 类 //该类有main方法,主要负责运行程序,同时该类中也包含 ...

  9. 在VS2005中 GridView导入Excel的两点小技巧-附源码

    VS2005中 GridView导入Excel的导入需要注意的几点 最近带的项目遇到GridView导入Excel问题,总结出几点: 1.如果出现下面的错误提示可用重载VerifyRenderingI ...

  10. pb更新oracle表格,PB自定义retrieve刷新函数、PB导入excel表、打印

    2013年12月30日 //定义一个打印工作 long job //打开打印设置 job = PrintOpen("一份数据文档") //指定打印数据窗口 PrintDataWin ...

最新文章

  1. ITK VTK CTK QT 跨平台联合开发之 一
  2. Siamese Network (应用篇1) :孪生网络特征用于图像匹配 ICPR2016
  3. python remove函数_python中remove函数的用法是什么?
  4. 新浪微博:大规模离线视频处理系统的架构设计
  5. Map 四种获取 key 和 value 值的方法,以及对 map 中的元素排序
  6. 欧几里得算法求最大公约数
  7. 怎么找到安装在Linux系统中的Windows软件的文件
  8. 回溯算法原理及其应用场景
  9. 手把手带你从0搭建一个Golang ORM框架(上)!
  10. HTTP中 referer 什么意思
  11. linux内核协议栈 TCP层数据发送之发送新数
  12. 处理各种压力(情绪、家庭)时,需要注意什么!
  13. Pandas 的使用
  14. Session.AUTO_ACKNOWLEDGE
  15. 善用思维导图来整理发散的思维
  16. 有服务器端源码和客户端源码,C# 远程控制软件源码(含服务器端和客户端源码)...
  17. 计算机操作系统 - 内存管理
  18. 内部DNS服务器搭建
  19. 服务器ibmc无法加载js文件,weUI应用之JS常用信息提示弹层的封装
  20. SCCM2012软件分发

热门文章

  1. strcmp函数的实现方式
  2. 解决Intel Management Engine Interface黄色感叹号
  3. 基于java的超市管理系统设计(含源文件)
  4. rs232读取智能电表_预付费电表高性价比型号推荐 预付费抄表系统免费安装
  5. ADS2020 Crack使用教程
  6. 百度热力图颜色说明_基于百度热力图的中国多中心城市分析|上海城市规划
  7. cmmi分为哪几个等级?
  8. 等级保护三级备案材料有哪些
  9. linux dstat,dstat 用法详解
  10. 数字图像处理知识(3)