Java生成Word文档

1. Apache POI

简介:
Apache POI 是一个用于读写Microsoft Office文件格式的开源Java库,它支持多种Office文件格式,包括Word (.doc 和 .docx)。

依赖:
pom.xml 文件中添加 Apache POI 的依赖:

<dependency>
    <groupId>org.apache.poigroupId>
    <artifactId>poiartifactId>
    <version>5.2.1version>
dependency>
<dependency>
    <groupId>org.apache.poigroupId>
    <artifactId>poi-ooxmlartifactId>
    <version>5.2.1version>
dependency>

简单用法:

import org.apache.poi.xwpf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;

public class SimpleWordGenerator {
    public static void main(String[] args) {
        try (XWPFDocument document = new XWPFDocument()) {
            XWPFParagraph paragraph = document.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("Hello, World!");

            FileOutputStream fileOut = new FileOutputStream("simple.docx");
            document.write(fileOut);
            fileOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

复杂用法:

import org.apache.poi.xwpf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;

public class ComplexWordGenerator {
    public static void main(String[] args) {
        try (XWPFDocument document = new XWPFDocument()) {
            // 创建标题
            XWPFParagraph titlePara = document.createParagraph();
            XWPFRun titleRun = titlePara.createRun();
            titleRun.setText("Report Title");
            titleRun.setBold(true);
            titlePara.setAlignment(ParagraphAlignment.CENTER);

            // 创建列表
            XWPFParagraph listPara = document.createParagraph();
            XWPFRun listRun = listPara.createRun();
            listPara.createRun().setText("Item 1");
            listPara.createRun().addBreak(BreakType.LINE);
            listPara.createRun().setText("Item 2");
            listPara.createRun().addBreak(BreakType.LINE);
            listPara.createRun().setText("Item 3");

            // 创建表格
            XWPFTable table = document.createTable(3, 2);
            table.getRow(0).getCell(0).setText("Header 1");
            table.getRow(0).getCell(1).setText("Header 2");
            table.getRow(1).getCell(0).setText("Row 1 Data 1");
            table.getRow(1).getCell(1).setText("Row 1 Data 2");
            table.getRow(2).getCell(0).setText("Row 2 Data 1");
            table.getRow(2).getCell(1).setText("Row 2 Data 2");

            FileOutputStream fileOut = new FileOutputStream("complex.docx");
            document.write(fileOut);
            fileOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. Docx4j

简介:
Docx4j 是一个用于生成和处理Word文档的Java库,它支持复杂的文档布局和样式控制。

依赖:
pom.xml 文件中添加 Docx4j 的依赖:

<dependency>
    <groupId>org.docx4jgroupId>
    <artifactId>docx4jartifactId>
    <version>3.3.2version>
dependency>

简单用法:

import org.docx4j.Docx4J;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.wml.P;
import org.docx4j.wml.R;
import org.docx4j.wml.Text;

import java.io.File;

public class SimpleDocx4jGenerator {
    public static void main(String[] args) {
        try {
            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
            P p = wordMLPackage.getMainDocumentPart().createParagraphOfText("Hello, World!");
            R r = new R();
            r.getContent().add(new Text("Simple Docx4j Example"));
            p.getContent().add(r);
            wordMLPackage.getMainDocumentPart().getContent().add(p);

            Docx4J.save(wordMLPackage, new File("simple.docx"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

复杂用法:

import org.docx4j.Docx4J;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.wml.*;
import org.docx4j.wml.dom.DOMUtil;
import org.docx4j.wml.text.FieldChar;
import org.docx4j.wml.text.FieldCharType;
import org.docx4j.wml.text.Inline;
import org.docx4j.wml.text.SdtContent;
import org.docx4j.wml.text.SdtPr;
import org.docx4j.wml.text.SdtRun;

import java.io.File;

public class ComplexDocx4jGenerator {
    public static void main(String[] args) {
        try {
            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
            Body body = wordMLPackage.getMainDocumentPart().getJaxbElement().getBody();

            // 创建段落
            P p = DOMUtil.createElement(P.type, wordMLPackage.getMainDocumentPart().getJaxb2Context());
            R r = new R();
            r.getContent().add(new T("Complex Docx4j Example"));
            p.getContent().add(r);
            body.getContent().add(p);

            // 创建表格
            Tbl tbl = new Tbl();
            Tr tr = new Tr();
            Tc tc = new Tc();
            tc.getContent().add(new P(new R(new T("Header 1"))));
            tr.getContent().add(tc);
            tc = new Tc();
            tc.getContent().add(new P(new R(new T("Header 2"))));
            tr.getContent().add(tc);
            tbl.getContent().add(tr);
            body.getContent().add(tbl);

            Docx4J.save(wordMLPackage, new File("complex.docx"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. FreeMarker

简介:
FreeMarker 是一个用于生成动态HTML、XML和其他文本格式的模板引擎,同样可以用来生成Word文档。

依赖:
pom.xml 文件中添加 FreeMarker 的依赖:

<dependency>
    <groupId>org.freemarkergroupId>
    <artifactId>freemarkerartifactId>
    <version>2.3.31version>
dependency>

简单用法:

import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class SimpleFreemarkerGenerator {
    public static void main(String[] args) {
        try {
            Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
            cfg.setClassForTemplateLoading(SimpleFreemarkerGenerator.class, "/");

            Map<String, Object> root = new HashMap<>();
            root.put("name", "John Doe");

            Template temp = cfg.getTemplate("simple.ftl");
            temp.process(root, new FileWriter(new File("simple.docx")));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

复杂用法:

import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ComplexFreemarkerGenerator {
    public static void main(String[] args) {
        try {
            Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
            cfg.setClassForTemplateLoading(ComplexFreemarkerGenerator.class, "/");

            List<Map<String, Object>> data = new ArrayList<>();
            Map<String, Object> item = new HashMap<>();
            item.put("name", "John Doe");
            item.put("age", 30);
            data.add(item);

            item = new HashMap<>();
            item.put("name", "Jane Doe");
            item.put("age", 28);
            data.add(item);

            Map<String, Object> root = new HashMap<>();
            root.put("items", data);

            Template temp = cfg.getTemplate("complex.ftl");
            temp.process(root, new FileWriter(new File("complex.docx")));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. Thymeleaf

简介:
Thymeleaf 是一个现代的、功能强大的模板引擎,它同样可以用来生成Word文档。

依赖:
pom.xml 文件中添加 Thymeleaf 的依赖:

<dependency>
    <groupId>org.thymeleafgroupId>
    <artifactId>thymeleafartifactId>
    <version>3.0.15.RELEASEversion>
dependency>

简单用法:

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

import java.io.File;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;

public class SimpleThymeleafGenerator {
    public static void main(String[] args) {
        try {
            ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
            resolver.setPrefix("/templates/");
            resolver.setSuffix(".docx");
            resolver.setTemplateMode(TemplateMode.HTML);

            TemplateEngine templateEngine = new TemplateEngine();
            templateEngine.setTemplateResolver(resolver);

            Context ctx = new Context();
            ctx.setVariable("name", "John Doe");

            PrintWriter writer = new PrintWriter(new File("simple.docx"));
            templateEngine.process("simple", ctx, writer);
            writer.flush();
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

复杂用法:

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

import java.io.File;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ComplexThymeleafGenerator {
    public static void main(String[] args) {
        try {
            ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
            resolver.setPrefix("/templates/");
            resolver.setSuffix(".docx");
            resolver.setTemplateMode(TemplateMode.HTML);

            TemplateEngine templateEngine = new TemplateEngine();
            templateEngine.setTemplateResolver(resolver);

            List<Map<String, Object>> data = new ArrayList<>();
            Map<String, Object> item = new HashMap<>();
            item.put("name", "John Doe");
            item.put("age", 30);
            data.add(item);

            item = new HashMap<>();
            item.put("name", "Jane Doe");
            item.put("age", 28);
            data.add(item);

            Context ctx = new Context();
            ctx.setVariable("items", data);

            PrintWriter writer = new PrintWriter(new File("complex.docx"));
            templateEngine.process("complex", ctx, writer);
            writer.flush();
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(项目相关,java,word,开发语言)