C#读写Excel(NPOI)
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)相关推荐
- NPOI读写Excel
1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...
- c# poi写入e_C# 使用 NPOI 库读写 Excel 文件(转载)
NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼 容xls 和 xlsx.官网提供了一份Examples,给出了 ...
- 一文搞定C#关于NPOI类库的使用读写Excel以及io流文件的写出
一文搞定C#关于NPOI类库的使用读写Excel以及io流文件的写出 今天我们使用NPOI类库读写xlsx文件, 最终实现的效果如图所示 从太平洋官网下载相应的类库,大概4~5MB,不要从github ...
- C# 中 NPOI 库读写 Excel 文件的方法【摘】
原作:淡水网志 NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Exa ...
- C#读写Excel的4种方案(OpenXml、NPOI、EPPlus、Spire.Office)
在项目中需要使用C#读写Excel,每天定时将数据输出到Excel表格中.在参考了很多的方案后,找到了4个常用的方案,并提供了一些小Demo.更多功能和示例可以参考官方文档. 1.Microsoft. ...
- NPOI读写Excel,Word,PPT文件
文章来自:C# 使用 NPOI 库读写 Excel 文件 - 腾讯云开发者社区-腾讯云 NPOIhttps://cloud.tencent.com/developer/article/1343214N ...
- .NET读写Excel工具Spire.Xls使用(1)入门介绍
原文:[原创].NET读写Excel工具Spire.Xls使用(1)入门介绍 在.NET平台,操作Excel文件是一个非常常用的需求,目前比较常规的方法有以下几种: 1.Office Com组件的方式 ...
- excel python插件_利用 Python 插件 xlwings 读写 Excel
Python 通过 xlwings 读取 Excel 数据 去年底公司让我做设备管理,多次委婉拒绝,最终还是做了.其实我比较喜欢技术.做管理后发现现场没有停机率统计,而原始数据有,每次要自己在Exce ...
- CSharp中的开源读写Excel组件介绍
1. 读写Excel的开源组件 NPOI NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. NPOI是一个开源的C ...
最新文章
- 终于把论文Check完了
- C#调用JAVA接口WSSE方式用WebClient方式
- Linux小工具(4)之apt软件管理
- glue与clue的意思
- 【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题
- 实现前端页面跳转的几种方式
- ubuntu中bash,sh,./,bash区别
- BootStrap布局案例
- geekbench 3 android,Geekbench列表声称Xperia 3将包含12GB RAM并运行Android 10
- NYOJ 个人刷题题解
- c# 多线程单例模式_线程安全C#单例模式
- 前端学习 JavaScript基础
- 老男孩python全栈3期_Python/Python3视频教程2017老男孩Python全栈工程师3期基础Python3.5...
- Alpha阶段测试报告
- {转载}——jvm verbose 参数详解
- [转]在低调中修炼自己
- Paypal学习 3 -- 接受信用卡直接付款 (DoDirectPayment)
- mysql的增量备份与全量备份
- 一文读懂Uniswap V2的改进与创新
- springboot线程中获取bean
热门文章
- JAVA1.6 API中文版
- 新手购买阿里云服务器的方法教程及步骤流程
- 开发一个社区网站,只要20分钟?
- idea卡顿且报错:UI was frozen for xxxxx ms问题解决
- 力扣刷题——最长公共前缀
- 计算机动画与游戏考研,上海交通大学电子信息与电气工程学院专业学位课程内容介绍《计算机动画建模与渲染》...
- 关于GPS导航地图免费升级空间搬迁新地址的通知
- 以后就在这里写学习心得了
- SPH0644LM4H-1 CORNELL MIC MULTIMODE DGT BOT PT
- T3220,T1207,T1391,T1163