猿问

如何使用 apache poi 在 docx 中计算 =SUM(Above) 函数

我正在尝试使用 apache poi 来处理 docx 格式文件,但我一直坚持使用表格中的公式。例如看图片:

我确实尝试将文本设置为“=SUM(ABOVE)”,但这种方式不起作用。我想我可能需要在这里设置自定义 xml 数据,但我不确定如何进行。我尝试了以下代码:


              XWPFTable table = document.createTable();

              //create first row

              XWPFTableRow tableRowOne = table.getRow(0);

              table.getRow(0).createCell();

              table.getRow(0).getCell(0).setText("10");

              table.getRow(0).createCell();

              table.getRow(0).getCell(1).setText("=SUM(ABOVE)");


牛魔王的故事
浏览 134回答 1
1回答

暮色呼如

在这种情况下,我正在做的事情如下:首先,Word使用Word GUI. 然后查看Word已创建的内容,了解需要使用apache poi.具体来说:创建最简单的表,其中Word有一个字段{=SUM(ABOVE)}。将其另存为*.docx. 现在解压缩*.docx(Office Open XML 文件*.docx只是ZIP存档)。看看/word/document.xml那个档案。在那里你会发现类似的东西:<w:tc>&nbsp;<w:p>&nbsp; <w:fldSimple w:instr="=SUM(ABOVE)"/>&nbsp;...&nbsp;</w:p></w:tc>这XML适用于具有段落的表格单元格,fldSimple段落中有一个元素,其中instr属性包含公式。现在我们知道,我们需要表格单元格XWPFTableCell和XWPFParagraph其中的 。然后我们需要 fldSimple在此段落中设置一个元素,其中instr属性包含公式。这很简单paragraphInCell.getCTP().addNewFldSimple().setInstr("=SUM(ABOVE)");但是当然有些东西必须告诉Word在文档打开时需要计算公式。最简单的解决方案是将字段设置为“脏”。这导致需要在打开文档时更新字段Word。它还会导致有关更新需求的确认消息对话框。完整示例使用apache poi 4.1.0:import java.io.FileOutputStream;import org.apache.poi.xwpf.usermodel.*;import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSimpleField;import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;public class CreateWordTableSumAbove {&nbsp;public static void main(String[] args) throws Exception {&nbsp; XWPFDocument document= new XWPFDocument();&nbsp; XWPFParagraph paragraph = document.createParagraph();&nbsp; XWPFRun run=paragraph.createRun();&nbsp;&nbsp;&nbsp; run.setText("The table:");&nbsp; //create the table&nbsp; XWPFTable table = document.createTable(4,3);&nbsp; table.setWidth("100%");&nbsp; for (int row = 0; row < 3; row++) {&nbsp; &nbsp;for (int col = 0; col < 3; col++) {&nbsp; &nbsp; if (col < 2) table.getRow(row).getCell(col).setText("row " + row + ", col " + col);&nbsp; &nbsp; else table.getRow(row).getCell(col).setText("" + ((row + 1) * 1234));&nbsp; &nbsp;}&nbsp; }&nbsp; //set Sum row&nbsp; table.getRow(3).getCell(0).setText("Sum:");&nbsp; //get paragraph from cell where the sum field shall be contained&nbsp; XWPFParagraph paragraphInCell = null;&nbsp; if (table.getRow(3).getCell(2).getParagraphs().size() == 0) paragraphInCell = table.getRow(3).getCell(2).addParagraph();&nbsp; else paragraphInCell = table.getRow(3).getCell(2).getParagraphs().get(0);&nbsp; //set sum field in&nbsp; CTSimpleField sumAbove = paragraphInCell.getCTP().addNewFldSimple();&nbsp; sumAbove.setInstr("=SUM(ABOVE)");&nbsp; //set sum field dirty, so it must be calculated while opening the document&nbsp; sumAbove.setDirty(STOnOff.TRUE);&nbsp; paragraph = document.createParagraph();&nbsp; FileOutputStream out = new FileOutputStream("create_table.docx");&nbsp;&nbsp; document.write(out);&nbsp; out.close();&nbsp; document.close();&nbsp;}}这一切只有在使用打开文档时才能正常工作Microsoft Word。LibreOffice Writer无法将此类公式字段存储为Office Open XML( *.docx) 格式,也无法Office Open XML正确读取此类公式字段。
随时随地看视频慕课网APP

相关分类

Java
我要回答