简介:本文全面解析NPOI库的核心功能与使用技巧,涵盖Excel/Word文件读写、样式设置、数据操作等场景,提供从基础到进阶的完整开发指南。
NPOI是Apache POI的.NET移植版本,专为解决.NET平台下Office文档(Excel/Word/PowerPoint)无依赖操作问题而设计。其核心优势在于:
典型应用场景包括:
通过NuGet安装是最佳实践:
Install-Package NPOIInstall-Package NPOI.OOXML # 如需支持.xlsx格式
版本选择建议:
// 创建新工作簿IWorkbook workbook = new XSSFWorkbook(); // .xlsx格式// IWorkbook workbook = new HSSFWorkbook(); // .xls格式// 添加工作表ISheet sheet = workbook.CreateSheet("销售数据");// 创建单元格并赋值IRow row = sheet.CreateRow(0);row.CreateCell(0).SetCellValue("产品名称");row.CreateCell(1).SetCellValue("销售额");// 保存文件using (FileStream fs = new FileStream("销售报表.xlsx", FileMode.Create)){workbook.Write(fs);}
// 创建内存工作簿var workbook = new XSSFWorkbook();var sheet = workbook.CreateSheet("大数据");// 批量创建10万行数据for (int i = 0; i < 100000; i++){var row = sheet.CreateRow(i);row.CreateCell(0).SetCellValue($"产品{i}");row.CreateCell(1).SetCellValue(i * 100);}// 使用临时文件减少内存占用using (var tempStream = new MemoryStream()){workbook.Write(tempStream);File.WriteAllBytes("大数据.xlsx", tempStream.ToArray());}
// 高效读取大文件using (var fs = new FileStream("大数据.xlsx", FileMode.Open)){var workbook = new XSSFWorkbook(fs);var sheet = workbook.GetSheetAt(0);for (int i = 0; i <= sheet.LastRowNum; i++){var row = sheet.GetRow(i);if (row != null){var product = row.GetCell(0)?.ToString();var amount = row.GetCell(1)?.NumericCellValue ?? 0;// 处理数据...}}}
// 创建标题样式ICellStyle headerStyle = workbook.CreateCellStyle();IFont headerFont = workbook.CreateFont();headerFont.FontName = "微软雅黑";headerFont.FontHeightInPoints = 14;headerFont.Boldweight = (short)FontBoldWeight.Bold;headerStyle.SetFont(headerFont);headerStyle.FillForegroundColor = IndexedColors.Grey25Percent.Index;headerStyle.FillPattern = FillPattern.SolidForeground;// 应用样式row.CreateCell(0).CellStyle = headerStyle;
ICellStyle numberStyle = workbook.CreateCellStyle();numberStyle.DataFormat = workbook.CreateDataFormat().GetFormat("#,##0.00");var cell = row.CreateCell(1);cell.SetCellValue(1234.5678);cell.CellStyle = numberStyle; // 显示为1,234.57
// 创建文档XWPFDocument doc = new XWPFDocument();// 添加段落XWPFParagraph para = doc.CreateParagraph();XWPFRun run = para.CreateRun();run.SetText("年度销售报告");run.Bold = true;run.FontSize = 20;// 添加表格XWPFTable table = doc.CreateTable(3, 2);table.GetRow(0).GetCell(0).SetText("季度");table.GetRow(0).GetCell(1).SetText("销售额");table.GetRow(1).GetCell(0).SetText("Q1");table.GetRow(1).GetCell(1).SetText("120万");// 保存文档using (FileStream fs = new FileStream("报告.docx", FileMode.Create)){doc.Write(fs);}
// 合并多个Word文档var mergedDoc = new XWPFDocument();var para = mergedDoc.CreateParagraph();var run = para.CreateRun();run.SetText("合并文档标题");foreach (var filePath in Directory.GetFiles("docs", "*.docx")){using (var fs = new FileStream(filePath, FileMode.Open)){var doc = new XWPFDocument(fs);foreach (var bodyElement in doc.BodyElements){if (bodyElement is XWPFParagraph paragraph){var newPara = mergedDoc.CreateParagraph();newPara.CreateRun().SetText(paragraph.GetText());}// 其他元素处理...}}}
// 读取模板文档using (var fs = new FileStream("模板.docx", FileMode.Open)){var doc = new XWPFDocument(fs);// 替换文本foreach (var para in doc.Paragraphs){foreach (var run in para.Runs){string text = run.GetText(0);if (text != null && text.Contains("${日期}")){run.SetText(text.Replace("${日期}", DateTime.Now.ToString("yyyy-MM-dd")), 0);}}}// 保存结果using (var outFs = new FileStream("结果.docx", FileMode.Create)){doc.Write(outFs);}}
SXSSFWorkbook(流式API)替代XSSFWorkbookfor (int i = 0; i < 1000000; i++)
{
var row = sheet.CreateRow(i);
row.CreateCell(0).SetCellValue($”记录{i}”);
}
// 自动清理临时文件
workbook.Dispose();
## 4.2 异常处理机制```csharptry{// NPOI操作代码...}catch (EncryptedDocumentException ex){// 处理加密文件Console.WriteLine($"文件加密错误: {ex.Message}");}catch (IOException ex) when (ex.Message.Contains("disk full")){// 磁盘空间不足处理LogHelper.WriteError("存储空间不足", ex);}catch (Exception ex){// 通用异常处理ErrorReporter.Report(ex);}
// 使用Parallel处理多sheetvar workbook = new XSSFWorkbook();var sheets = new[] { "销售", "库存", "财务" };Parallel.ForEach(sheets, sheetName =>{var sheet = workbook.CreateSheet(sheetName);// 各sheet独立处理逻辑...});// 注意:XSSFWorkbook本身非线程安全,需确保操作隔离
解决方案:
XSSFWorkbook而非HSSFWorkbook处理.xlsx
var style = workbook.CreateCellStyle();var font = workbook.CreateFont();font.FontName = "微软雅黑"; // 或"SimSun"style.SetFont(font);
// 强制公式重新计算var workbook = new XSSFWorkbook();// ...填充数据...// 计算所有公式var evaluator = workbook.GetCreationHelper().CreateFormulaEvaluator();foreach (var sheet in workbook){for (int i = 0; i <= sheet.LastRowNum; i++){var row = sheet.GetRow(i);if (row != null){for (int j = 0; j < row.LastCellNum; j++){var cell = row.GetCell(j);if (cell != null && cell.CellType == CellType.Formula){evaluator.EvaluateFormulaCell(cell);}}}}}
优化方案:
SXSSFWorkbook设置合理的行窗口(如100-500)
const int batchSize = 50000;for (int i = 0; i < totalRecords; i += batchSize){var batch = GetDataBatch(i, batchSize);// 处理当前批次...}
本手册系统阐述了NPOI在.NET环境下的核心应用技术,从基础文件操作到高级性能优化均提供了可落地的解决方案。建议开发者在实际项目中: