gpt4 book ai didi

java - 如何用docx4j替换标题和表格中的变量?

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:15 25 4
gpt4 key购买 nike

我正在尝试替换文档标题和表格中的变量,但我不知道如何继续。我设法替换了文档正文中的变量,但此方法(使用 ${})不适用于标题和表格。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.List;

import org.docx4j.XmlUtils;
import org.docx4j.customxml.ObjectFactory;
import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.jaxb.Context;
import org.docx4j.model.datastorage.migration.VariablePrepare;
import org.docx4j.model.structure.HeaderFooterPolicy;
import org.docx4j.model.structure.SectionWrapper;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.CustomXmlDataStoragePart;
import org.docx4j.openpackaging.parts.Part;
import org.docx4j.openpackaging.parts.PartName;
import org.docx4j.openpackaging.parts.Parts;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
import org.docx4j.openpackaging.parts.WordprocessingML.HeaderPart;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.utils.BufferUtil;
import org.docx4j.wml.Hdr;
import org.docx4j.wml.HdrFtrRef;
import org.docx4j.wml.HeaderReference;

import java.util.Locale;

import javax.xml.bind.JAXBElement;

import java.text.DateFormat;
import org.docx4j.openpackaging.parts.WordprocessingML.HeaderPart;
import org.docx4j.wml.HdrFtrRef;

public class EditInvoice {

private static WordprocessingMLPackage template;
private static ObjectFactory factory;

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

boolean save = true;
String outputfilepath = System.getProperty("user.dir")+ "/InvoiceEdited.docx";

java.util.Date uDate = new java.util.Date();
java.sql.Date sDate = new java.sql.Date(System.currentTimeMillis());
sDate = new java.sql.Date(uDate.getTime());
uDate = new java.util.Date(sDate.getTime());
Locale locale = Locale.getDefault();
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, locale);

//System.out.println(dateFormat.format(sDate));


template = WordprocessingMLPackage.load(new FileInputStream(new File("invoice_template_sample.docx")));
VariablePrepare.prepare(template);

List<SectionWrapper> sectionWrappers = template.getDocumentModel().getSections();

MainDocumentPart documentPart = template.getMainDocumentPart();

HashMap<String, String> variables = new HashMap<String, String>();

// populate doc variables
variables.put("Name", "John Doe");
variables.put("Phone", "(123) 456 78 90");
variables.put("CompanyName", "BSI Business Systems Integration AG");
variables.put("Email", "john.doe@bsiag.com");
variables.put("CompanyAddress", "Täfernstrasse 16a, 5405 Baden");
variables.put("InvoiceNo", "No. 2013-007");
variables.put("InvoiceDate", dateFormat.format(sDate));
variables.put("BillingName", "Jane Smith");
variables.put("PayableToName", "John Doe, BSI");
variables.put("SubTotal", "$1,530.00");
variables.put("SalesTax", "$229.50");
variables.put("Shipping", "$250.00");
variables.put("Total", "$2,009.50");

// and content for embedded table
Object[][] orderItems = new Object[][]{
new Object[]{"1", "Table", "$800.00", "$800.00"},
new Object[]{"4", "Chair", "$150.00", "$600.00"},
new Object[]{"1", "Assembling", "$130.00", "$130.00"},
};


try
{

documentPart.variableReplace(variables);
//documentPart.addObject(orderItems);

}
catch (Exception e)
{
System.out.println(e);
}


if (save) {
template.save(new java.io.File(outputfilepath) );
} else {
System.out.println(XmlUtils.marshaltoString(documentPart.getContents(), true, true));
}


}
}

最佳答案

要替换 header 中的变量,需要对相关 header 部分进行变量替换。在这里,您只需在主文档部分中执行此操作。

关于表,变量替换内容并非旨在重复行(例如,每个发票行项目一行)。换句话说,它不会插入行。因此,如果您没有更多代码,您的 Object[][] orderItems 将不会执行任何操作。

(相比之下,docx4j 的 XML 数据绑定(bind)确实可以使用 OpenDoPE od:repeat 来处理该问题)

关于java - 如何用docx4j替换标题和表格中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31377352/

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