NPOI读取

本文介绍了一种使用C#读取Excel文件的方法,通过HSSFWorkbook对象处理文件流,获取Excel表格的第一个工作表,并读取其所有行的内容。
#region 读取Excel文件
        /// <summary>
        /// 读取Excel文件
        /// </summary>
        private void btnRead_Click(object sender, EventArgs e)
        {
            string strPath = txtFilePath.Text;//获得 要读取 的 excel文件 路径
            using (Stream file = File.OpenRead(strPath))//将 指定 的 文件 以流的方式读取到 file对象中
            {
                //将 文件流 对象 传入 workbook,此时,workbook 就相当于一个 Excel文件操作对象了
                HSSFWorkbook workbook = new HSSFWorkbook(file);
                //获得 Excel中 第一个工作表的 名字
                //MessageBox.Show(workbook.GetSheetName(0));
                //获得 Excel 中 第一个 表
                HSSFSheet sheet = workbook.GetSheetAt(0);
                //获得总行数
                int rowNum = sheet.LastRowNum;
                //保存整个表的数据
                StringBuilder sbExcelData = new StringBuilder();
                for (int j = 0; j < rowNum; j++)
                {
                    //每行中所有的列的值
                    string strFirstRow = string.Empty;
                    //获得 当前循环的 行
                    HSSFRow dr = sheet.GetRow(j);
                    for (int i = 0; i < dr.LastCellNum; i++)
                    {
                        strFirstRow += dr.GetCell(i).StringCellValue + ",";
                        //MessageBox.Show(sheet.GetRow(0).GetCell(1).StringCellValue); //.LastCellNum
                    }
                    sbExcelData.Append(strFirstRow+"\r\n");
                }
                MessageBox.Show(sbExcelData.ToString());
            }
        } 
        #endregion
