ms-word – 如何使用Java从模板或现有文档创建Word文档?

我有一个文档模板,其中一些字段是静态的,而另一些是动态的.我需要替换一些数据(名称,姓氏,工资)并生成新文件.您建议使用哪个库来执行此操作? POI合适吗?
我正在使用Spring,Java EE6和Oracle.
最佳答案
您可以尝试使用Apache POI,但操作word文件所需的POI的HWPF和XWPF部分使用起来非常复杂 – 您需要至少很好地理解word文件的结构!

使用iText和PDF的解决方案

我用PDF做了类似的事情(这可能是你的选择)

1)您可以使用LibreOffice在文档中创建字段(如在Acrobat Pro中)

>创建.odt文件并设置样式
>或使用MS Word或LibreOffice Writer将模板转换为它
>然后转到View – >工具栏 – >表单设计并设置“设计模式开/关”
>现在您可以在文件中添加字段(双击它将打开字段的属性)
>完成后:“文件 – >导出为PDF”

2)现在您可以使用iText填写创建的字段

以下是示例代码:

    public byte[] getDocumentAsByteArray(Object dataBean, String pdfTemplateName) throws KkmsException {

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    PdfStamper stamp = null;
    InputStream templateInputStream = null;

    Locale local = new Locale(language);

    try {
        templateInputStream = // get the file input stream of the pdf
        PdfReader reader = new PdfReader(templateInputStream);

        // Create a stamper that will copy the document to a new file
        stamp = new PdfStamper(reader, outputStream);

        AcroFields form = stamp.getAcroFields();

        // form fields are normal text in the end
        stamp.setFormFlattening(true);
        Map<String, AcroFields.Item> map = (Map<String, AcroFields.Item>)form.getFields();
        if (map != null) {
            if (map.size() == 0) {
                logger.debug("There are no fields in this PDF layout");
            }
            for (Entry<String, AcroFields.Item> e : map.entrySet()) {
                logger.debug("PDF fieldname = " + e.getKey());

                // at the moment we only handle text fields
                if (AcroFields.FIELD_TYPE_TEXT == form.getFieldType(e.getKey())) {
                    fillForm(dataBean, form, e.getKey(), local);
                } else {
                    logger.warn("Field type is not supported: "+form.getFieldType(e.getKey()));
                }
            }
        }

        stamp.close();
    } catch (Exception e) {
        logger.warn("Failed to create PDF document", e);
        throw new KkmsException("Failed to create PDF document: "+e.getMessage());
    } finally {
        if (templateInputStream != null) {
            try {
                templateInputStream.close();
            } catch (IOException e) {
                throw new KkmsException("Failed to close InputStream of PDF document", e);
            }
        }
    }
    return outputStream.toByteArray();
}

最后你得到一个PDF – >希望这对你至少有一点帮助!

另一个快速而又肮脏的解

可以使用odt或docx的力量 – >将您的doc转换为docx或odt – >它只是一个zip文件 – >所以解压它 – >你会在zip的根目录中看到一个content.xml文件 – >那里有所有的文件内容
现在你可以在这里添加一些魔术标签(例如$$$),以后可以用你的程序替换它们

<text:p text:style-name="P3">SAP Customer Number:</text:p>

<text:p text:style-name="P3">SAP Customer Number: $$$sapCustomerNumber$$$</text:p>

现在创建一个解压缩odt / docx文件的程序 – >替换标签 – >再次压缩文件

转载注明原文:ms-word – 如何使用Java从模板或现有文档创建Word文档? - 代码日志