NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。需要在NuGet下载NPOI包。
       优点:读取Excel速度较快,读取方式操作灵活性。

读取Excel

       /// <summary>/// NPOI读Excel至DataTable/// </summary>/// <param name="fileName">Excel路径</param>/// <param name="sheetName">工作表名默认读取第一个工作表</param>/// <returns></returns>public static System.Data.DataTable NPExcelToDataTable(string fileName,string sheetName=""){FileStream fs = null;NPOI.SS.UserModel.IWorkbook workbook = null;NPOI.SS.UserModel.ISheet sheet = null;System.Data.DataTable dt = new System.Data.DataTable();try{fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);if (fileName.IndexOf(".xlsx") > 0) // 2007版本workbook = new NPOI.XSSF.UserModel.XSSFWorkbook(fs);else if (fileName.IndexOf(".xls") > 0) // 97-2003版本workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(fs);//workbook = NPOI.SS.UserModel.WorkbookFactory.Create(fs);if (sheetName != "")                              //是否有传入表名{sheet = workbook.GetSheet(sheetName);}else{sheet = workbook.GetSheetAt(0);    //读取第一个sheet}int startRow = 0;   //开始读取行数if (sheet == null)throw new Exception("未找到工作表");dt.TableName = sheet.SheetName;NPOI.SS.UserModel.IRow firstRow = sheet.GetRow(startRow);     //第一行 int cellCount = firstRow.LastCellNum;     //一行最后一个cell的编号 即总的列数for (int i = firstRow.FirstCellNum; i < cellCount; ++i){NPOI.SS.UserModel.ICell cell = firstRow.GetCell(i);if (cell != null){string cellValue = cell.StringCellValue;if (cellValue != null){if (dt.Columns.IndexOf(cellValue) > 0)              //是否有重复列名{System.Data.DataColumn column = new System.Data.DataColumn(Convert.ToString("重复列名" + cellValue + i));dt.Columns.Add(column);}else{System.Data.DataColumn column = new System.Data.DataColumn(cellValue);dt.Columns.Add(column);}}}}startRow = startRow + 1;int rowCount = sheet.LastRowNum;      //总行数 //填充行for (int i = startRow; i <= rowCount; ++i){NPOI.SS.UserModel.IRow row = sheet.GetRow(i);if (row == null) continue; //没有数据的行默认是nullSystem.Data.DataRow dataRow = dt.NewRow();for (int j = row.FirstCellNum; j < cellCount; ++j){NPOI.SS.UserModel.ICell cell = row.GetCell(j);if (cell != null)        //同理,没有数据的单元格都默认是null{if (row.GetCell(j).CellType == NPOI.SS.UserModel.CellType.FORMULA)   //是否为公式{try{dataRow[j] = cell.StringCellValue;                              }catch{if (NPOI.SS.UserModel.DateUtil.IsCellDateFormatted(cell))   //是否是日期{dataRow[j] = cell.DateCellValue;}else { dataRow[j] = cell.NumericCellValue; }}}else { dataRow[j] = row.GetCell(j).ToString(); }}}dt.Rows.Add(dataRow);}fs.Close();return dt;}catch (Exception ex){if (fs != null){fs.Close();}throw new Exception(ex.Message);}}

测试读取1000*23Excel数据耗时2.5秒左右

写入Excel

