我试图用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
程序例程的一部分。