- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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)");
最佳答案
遇到这样的需求我会做如下:首先,使用 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/
我是一名优秀的程序员,十分优秀!