All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.joylau.office.word.support.template.DOCXTemplateWriter Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2017 by JoyLau. All rights reserved
 ******************************************************************************/

package cn.joylau.office.word.support.template;


import cn.joylau.office.word.config.WordReaderCallBack;
import cn.joylau.office.word.support.template.expression.ExpressionRunner;
import org.apache.poi.xwpf.usermodel.*;

import java.io.OutputStream;
import java.util.List;

/**
 * 基于POI docx的文档模板写出
 */
public class DOCXTemplateWriter implements WordReaderCallBack {

    /**
     * 文档输出流
     */
    private OutputStream outputStream;

    /**
     * 模板表达式执行器
     */
    private ExpressionRunner runner;

    /**
     * 带参数的构造方法,参数不能为null
     *
     * @param outputStream 写出模板后输出流
     * @param runner       模板表达式执行器
     */
    public DOCXTemplateWriter(OutputStream outputStream, ExpressionRunner runner) {
        this.outputStream = outputStream;
        this.runner = runner;
    }

    @Override
    public void onParagraph(Object par) {
        XWPFParagraph paragraph = ((XWPFParagraph) par);
        String text = getParagraphText(paragraph);
        runner.pushExpression(text, paragraph);
    }

    @Override
    public void onTable(Object t) {
        XWPFTable table = ((XWPFTable) t);
        for (XWPFTableRow xwpfTableRow : table.getRows()) {
            for (XWPFTableCell xwpfTableCell : xwpfTableRow.getTableCells()) {
                for (XWPFParagraph xwpfParagraph : xwpfTableCell.getParagraphs()) {
                    String text = getParagraphText(xwpfParagraph);
                    runner.pushExpression(text, xwpfTableCell, xwpfParagraph);
                }
            }
        }
    }

    protected String getParagraphText(XWPFParagraph paragraph) {
        return getRunText(paragraph.getRuns());
    }

    protected String getRunText(List xwpfRuns) {
        StringBuilder builder = new StringBuilder();
        for (XWPFRun run : xwpfRuns) {
            builder.append(run.toString());
        }
        return builder.toString();
    }

    @Override
    public void done(Object document) throws Exception {
        try {
            //执行表达式
            runner.run();
        } catch (Throwable throwable) {
            throw new Exception(throwable);
        }
        XWPFDocument docx = ((XWPFDocument) document);
        docx.write(outputStream);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy