使用apache poi更改embedded式xlsx中的值

我试图用apache poi来更改embedded到docx文件中的xlsx文件的值。 可悲的是,我还没有find适当的解决这个问题。 运行我的程序之后,新创build的embedded式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)); 

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

我不相信这是完全可以实现的愿望。 实际上,embedded式XSSFWorkbook已更新。 但是,如果您打开new.docx则看到的不是XSSFWorkbook而是其EMF图片。 只有双击它才能打开embedded的XSSFWorkbook ,然后在外部单击以再次closures该图片。

其他一些postbuild议,如果此EMF图片实际上不在ZIP存档中,则在打开Word文件时它将被更新。 但它不会。

尝试:

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

因此,“解决scheme”将是新的从更新的XSSFWorkbook创buildEMF快照图片,并用这个新的EMF图片取代旧的EMF图片。 在我看来,这是不可能的。

好像用于创buildEMF快照图片的程序例程是embedded式XSSFWorkbookclosures的Word应用程序的一部分。 但是直到现在,它并不是apache-poi一部分。 当然,这不是XML程序例程的一部分。