ExcelDataReader读取NPOI生成的XSSFWorkbook文件仅能获取首列求助
解决NPOI生成XSSFWorkbook后ExcelDataReader仅读取首列的问题
问题描述
使用NPOI生成XSSFWorkbook格式的.xlsx文件时,ExcelDataReader只能读取首列的表头和数据(示例中仅读取到表头“111”和数据“444”)。用Excel 2019手动保存文件后,文件大小从4KB变为10KB,此时ExcelDataReader可正常读取所有列;但HSSFWorkbook(.xls格式)无此问题。
相关代码
写入代码
XSSFWorkbook EWorkbook = new XSSFWorkbook(); XSSFSheet ESheet1 = (XSSFSheet)EWorkbook.CreateSheet("Test"); XSSFRow ERow = (XSSFRow)ESheet1.CreateRow(0); XSSFCell ECell = (XSSFCell)ERow.CreateCell(0); ECell.SetCellValue("111"); ECell = (XSSFCell)ERow.CreateCell(1); ECell.SetCellValue("222"); ECell = (XSSFCell)ERow.CreateCell(2); ECell.SetCellValue("333"); ERow = (XSSFRow)ESheet1.CreateRow(1); ECell = (XSSFCell)ERow.CreateCell(0); ECell.SetCellValue("444"); ECell = (XSSFCell)ERow.CreateCell(1); ECell.SetCellValue("555"); ECell = (XSSFCell)ERow.CreateCell(2); ECell.SetCellValue("666"); using (var file2 = new FileStream(@"C:\inetpub\temp.xlsx", FileMode.Create, FileAccess.ReadWrite)) { EWorkbook.Write(file2); file2.Close(); }
读取代码
excelSpreadSheet = Excel.ExcelReaderFactory.CreateOpenXmlReader(fs);
解决方案
问题根源是NPOI默认生成的XSSFSheet未明确设置单元格范围(Dimension),ExcelDataReader依赖这个元数据识别表格的列边界,而Excel手动保存时会自动补全该信息。以下是两种可行解决方法:
方法1:手动设置Sheet的单元格范围
在创建完所有行和单元格后,通过SetDimension方法明确指定Sheet的有效单元格区域(行起始、行结束、列起始、列结束):
// 示例对应2行3列的表格,参数依次为:起始行、结束行、起始列、结束列 ESheet1.SetDimension(new CellRangeAddress(0, 1, 0, 2));
方法2:自动调整列宽
对每一列调用AutoSizeColumn,NPOI会在生成文件时自动补充列的元数据,间接让ExcelDataReader识别到所有列:
// 遍历所有需要识别的列,示例为0-2列 for (int colIndex = 0; colIndex < 3; colIndex++) { ESheet1.AutoSizeColumn(colIndex); }
修改后的完整写入代码(以方法1为例)
XSSFWorkbook EWorkbook = new XSSFWorkbook(); XSSFSheet ESheet1 = (XSSFSheet)EWorkbook.CreateSheet("Test"); XSSFRow ERow = (XSSFRow)ESheet1.CreateRow(0); XSSFCell ECell = (XSSFCell)ERow.CreateCell(0); ECell.SetCellValue("111"); ECell = (XSSFCell)ERow.CreateCell(1); ECell.SetCellValue("222"); ECell = (XSSFCell)ERow.CreateCell(2); ECell.SetCellValue("333"); ERow = (XSSFRow)ESheet1.CreateRow(1); ECell = (XSSFCell)ERow.CreateCell(0); ECell.SetCellValue("444"); ECell = (XSSFCell)ERow.CreateCell(1); ECell.SetCellValue("555"); ECell = (XSSFCell)ERow.CreateCell(2); ECell.SetCellValue("666"); // 手动设置单元格范围 ESheet1.SetDimension(new CellRangeAddress(0, 1, 0, 2)); using (var file2 = new FileStream(@"C:\inetpub\temp.xlsx", FileMode.Create, FileAccess.ReadWrite)) { EWorkbook.Write(file2); }
内容的提问来源于stack exchange,提问作者Alex C.
相关产品推荐
相关产品推荐

