/docx-op

基于 docx4j 库封装 Java 操作 word 文档,支持简单模板、定点续写、目录、图片、复杂表格等,简单易用人性化😍...

Primary LanguageJava

docx-op

docx-op 是基于 docx4j 库封装的一个用于创建和操作 Word 文档的 Java 库,提供了简单而灵活的 API,可以轻松地生成包含各种内容(如文本、表格、图片等)的 Word 文档。

Stop talking, show me code. 

如何使用 

src/test/java/DocxTest.java

public class DocxTest {

    /**
     * 创建word
     */
    @Test
    public void createDocx() {
        // 创建word画家
        DocxPainter docxPainter = new DocxPainter();
        // 准备图片
        DocxImage docxImage = this.prepareImage();
        // 准备表格
        DocxTable docxTable = this.prepareTable(docxPainter);
        // 画word
        docxPainter
                // 添加目录
                .addToc(DocxFactory.createParagraph(new DocxText("目录", DocxStyleEnum.DEFAULT_TOC_TITLE.getDocxStyle())))
                // 开启新一页
                .add(DocxFactory.newPage())
                // 添加标题
                .add(DocxFactory.createHeading("Heading1", new DocxText("1、一级标题1")))
                // 添加正文
                .add(DocxFactory.createParagraph(new DocxText("这是正文")))
                // 添加图片
                .add(DocxFactory.createParagraph(docxImage, docxPainter.getWpk()))
                // 开启新一页
                .add(DocxFactory.newPage())
                // 添加标题
                .add(DocxFactory.createHeading("Heading1", new DocxText("2、一级标题2")))
                // 添加2级标题
                .add(DocxFactory.createHeading("Heading2", new DocxText("2-1、二级标题1")))
                // 添加表格
                .add(DocxFactory.createTable(docxTable, docxPainter.getWpk()))
                // 保存
                .save(new File("docx/1.docx"));
    }

    /**
     * 通过模板创建word
     * 支持使用word 的代码域(邮件合并)标记占位符
     */
    @Test
    public void createDocxByTemplate() {
        Map<DataFieldName, String> ctx = new HashMap<>();
        ctx.put(new DataFieldName("title"), "大家好");

        // 通过传入已有的word文件,从文末继续画word
        DocxPainter docxPainter = new DocxPainter(new File("docx/template.docx"));
        docxPainter
                // 执行模板渲染
                .processTemplate(ctx)
                // 开启新一页
                .add(DocxFactory.newPage())
                // 添加标题
                .add(DocxFactory.createHeading("Heading1", new DocxText("1、一级标题1")))
                // 添加正文
                .add(DocxFactory.createParagraph(new DocxText("这是正文")))
                // 保存
                .save(new File("docx/template-result.docx"));
    }

    /**
     * 定点续写
     */
    @Test
    public void positionWriteDocx() {
        new DocxPainter(new File("docx/position-write.docx"))
                .add(DocxFactory.createParagraph(new DocxText("随便写两句吧")))
                .save(new File("docx/position-write-result.docx"));
    }

    /**
     * 准备图片
     *
     * @return {@link DocxImage}
     */
    private DocxImage prepareImage() {
        try {
            byte[] bytes = DocxFactory.readImage(Files.newInputStream(Paths.get("docx/money.jpg")), true);
            DocxImage docxImage = new DocxImage(bytes);
            docxImage.setWidth(1000L);
            return docxImage;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 准备表
     *
     * @param docxPainter 多克斯画家
     * @return {@link DocxTable}
     */
    private DocxTable prepareTable(DocxPainter docxPainter) {
        // 搞张图片
        DocxImage docxImage = this.prepareImage();
        // 行(注意:行里的列数要保持一致,样式是 行->列->内容 传递的)
        List<DocxRow> rows = new ArrayList<>();
        DocxRow headRow = new DocxRow(new ArrayList<DocxCell>() {{
            // 直接使用字符串和 new DocxText()是一样的
            add(new DocxCell("th1"));
            add(new DocxCell("th2"));
            add(new DocxCell("th3"));
            // 给Row设置不一样的样式来表示表头
        }}, DocxStyle.builder().cellColor("C0C0C0").align(JcEnumeration.CENTER).build());
        DocxRow row1 = new DocxRow(new ArrayList<DocxCell>() {{
            add(new DocxCell(new DocxText("td1")));
            add(new DocxCell(new DocxText("td2")));
            // 图片单元格
            add(new DocxCell(docxImage));
        }});
        DocxRow row2 = new DocxRow(new ArrayList<DocxCell>() {{
            add(new DocxCell(new DocxText("td1")));
            // 复杂单元格
            List<P> pList = new ArrayList<>();
            pList.add(DocxFactory.createParagraph(new DocxText("这是一张图片")));
            pList.add(DocxFactory.createParagraph(docxImage, docxPainter.getWpk()));
            // 横向合并单元格
            add(new DocxCell(pList, DocxStyle.builder().hMerge(TbMergeEnum.RESTART).align(JcEnumeration.CENTER).build()));
            add(new DocxCell(new DocxText(""), DocxStyle.builder().hMerge(TbMergeEnum.CONTINUE).build()));
        }});
        rows.add(headRow);
        rows.add(row1);
        rows.add(row2);
        return new DocxTable(rows);
    }
}

示例结果

createDocx

image-20220902223300066 

createDocxByTemplate

image-20220902223338579

image-20220902223355091 

positionWriteDocx

image-20220909233637745

image-20220909233701047 

版本更新

V1.1.0 

  • 支持模板定位续写(从 Word 模板的中间部分开始填充)
  • 增加自定义表格宽度(按比例自适应)

V1.0.0

初始化