使用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式XSSFWorkbook
closures的Word
应用程序的一部分。 但是直到现在,它并不是apache-poi
一部分。 当然,这不是XML
程序例程的一部分。