<think> 首先,用户的问题是:“我想查找使用C#语言结合NPOI读取Excel文件的方法”。用户指定了要使用C#和NPOI库来读取Excel文件。 现在,我查看系统提供的引用内容。这些引用是关于C#使用NPOI库操作Excel文件的教程和代码示例: - 引用[1]:提到了使用NPOI库写入Excel文件,但用户要的是读取方法。 - 引用[2]:讨论了创建Excel文件、合并单元格、设置格式等,但焦点是写入和格式设置。 - 引用[3]:这是一个详细的代码示例,展示如何读取Excel文件。它包括了打开文件、读取工作表、行和单元格的代码。 - 引用[4]:描述了使用NPOI读取Excel文件的基本方法,包括获取工作表、遍历行和列。 用户的问题是专门关于读取Excel文件的,所以引用[3]和[4]是最相关的。 系统指令要求: - 所有行内数学表达式用$...$格式(但这里不涉及数学,所以可能不需要)。 - 独立公式用$$...$$格式(同样,不适用)。 - LaTeX语法正确(不适用)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 用户可见层的指令是:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 我的回答应该包括: 1. **结构化回答**:逐步解释如何使用C#和NPOI读取Excel文件。 2. **参考引用**:在末尾添加引用标识。 3. **生成相关问题**:在最后添加相关问题部分。 从引用[3]中提取关键代码: - 打开文件:`using (fs = File.OpenRead(path))` - 创建工作簿:`wk = new XSSFWorkbook(fs);`(对于.xlsx文件)或`new HSSFWorkbook(fs);`(对于.xls文件) - 遍历工作表:`for (int i = 0; i < wk.NumberOfSheets; i++)` - 获取工作表:`ISheet sheet = wk.GetSheetAt(i);` - 遍历行:`for (int j = 0; j <= sheet.LastRowNum; j++)` - 获取行:`IRow row = sheet.GetRow(j);` - 如果行不为空,遍历单元格:`for (int k = 0; k <= row.LastCellNum; k++)` - 获取单元格:`ICell cell = row.GetCell(k);` - 读取单元格内容:`cell.ToString()` 或其他方法如`cell.NumericCellValue`, `cell.StringCellValue` 等。 引用[4]也强调了类似步骤:获取工作表、遍历行和列、获取单元格内容。 所以,回答结构: 1. **介绍**:简要说明C#使用NPOI读取Excel文件的步骤。 2. **步骤详解**: - 添加NPOI库引用。 - 打开Excel文件。 - 创建工作簿对象。 - 遍历工作表。 - 遍历行。 - 遍历单元格并读取数据。 3. **代码示例**:提供一个简单的代码示例,基于引用[3]和[4]。 4. **注意事项**:如处理空单元格、不同数据类型。 5. **结尾**:添加引用。 6. **生成相关问题**:在最后添加相关问题部分。 确保使用中文。 最终回答框架: - 开头:直接回答问题。 - 主体:分步解释。 - 代码块:使用```csharp```高亮代码。 - 结尾引用:自然地添加[^1]等。 - 相关问题:使用§§相关问题§§格式。 引用标识:引用来自系统指令,所以引用[3]对应[^3],引用[4]对应[^4]。 </think>### C# 使用 NPOI读取 Excel 文件的方法 以下是使用 C# 语言结合 NPOI读取 Excel 文件的详细步骤。NPOI 是一个强大的开源库,支持读取和写入 Excel 文件(包括 .xls 和 .xlsx 格式)。我将从基础设置到核心代码逐步解释,确保方法真实可靠。整个过程包括:添加 NPOI 库引用、打开文件、遍历工作表、行和单元格,并处理常见问题。 #### 步骤详解 1. **添加 NPOI 库引用** 首先,在 C# 项目中安装 NPOI NuGet 包。在 Visual Studio 的 NuGet 包管理器中搜索并安装以下包: - `NPOI`(核心库) - `NPOI.OOXML`(用于 .xlsx 文件) - `NPOI.HSSF`(用于 .xls 文件) 2. **打开 Excel 文件** 使用 `File.OpenRead` 方法打开文件路径,并确保处理文件锁定异常(如文件被其他程序占用时)。 3. **创建工作簿对象** 根据文件类型(.xls 或 .xlsx)创建对应的工作簿实例: - `.xlsx` 文件:使用 `XSSFWorkbook` - `.xls` 文件:使用 `HSSFWorkbook` 4. **遍历工作表** 通过 `NumberOfSheets` 属性获取工作表总数,然后使用 `GetSheetAt(index)` 方法访问每个工作表。 5. **遍历行和单元格** - 对于每个工作表,使用 `LastRowNum` 获取总行数。 - 对于每一行,使用 `GetRow(rowIndex)` 获取行对象。 - 对于每个单元格,使用 `GetCell(cellIndex)` 获取单元格对象,并读取内容(如 `cell.ToString()` 或类型特定方法)。 6. **处理单元格数据类型** 单元格内容需要根据数据类型转换: - 字符串:`cell.StringCellValue` - 数字:`cell.NumericCellValue` - 布尔值:`cell.BooleanCellValue` - 日期:`cell.DateCellValue` - 空单元格:需检查 `cell == null` 或 `cell.CellType == CellType.Blank` #### 代码示例 以下是一个完整的 C# 示例代码,基于标准实践,展示如何读取 Excel 文件中的所有数据并输出到控制台。[^3][^4] ```csharp using System; using System.IO; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; // 用于 .xlsx using NPOI.HSSF.UserModel; // 用于 .xls public class ExcelReader { public static void ReadExcelFile(string filePath) { try { // 打开文件流 using (FileStream fs = File.OpenRead(filePath)) { IWorkbook workbook; // 根据文件扩展名创建工作簿 if (filePath.EndsWith(".xlsx")) { workbook = new XSSFWorkbook(fs); // .xlsx 格式 } else if (filePath.EndsWith(".xls")) { workbook = new HSSFWorkbook(fs); // .xls 格式 } else { throw new Exception("不支持的文件格式,仅支持 .xls 或 .xlsx"); } // 遍历所有工作表 for (int sheetIndex = 0; sheetIndex < workbook.NumberOfSheets; sheetIndex++) { ISheet sheet = workbook.GetSheetAt(sheetIndex); Console.WriteLine($"工作表名称: {sheet.SheetName}"); // 遍历所有行(从第一行开始) 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 = "(空)"; // 默认空值处理 if (cell != null) { // 根据单元格类型读取值 switch (cell.CellType) { case CellType.String: cellValue = cell.StringCellValue; break; case CellType.Numeric: if (DateUtil.IsCellDateFormatted(cell)) { cellValue = cell.DateCellValue.ToString(); } else { cellValue = cell.NumericCellValue.ToString(); } break; case CellType.Boolean: cellValue = cell.BooleanCellValue.ToString(); break; case CellType.Formula: cellValue = "公式: " + cell.CellFormula; break; default: cellValue = cell.ToString(); break; } } Console.WriteLine($"行 {rowIndex + 1}, 列 {cellIndex + 1}: {cellValue}"); } } } } } catch (Exception ex) { Console.WriteLine($"错误: {ex.Message}"); // 处理异常,如文件被占用或路径无效[^3] } } } // 调用示例 // ExcelReader.ReadExcelFile(@"C:\path\to\your\file.xlsx"); ``` #### 注意事项 - **性能优化**:对于大型文件,避免频繁的 `ToString()` 调用,使用类型特定方法提升效率。 - **空值处理**:始终检查 `row` 和 `cell` 是否为 `null` 以防止空引用异常。 - **文件锁定**:使用 `using` 语句确保文件流正确关闭,避免“文件被其他应用打开”错误。[^3] - **数据类型转换**:日期和数字类型需特殊处理,NPOI 的 `DateUtil.IsCellDateFormatted` 可辅助日期转换。 此方法在真实项目中广泛应用,能高效读取 Excel 数据。如果您有特定需求(如读取特定单元格或处理公式),可以参考 NPOI 官方文档扩展功能。[^2][^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值