gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:39:01 25 4
gpt4 key购买 nike

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

Word Screenshot

我确实尝试将文本设置为“=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)");

最佳答案

遇到这样的需求我会做如下:首先,使用 Word GUI 创建尽可能简单的 Word 文档,其中包含所需的内容。然后查看 Word 创建的内容,了解需要使用 apache poi 创建的内容。

具体来说:在 Word 中创建尽可能简单的表格,其中包含一个字段 {=SUM(ABOVE)}。将其另存为 *.docx。现在解压 *.docx(像 *.docx 这样的 Office Open XML 文件只是 ZIP 存档)。查看该存档中的 /word/document.xml。在那里你会发现类似的东西:

<w:tc>
<w:p>
<w:fldSimple w:instr="=SUM(ABOVE)"/>
...
</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 {

public static void main(String[] args) throws Exception {

XWPFDocument document= new XWPFDocument();

XWPFParagraph paragraph = document.createParagraph();
XWPFRun run=paragraph.createRun();
run.setText("The table:");

//create the table
XWPFTable table = document.createTable(4,3);
table.setWidth("100%");
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
if (col < 2) table.getRow(row).getCell(col).setText("row " + row + ", col " + col);
else table.getRow(row).getCell(col).setText("" + ((row + 1) * 1234));
}
}

//set Sum row
table.getRow(3).getCell(0).setText("Sum:");

//get paragraph from cell where the sum field shall be contained
XWPFParagraph paragraphInCell = null;
if (table.getRow(3).getCell(2).getParagraphs().size() == 0) paragraphInCell = table.getRow(3).getCell(2).addParagraph();
else paragraphInCell = table.getRow(3).getCell(2).getParagraphs().get(0);

//set sum field in
CTSimpleField sumAbove = paragraphInCell.getCTP().addNewFldSimple();
sumAbove.setInstr("=SUM(ABOVE)");
//set sum field dirty, so it must be calculated while opening the document
sumAbove.setDirty(STOnOff.TRUE);

paragraph = document.createParagraph();

FileOutputStream out = new FileOutputStream("create_table.docx");
document.write(out);
out.close();
document.close();
}
}

只有使用 Microsoft Word 打开文档时,这一切才能正常工作。 LibreOffice Writer 无法将此类公式字段存储为 Office Open XML (*.docx) 格式,也无法读取此类 Office正确打开 XML 公式字段。

关于java - 如何使用 apache poi 计算 docx 中的 =SUM(Above) 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57261914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com