C#开发NPOI生成excel2007(.xlsx格式)表格时候总是提示发现不可读取的内容。

如题所述

C#开发NPOI生成excel2007(.xlsx格式)表格时候总是提示发现不可读取的内容是设置错误造成的,解决方法为:

1、首先打开一个可用的Excel文件,然后点击【文档】。

2、然后点击【打开】,点击【浏览】,如下图所示。

3、保存到桌面【另存为】-【计算机】-【桌面】。

4、输入文件名,点击保存。

5、Excel就可以显示出内容了。

注意事项

Excel虽然提供了大量的用户界面特性,但它仍然保留了第一款电子制表软件VisiCalc的特性:行、列组成单元格,数据、与数据相关的公式或者对其他单元格的绝对引用保存在单元格中。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-29

C#开发NPOI生成excel2007表格时候总是提示发现不可读取的内容是设置错误造成的,解决方法为:

1、在我们的电脑上打开office excel,打开出现问题的excel文件。

2、在打开的时候,选择打开并修复。

3、弹出框之后,选择修复excel文件,如下图所示。

4、可以看到excel已经修复完成,提示已经可以使用excel打开了。

注意事项:

Excel虽然提供了大量的用户界面特性,但它仍然保留了第一款电子制表软件VisiCalc的特性:行、列组成单元格,数据、与数据相关的公式或者对其他单元格的绝对引用保存在单元格中。

本回答被网友采纳
第2个回答  推荐于2017-12-16
NPOI读取EXCEL2003(.xls)和Excel2007(.xlsx)分别用HSSF和XSSF
XSSFWorkbook workbook1; //读取2003格式 .xls
HSSFWorkbook workbook2; //读取2007格式 .xlsx

如果不是你的excel本身的问题,那么就是用错了NOPI的类方法追问

首先应该是这样:
HSSFWorkbook workbook2; //读取2003格式 .xls
XSSFWorkbook workbook1; //读取2007格式 .xlsx

我用HSSFWorkbook workbook2; //读取2003格式 .xls开发是没问题的,换成XSSFWorkbook workbook1; //读取2007格式 .xlsx的时候才出问题的。

追答

对的,我注释写反了。
问下有没有具体弹出什么错误吗?给你个简单的读取示例:
XSSFWorkbook workbook;
string path=Environment.GetFolderPath(Environment.SpecialFolder.Personal)+"**.xlsx";
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
workbook = new XSSFWorkbook(fs);

sheet = workbook.GetSheetAt(0);

追问

我的NPOI是2.0.6.0的找不到FileStream我用MemoryStream.

弹出的错误是如图。

追答

FileStream是System.IO提供的,和NPOI没有关系。

根据你这个错误提示,我发现是你的Excel文档应该是有问题的,excel的头文件不对,NPOI不识别
解决办法是另存为.xlsx再尝试

追问

另存为的话解决问题的根源,生成后第一次打开就就有这个提示。
点击是也可以继续打开表格的,但这样下去不是问题,我想知道是什么原因导致的。
你所说的头文件不对,我有点不太清楚。能否再具体点。

追答

excel由第三方工具导出的话经常遇到这种不规范结果,导致NPOI读取不了

不规范的excel现在还无法直接修改其头文件,导致现在这个问题仍旧搁置中,我曾经也困扰了很长一段时间。

目前可以考虑的方法有2个:

    将第三方导出的excel规范化(一般第三方工具都是不可控的)

    绕开第三方工具生成的excel,直接获取其数据源/数据库

我以前是通过第2个方法,直接读取源数据,分析,然后得出自己的excel

只能帮你到这里了,切忌不要再花过多时间在如何修改头文件了,目前不可行。

追问

用这个HSSFWorkbook workbook2; //读取2003格式 .xls倒是不会不会有以上的错误提示。
但是分页布局时候不管数据多少都只是分为一页,有没有什么属性可以设置自动分页。

追答

倒是不会不会有以上的错误提示。

如果不出现这个错误提示的话,那么原始数据表应该是xls。而xlsx打开出错是因为直接修改了后缀名,而没有另存为导致的


分页布局

这个词我不是太清楚你具体指什么,是读取多个工作簿的sheet的意思吗?

sheet = workbook.GetSheetAt(0);

上面的0就是读取第一个sheet,读取哪个可以修改下。

如果读取的该sheet行数过多,可以将Sheet表赋值给dataTable,设置一个行数限制,分别显示出来

追问

xls跟xlsx这个的另存为方式不一样吗。

追答

另存为执行方式一样

本回答被网友采纳
相似回答