Npoi xls文件保存损坏excel文件

时间:2017-04-27 14:43:58

标签: c# excel xls excel-2003 npoi

所以我可以打开并浏览xls(Excel 97-2003)文件。但问题是当我尝试保存它时。保存后,它成功了,然后我去手动打开Excel文件并收到错误消息,说它无法打开Excel文件并且它已损坏。无论我是否进行任何更改,都会发生这种情况。

我仍然可以在程序中打开excel文件并读取数据。

我正在使用NPOI 2.2.1和2.3.0(我通过Nuget安装)。两个版本都有相同的结果。

string excelLocation = settings.GetExcelDirectory() + week.ExcelLocation;
HSSFWorkbook wbXLS;

// Try to open and read existing workbook
using (FileStream stream = new FileStream(excelLocation, FileMode.Open, FileAccess.Read))
{
    wbXLS = new HSSFWorkbook(stream);
}

ISheet sheet = wbXLS.GetSheet("Schedule");
using (FileStream stream = new FileStream(excelLocation, FileMode.Create, FileAccess.Write))
{
    wbXLS.Write(stream);
}

2 个答案:

答案 0 :(得分:1)

您是否有多行单元格内容(换行符)? 我刚刚遇到第0行的列标题出现了这样的问题。 Excel通过将其替换为_x000a_(即line1_x000a_line2)来对换行符进行编码,NPOI不这样做。
尝试使用nuget 2.3.0和xlsx文件,但在您的情况下可能也会有所帮助。

我通过在保存之前替换换行符来解决(并验证原因):

// Encode LineFeeds in column headers (row 0)
IRow rowColHeaders = sheet.GetRow(0);
foreach (ICell cell in rowColHeaders.Cells)
{
    string content = cell.StringCellValue;
    if (content.Contains("\n"))
        cell.SetCellValue(content.Replace("\n", "_x000a_"));
}

答案 1 :(得分:0)

尝试类似

的内容
String bis = "good";
String cis  ="good";
char[] ch = {'g','o','o','d'};
String temp="";
for (char c:ch){
    temp=temp+c;
        }
System.out.println(temp);

System.out.println(cis==bis); //true
System.out.println(bis==temp); //false