You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:14:53