我试图用apache poi更改嵌入在docx文件中的xlsx文件的值。可悲的是,我还没有找到解决这个问题的合适方法。运行我的程序后,带有嵌入式xlsx-table的新创建的docx文件尚未更改。
到目前为止,这是我尝试过的:

 FileInputStream fis = new FileInputStream("old.docx");
 XWPFDocument xdoc = new XWPFDocument(OPCPackage.open(fis));
     System.out.println(xdoc.getAllEmbedds().get(0));
     File file2 = new File("new.docx");

     for (PackagePart pPart : xdoc.getAllEmbedds()) {
        String contentType = pPart.getContentType();

        // Excel Workbook - OpenXML file format
        if (contentType.equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) {
            XSSFWorkbook embeddedWorkbook = new XSSFWorkbook(pPart.getInputStream());
            XSSFSheet sheet = embeddedWorkbook.getSheetAt(0);
            sheet.getRow(1).getCell(1).setCellValue("someValue"); //change value here
            embeddedWorkbook.write(pPart.getOutputStream());
        }
    }
    xdoc.write(new FileOutputStream(file2));


任何想法如何解决这个问题?

最佳答案

我不相信实现所有愿望就可以做到这一点。实际上,嵌入式XSSFWorkbook已更新。但是,打开new.docx时看到的不是XSSFWorkbook而是EMF图片。仅当您双击该图片以打开嵌入的XSSFWorkbook,然后在其外部单击以再次将其关闭时,该图片才会被更新。

其他一些帖子建议,如果此Word图片实际上不在EMF存档中,则在打开ZIP文件时将对其进行更新。但事实并非如此。

尝试:

  for (PackagePart pPart : xdoc.getPackage().getPartsByName(Pattern.compile(".*emf$"))) {
    System.out.println(pPart.getPartName());
    //xdoc.getPackage().removePartRecursive(pPart.getPartName());
    xdoc.getPackage().removePart(pPart.getPartName());
  }


因此,“解决方案”将是,从更新的EMF新建一个XSSFWorkbook快照图片,并用此新图片替换旧的EMF图片。我认为这真的不可能。

如果嵌入式EMF已关闭,则用于创建Word快照图片的程序例程似乎是XSSFWorkbook应用程序的一部分。但这直到现在都不是apache-poi的一部分。当然,它也不是XML程序例程的一部分。

10-06 10:42
查看更多