在Office2007版使用AutoSizeColumn(int列号)时会报错。就用了NPOI自身自带为列宽指定宽度函数SetColumnWidth(int 列号,int宽度)设置了固定宽度。也可以遍历一下每一列的文字,求出文字的宽度,算出这一列的最大值,重新设置本列的宽度即可,跟自适应列宽的效果是一样的。

       /// <summary>/// NPOI将datatable写入Excel/// </summary>/// <param name="data">DataTable</param>/// <param name="fileName">路径</param>/// <param name="isColumnWritten">是否写入列名</param>public static void NPDataTableToExcel(System.Data.DataTable data, string fileName, bool isColumnWritten){NPOI.SS.UserModel.IWorkbook workbook = null;NPOI.SS.UserModel.ISheet sheet = null;FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);if (fileName.IndexOf(".xlsx") > 0) // 2007版本workbook = new NPOI.XSSF.UserModel.XSSFWorkbook();else if (fileName.IndexOf(".xls") > 0) // 2003版本workbook = new NPOI.HSSF.UserModel.HSSFWorkbook();int rowIndex = 0;     //行号try{sheet = workbook.CreateSheet(data.TableName);if (isColumnWritten == true) //写入DataTable的列名{NPOI.SS.UserModel.IRow row = sheet.CreateRow(rowIndex);#region 设置样式row.HeightInPoints = 25;  //行高NPOI.SS.UserModel.ICellStyle headStyle = workbook.CreateCellStyle();        //创建样式对象 headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;                 //水平居中headStyle.FillForegroundColor = new NPOI.HSSF.Util.HSSFColor.GREY_25_PERCENT().GetIndex();  //具体数字代表的颜色看NPOI颜色对照表,全部在HSSFColor下面headStyle.FillPattern = NPOI.SS.UserModel.FillPatternType.SOLID_FOREGROUND;  //前景色headStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.THIN;     //单元格边框类型headStyle.BottomBorderColor = new NPOI.HSSF.Util.HSSFColor.BLUE().GetIndex();  //单元格边框颜色NPOI.SS.UserModel.IFont font = workbook.CreateFont();                    //创建一个字体样式对象font.FontHeightInPoints = 12;   //字体大小font.IsItalic = false;      //斜体//font.Boldweight = short.MaxValue;   //字体加粗font.Color = new NPOI.HSSF.Util.HSSFColor.BLACK().GetIndex();//颜色参考NPOI的颜色对照表(替换掉PINK())headStyle.SetFont(font);   //将字体样式赋给样式对象#endregion for (int j = 0; j < data.Columns.Count; ++j){row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);row.GetCell(j).CellStyle = headStyle;}rowIndex++;}// handling value.            for (int i = 0; i < data.Rows.Count; ++i){NPOI.SS.UserModel.IRow row = sheet.CreateRow(rowIndex);for (int j = 0; j < data.Columns.Count; ++j){string a = data.Rows[i][j].ToString();row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());}rowIndex++;}for (int cl = 0; cl < data.Columns.Count; cl++){//sheet.AutoSizeColumn(cl);               //自适应列宽,会报错sheet.SetColumnWidth(cl, 13 * 256);  //列宽为13 (注意的是列的宽度为 列宽*256)}//CellRangeAddress四个参数为:起始行,结束行,起始列,结束列,单元格合并后,样式以左上角的单元格为准//sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 10));    //合并单元格workbook.Write(fs);                       //向打开的这个文件中写入数据 }catch (Exception ex){throw new Exception(ex.Message);}finally{if (fs != null)fs.Close();}}

调整列宽的代码:

    //获取当前列的宽度,然后对比本列的长度,取最大值  for (int columnNum = 0; columnNum <= data.Columns.Count; columnNum++){int columnWidth = sheet.GetColumnWidth(columnNum) / 256;for (int rowNum = 0; rowNum <= sheet.LastRowNum; rowNum++){NPOI.SS.UserModel.IRow currentRow;//当前行未被使用过  if (sheet.GetRow(rowNum) == null){currentRow = sheet.CreateRow(rowNum);}else{currentRow = sheet.GetRow(rowNum);}if (currentRow.GetCell(columnNum) != null){NPOI.SS.UserModel.ICell currentCell = currentRow.GetCell(columnNum);int length = Encoding.Default.GetBytes(currentCell.ToString()).Length;if (columnWidth < length){columnWidth = length;}}}sheet.SetColumnWidth(columnNum, columnWidth * 256);}

测试写入24000*23的数据Ofice97-2003版耗时2秒左右,Office2007版耗时1分多钟,未加上调整列宽。

