使用NPOI 2.1.3.1,我试图读取现有的Excel(* .xlsx)工作簿,修改它,然后将其写回原始文件。在阅读各种线程(包括this one)之后,我仍然无法找到解决我遇到的问题的方法。
当我将文件写入磁盘然后尝试在Excel中再次打开它时,我收到以下错误:
我们发现某些内容存在问题(文件名。你想要我们吗? 试着尽可能多地恢复?如果您相信这个来源 工作簿,单击是。
点击"是"修复了Excel文件中的各种问题,之后我看到了以下执行修复的报告:
替换了部分:/xl/worksheets/sheet3.xml部分出现XML错误。非法 名字。第3行,第3891168栏。
用XML错误替换了部分:/xl/worksheets/sheet19.xml部分。非法的名字 字符。第1行,第699903栏。
删除记录:来自/xl/calcChain.xml部分的公式(计算属性)
我解压缩* .xlsx文件并找到所提到的表格并发现它所指的字符是一个裸露的&符号(&),并未写成"& amp;"在XML中。最初的确实使用"& amp;",但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);
}
}
}
}
作为测试,我使用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中的一个错误吗?