时间:2022-12-01 10:56:21 | 栏目:.NET代码 | 点击:次
NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。
NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。
1、如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机。
2、Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123。
3、导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错。
4、Excel会根据Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成类似1.42702E+17格式,日期列变成包含日期和数字的。
1、您可以完全免费使用该框架
2、包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等)
3、专业的技术支持服务(24*7全天候) (非免费)
4、支持处理的文件格式包括xls, xlsx, docx.
5、采用面向接口的设计架构( 可以查看 NPOI.SS 的命名空间)
6、同时支持文件的导入和导出
7、基于.net 2.0 也支持xlsx 和 docx格式(当然也支持.net 4.0)
8、来自全世界大量成功且真实的测试Cases
9、大量的实例代码
11、你不需要在服务器上安装微软的Office,可以避免版权问题。
12、使用起来比Office PIA的API更加方便,更人性化。
13、你不用去花大力气维护NPOI,NPOI Team会不断更新、改善NPOI,绝对省成本。
14、不仅仅对与Excel可以进行操作,对于doc、ppt文件也可以做对应的操作
NPOI之所以强大,并不是因为它支持导出Excel,而是因为它支持导入Excel,并能“理解”OLE2文档结构,这也是其他一些Excel读写库比较弱的方面。通常,读入并理解结构远比导出来得复杂,因为导入你必须假设一切情况都是可能的,而生成你只要保证满足你自己需求就可以了,如果把导入需求和生成需求比做两个集合,那么生成需求通常都是导入需求的子集,这一规律不仅体现在Excel读写库中,也体现在pdf读写库中,目前市面上大部分的pdf库仅支持生成,不支持导入。
/// <summary> /// 基于NPOI操作Excel /// </summary> public void ExportExcel() { string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Excel\\"; string fileName = filePath + "TestExcel_" + DateTime.UtcNow.ToString("yyyyMMddHHmmss") + ".xlsx"; if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { XSSFWorkbook workbook = new XSSFWorkbook(); //创建单元格样式 ICellStyle cellStyle = workbook.CreateCellStyle(); //设置为文本格式,也可以为 text,即 dataFormat.GetFormat("text"); cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; //下边框线 cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; //左边框线 cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; //右边框线 cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; //上边框线 //设置页签名 ISheet sheet = workbook.CreateSheet("导出号段"); //设置列宽 sheet.SetColumnWidth(4, 10 * 500);//第五列 BTMAC sheet.SetColumnWidth(5, 10 * 500);//第六列 WifiMAC1 sheet.SetColumnWidth(6, 10 * 500);//第七列 WifiMAC2 sheet.SetColumnWidth(7, 10 * 500);//第八列 HARD_CODE sheet.SetColumnWidth(8, 10 * 500);//第九列 QR_CODE //Excel表头栏位 string[] excelHeader = new string[] { "IMEI1", "IMEI2", "MEID", "MSN编号", "蓝牙MAC地址", "无线MAC地址1", "无线MAC地址2", "HARD_CODE", "QR_CODE", "TOKEN", "KEYMASTER" }; //设置表头字段 IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < excelHeader.Length; i++) { headerRow.CreateCell(i).SetCellValue(excelHeader[i]); } //展开的数量 int count = int.Parse(LoginInfo.QTY); //十六进制转为十进制 Int64 StarthardCode = Int64.Parse(LoginInfo.HardCode, NumberStyles.HexNumber); Int64 StartbtMAC = Int64.Parse(LoginInfo.BTMAC, NumberStyles.HexNumber); Int64 StartWifiMAC1 = Int64.Parse(LoginInfo.WiFiMAC1, NumberStyles.HexNumber); Int64 StartWifiMAC2 = 0; if (LoginInfo.IsEnableWiFiMAC2) { StartWifiMAC2 = Int64.Parse(LoginInfo.WiFiMAC2, NumberStyles.HexNumber); } //填充Excel for (int i = 0; i < count; i++) { IRow row = sheet.CreateRow(i + 1); //BTMAC Int64 current_btMAC = StartbtMAC + i; //转回十六进制,大写 //string strCurrent_btMAC = Convert.ToString(current_btMAC, 16).ToUpper(); string strCurrent_btMAC = current_btMAC.ToString("X").ToUpper(); row.CreateCell(4).SetCellValue(strCurrent_btMAC); //WifiMAC1 Int64 current_WifiMAC1 = StartWifiMAC1 + i; //转回十六进制,大写 string strCurrent_WifiMAC1 = current_WifiMAC1.ToString("X").ToUpper(); row.CreateCell(5).SetCellValue(strCurrent_WifiMAC1); //WifiMAC2 if (LoginInfo.IsEnableWiFiMAC2) { Int64 current_WifiMAC2 = StartWifiMAC2 + i; //转回十六进制,大写 string strCurrent_WifiMAC2 = current_WifiMAC2.ToString("X").ToUpper(); row.CreateCell(6).SetCellValue(strCurrent_WifiMAC2); } //HardCode Int64 current_HardCode = StarthardCode + i; //转回十六进制,小写 string strCurrent_HardCode = current_HardCode.ToString("X").ToLower(); row.CreateCell(7).SetCellValue(strCurrent_HardCode); } workbook.Write(fs); //写入到Excel中 } }