C#读写Excel(NPOI)相关推荐

  1. NPOI读写Excel

    1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...

  2. c# poi写入e_C# 使用 NPOI 库读写 Excel 文件(转载)

    NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼 容xls 和 xlsx.官网提供了一份Examples,给出了 ...

  3. 一文搞定C#关于NPOI类库的使用读写Excel以及io流文件的写出

    一文搞定C#关于NPOI类库的使用读写Excel以及io流文件的写出 今天我们使用NPOI类库读写xlsx文件, 最终实现的效果如图所示 从太平洋官网下载相应的类库,大概4~5MB,不要从github ...

  4. C# 中 NPOI 库读写 Excel 文件的方法【摘】

    原作:淡水网志 NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Exa ...

  5. C#读写Excel的4种方案(OpenXml、NPOI、EPPlus、Spire.Office)

    在项目中需要使用C#读写Excel,每天定时将数据输出到Excel表格中.在参考了很多的方案后,找到了4个常用的方案,并提供了一些小Demo.更多功能和示例可以参考官方文档. 1.Microsoft. ...

  6. NPOI读写Excel,Word,PPT文件

    文章来自:C# 使用 NPOI 库读写 Excel 文件 - 腾讯云开发者社区-腾讯云 NPOIhttps://cloud.tencent.com/developer/article/1343214N ...

  7. .NET读写Excel工具Spire.Xls使用(1)入门介绍

    原文:[原创].NET读写Excel工具Spire.Xls使用(1)入门介绍 在.NET平台,操作Excel文件是一个非常常用的需求,目前比较常规的方法有以下几种: 1.Office Com组件的方式 ...

  8. excel python插件_利用 Python 插件 xlwings 读写 Excel

    Python 通过 xlwings 读取 Excel 数据 去年底公司让我做设备管理,多次委婉拒绝,最终还是做了.其实我比较喜欢技术.做管理后发现现场没有停机率统计,而原始数据有,每次要自己在Exce ...

  9. CSharp中的开源读写Excel组件介绍

    1. 读写Excel的开源组件 NPOI NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. NPOI是一个开源的C ...

最新文章

  1. 终于把论文Check完了
  2. C#调用JAVA接口WSSE方式用WebClient方式
  3. Linux小工具(4)之apt软件管理
  4. glue与clue的意思
  5. 【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题
  6. 实现前端页面跳转的几种方式
  7. ubuntu中bash,sh,./,bash区别
  8. BootStrap布局案例
  9. geekbench 3 android,Geekbench列表声称Xperia 3将包含12GB RAM并运行Android 10
  10. NYOJ 个人刷题题解
  11. c# 多线程单例模式_线程安全C#单例模式
  12. 前端学习 JavaScript基础
  13. 老男孩python全栈3期_Python/Python3视频教程2017老男孩Python全栈工程师3期基础Python3.5...
  14. Alpha阶段测试报告
  15. {转载}——jvm verbose 参数详解
  16. [转]在低调中修炼自己
  17. Paypal学习 3 -- 接受信用卡直接付款 (DoDirectPayment)
  18. mysql的增量备份与全量备份
  19. 一文读懂Uniswap V2的改进与创新
  20. springboot线程中获取bean

热门文章

  1. JAVA1.6 API中文版
  2. 新手购买阿里云服务器的方法教程及步骤流程
  3. 开发一个社区网站,只要20分钟?
  4. idea卡顿且报错:UI was frozen for xxxxx ms问题解决
  5. 力扣刷题——最长公共前缀
  6. 计算机动画与游戏考研,上海交通大学电子信息与电气工程学院专业学位课程内容介绍《计算机动画建模与渲染》...
  7. 关于GPS导航地图免费升级空间搬迁新地址的通知
  8. 以后就在这里写学习心得了
  9. SPH0644LM4H-1 CORNELL MIC MULTIMODE DGT BOT PT
  10. T3220,T1207,T1391,T1163