NPOI写入腐败文件 - 裸露的&符号

时间:2016-05-03 21:11:34

标签: excel apache-poi corrupt ampersand npoi

使用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中的一个错误吗?

0 个答案:

没有答案