C#使用NPOI读取excel

visual studio使用NuGet安装最新的NPOI(当前为2.3.0)

当前debug目录 AppDomain.CurrentDomain.BaseDirectory


NPOI读写Excel

http://www.cnblogs.com/luxiaoxun/p/3374992.html



NPOI 中的公式列的值的獲取

https://hk.saowen.com/a/e2a742a369cb1ac6722fe417e17cd419ff40342a436df6c700198dbdbeac94d5

公式格类型的判断,下面耗时较长,不要放在for循环里

XSSFFormulaEvaluator evalor0 = null;
HSSFFormulaEvaluator evalor1 = null;
if (fileName.IndexOf(".xlsx") > 0 || fileName.IndexOf(".xlsm") > 0) // 2007版本 
   evalor0 = new XSSFFormulaEvaluator(workbook);
else
   evalor1 = new HSSFFormulaEvaluator(workbook);


<think>我们被要求使用C#中的NPOI库来读取Excel文件。根据提供的引用,我们可以总结出以下步骤: 1. 根据文件扩展名(.xls或.xlsx)选择使用HSSFWorkbook(用于.xls)或XSSFWorkbook(用于.xlsx)来创建工作簿对象。 2. 使用FileStream打开文件流,然后传递给相应的Workbook构造函数。 3. 获取工作表(sheet),例如第一个工作表:GetSheetAt(0)。 4. 遍历工作表的每一行(Row),在每一行中遍历每一个单元格(Cell),并获取单元格的值。 但是,引用[2]提到,使用WorkbookFactory.create可以更简单地处理两种格式,而不需要显式判断扩展名。同时,引用[2]也提到了内存问题,当使用FileInputStream(在C#中是FileStream)时,可能会占用更多内存,而直接使用文件路径则可能更高效(避免将整个文件加载到内存流?)。实际上,NPOI也提供了WorkbookFactory类,可以自动根据文件类型创建合适的Workbook对象。 因此,我们可以提供两种方法: 方法1:根据扩展名分别使用HSSFWorkbook或XSSFWorkbook。 方法2:使用WorkbookFactory.Create(更简洁,推荐)。 另外,注意在读取单元格时,需要处理不同类型的单元格(如字符串、数字、日期等),直接调用ToString()可能不会返回预期的结果,特别是日期格式。因此,我们需要一个辅助方法来获取单元格的字符串表示。 根据以上分析,我们给出以下代码示例: 步骤: 1. 添加NPOI的引用(通过NuGet安装NPOI)。 2. 使用using语句引入必要的命名空间:NPOI.SS.UserModel, NPOI.HSSF.UserModel, NPOI.XSSF.UserModel等。 注意:由于NPOI的WorkbookFactory在NPOI.SS.UserModel命名空间下,所以我们需要引用该命名空间。 我们写一个方法,使用WorkbookFactory来读取文件,并打印每个单元格的内容。 另外,我们也要注意内存泄漏问题,确保关闭流和释放资源。可以使用using语句来管理。 代码示例:</think>### 如何在 C#使用 NPOI 读取 Excel 文件 以下是使用 NPOI读取 Excel 文件的完整步骤和代码示例: #### 1. **安装 NPOI 包** 在 NuGet 包管理器中安装: ```bash Install-Package NPOI Install-Package NPOI.OOXML # 支持 .xlsx 格式 ``` #### 2. **基础读取代码** ```csharp using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; // .xlsx 支持 using NPOI.HSSF.UserModel; // .xls 支持 using System.IO; public void ReadExcel(string filePath) { IWorkbook workbook; // 根据扩展名创建对应工作簿 using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { if (Path.GetExtension(filePath).Equals(".xls", StringComparison.OrdinalIgnoreCase)) { workbook = new HSSFWorkbook(fs); // Excel 97-2003 } else { workbook = new XSSFWorkbook(fs); // Excel 2007+ } ISheet sheet = workbook.GetSheetAt(0); // 获取第一个工作表 // 遍历所有行 for (int rowIndex = 0; rowIndex <= sheet.LastRowNum; rowIndex++) { IRow row = sheet.GetRow(rowIndex); if (row == null) continue; // 遍历行中所有单元格 for (int cellIndex = 0; cellIndex < row.LastCellNum; cellIndex++) { ICell cell = row.GetCell(cellIndex); string cellValue = GetCellValue(cell); // 自定义值获取方法 Console.Write($"{cellValue}\t"); } Console.WriteLine(); } } // 自动释放文件流 } // 处理不同类型的单元格值 private string GetCellValue(ICell cell) { if (cell == null) return ""; switch (cell.CellType) { case CellType.String: return cell.StringCellValue; case CellType.Numeric: return DateUtil.IsCellDateFormatted(cell) ? cell.DateCellValue.ToString() : cell.NumericCellValue.ToString(); case CellType.Boolean: return cell.BooleanCellValue.ToString(); case CellType.Formula: return cell.NumericCellValue.ToString(); // 根据实际情况调整 default: return ""; } } ``` #### 3. **关键注意事项** 1. **内存优化** - 处理大文件时: ```csharp // 推荐使用 WorkbookFactory 自动判断格式 using (var fs = File.OpenRead(filePath)) { workbook = WorkbookFactory.Create(fs); // 自动检测格式 } ``` 当遇到内存溢出(`OutOfMemoryException`)时,考虑使用事件驱动解析器(如 `XSSFEventBasedParser`)[^2]。 2. **数据类型处理**: - 日期单元格需用 `DateUtil.IsCellDateFormatted()` 检测 - 公式单元格用 `cell.NumericCellValue` 获取计算结果 3. **性能优化**: ```csharp // 跳过空行提升性能 if (row == null || row.Cells.All(c => c.CellType == CellType.Blank)) continue; ``` #### 4. **扩展功能示例** **读取特定区域数据:** ```csharp // 读取 A1 到 C10 区域 for (int rowIndex = 0; rowIndex < 10; rowIndex++) { IRow row = sheet.GetRow(rowIndex); for (int colIndex = 0; colIndex < 3; colIndex++) { // ... } } ``` **获取工作表信息:** ```csharp Console.WriteLine($"工作表名称: {sheet.SheetName}"); Console.WriteLine($"总行数: {sheet.LastRowNum + 1}"); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值