NPOI写入腐败文件 – 裸和号

使用NPOI 2.1.3.1,我试图读取现有的Excel(* .xlsx)工作簿,对其进行修改,然后将其写回原始文件。 在阅读了各种线程(包括这个 )之后,我仍然无法find解决问题的方法。

当我将文件写入磁盘,然后尝试在Excel中再次打开它时,出现以下错误:

我们在(文件名)中find了一些内容的问题,您是否希望我们尽可能地恢复?如果您信任此工作簿的源,请单击“是”。

点击“是”修复Excel文件中的各种问题,之后我看到下面的修复报告:

replace部分:XML错误的/xl/worksheets/sheet3.xml部分。 非法的名字。 第3行,第3891168列。

replace部分:/xl/worksheets/sheet19.xml部分,出现XML错误。 非法的名字。 第1行,第699903列。

删除logging:来自/xl/calcChain.xml部分的公式(计算属性)

我解压缩了* .xlsx文件,发现提到的表单,并发现它所指的字符是一个没有写成“&”的纯和符号(&)。 在XML中。 原来用“&”,但是NPOI写的文件没有。 我不知道公式(第三个问题)是什么问题。

这里是一个完整的程序,每次使用我正在使用的工作簿再现这个问题,删除文件名:

using System.IO; using NPOI.XSSF.UserModel; namespace NpoiTest { public sealed class NpoiTest { public static void Main(string[] args) { XSSFWorkbook workbook; using (FileStream file = new FileStream(@"C:\Path\To\File.xlsx", FileMode.Open, FileAccess.Read)) { workbook = new XSSFWorkbook(file); } using (FileStream file = new FileStream(@"C:\Path\To\File.xlsx", FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) { workbook.Write(file); } } } } 

作为一个testing,我使用Apache POI编写了几乎相同的程序,看看它是否仅仅是我的工作簿的普遍问题,结果是POI没有任何问题。

这是完整的程序:

 package poitest; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class PoiTest { public static void main(String[] args) { XSSFWorkbook workbook; try (FileInputStream file = new FileInputStream(new File("C:\\Path\\To\\File.xlsx"))) { workbook = new XSSFWorkbook(file); } catch (IOException e) { System.out.println(e.getMessage()); return; } try (FileOutputStream out = new FileOutputStream(new File("C:\\Path\\To\\File.xlsx"))) { workbook.write(out); } catch (IOException e) { System.out.println(e.getMessage()); } } } 

所以问题是为什么NPOI离开了光标? 这只是NPOI中的一个错误吗?