使用 POI 在 Word 中重新开始编号、自定义标题格式

这篇具有很好参考价值的文章主要介绍了使用 POI 在 Word 中重新开始编号、自定义标题格式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果图

引入依赖

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>ooxml-schemas</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.1.2</version>
        </dependency>

 示例代码

import cn.hutool.core.date.DateTime;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.time.LocalDateTime;

@Component
public class CreateTestWordUtil {
	private static CreateTestWordUtil createJGWordUtil;
	int numLevel = 0; //编号
	String filePath;
	String filename;
	@PostConstruct
	public void init() {
		createJGWordUtil = this;
	}

	/**
	 * @param styles       样式
	 * @param strStyleId   标题id
	 * @param headingLevel 标题级别
	 * @param pointSize    字体大小(/2)
	 * @param hexColor     字体颜色
	 * @param typefaceName 字体名称(默认微软雅黑)
	 */
	public void createHeadingStyle(XWPFStyles styles, String strStyleId,
								   int headingLevel, int pointSize, String hexColor, String typefaceName) {
		//创建样式
		CTStyle ctStyle = CTStyle.Factory.newInstance();
		//设置id
		ctStyle.setStyleId(strStyleId);

		CTString styleName = CTString.Factory.newInstance();
		styleName.setVal(strStyleId);
		ctStyle.setName(styleName);

		CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
		indentNumber.setVal(BigInteger.valueOf(headingLevel));

		// 数字越低在格式栏中越突出
		ctStyle.setUiPriority(indentNumber);

		CTOnOff onoffnull = CTOnOff.Factory.newInstance();
		ctStyle.setUnhideWhenUsed(onoffnull);

		// 样式将显示在“格式”栏中
		ctStyle.setQFormat(onoffnull);

		// 样式定义给定级别的标题
		if (headingLevel != 0) {
			CTPPr ppr = CTPPr.Factory.newInstance();
			ppr.setOutlineLvl(indentNumber);
			ctStyle.setPPr(ppr);
		}
		XWPFStyle style = new XWPFStyle(ctStyle);

		CTHpsMeasure size = CTHpsMeasure.Factory.newInstance();
		size.setVal(new BigInteger(String.valueOf(pointSize)));
		CTHpsMeasure size2 = CTHpsMeasure.Factory.newInstance();
		size2.setVal(new BigInteger(String.valueOf(pointSize)));

		CTFonts fonts = CTFonts.Factory.newInstance();
		if (typefaceName == null || typefaceName.equals("")) typefaceName = "微软雅黑";
		fonts.setAscii(typefaceName);    //字体

		CTRPr rpr = CTRPr.Factory.newInstance();
		rpr.setRFonts(fonts);
		rpr.setSz(size);
		rpr.setSzCs(size2);    //字体大小

		CTColor color = CTColor.Factory.newInstance();
		color.setVal(hexToBytes(hexColor));
		rpr.setColor(color);    //字体颜色
		style.getCTStyle().setRPr(rpr);
		// is a null op if already defined

		style.setType(STStyleType.PARAGRAPH);
		styles.addStyle(style);

	}

	public void writeWordAQJG() {
		// 文档生成方法
		XWPFDocument doc = new XWPFDocument();

		XWPFStyles xwpfStyles = doc.createStyles();
		CTFonts fonts = CTFonts.Factory.newInstance();
		fonts.setAscii("微软雅黑");
		fonts.setEastAsia("微软雅黑");
		fonts.setHAnsi("微软雅黑");
		xwpfStyles.setDefaultFonts(fonts);
		createHeadingStyle(xwpfStyles, "标题 1", 1, 32, "000000", "微软雅黑");
		createHeadingStyle(xwpfStyles, "标题 2", 2, 28, "000000", "微软雅黑");
		createHeadingStyle(xwpfStyles, "正文", 0, 24, "000000", "微软雅黑");

		XWPFParagraph xwpfParagraphtop = doc.createParagraph(); // 创建段落
		xwpfParagraphtop.setFontAlignment(2);
		xwpfParagraphtop.setStyle("标题 1");
		XWPFRun xwpfRuntop = xwpfParagraphtop.createRun(); // 创建段落文本
		xwpfRuntop.setText(String.format("标题")); // 设置文本
//		xwpfRuntop.setFontFamily("微软雅黑");
		xwpfRuntop.setBold(true);
		xwpfRuntop.setFontSize(24);
//		xwpfRuntop.addBreak();// 换行
		xwpfRuntop.addTab();

		XWPFParagraph xwpfParagraphtop1 = doc.createParagraph(); // 创建段落
		xwpfParagraphtop1.setFontAlignment(3);
		xwpfParagraphtop1.setStyle("正文");
		XWPFRun xwpfRuntop1 = xwpfParagraphtop1.createRun(); // 创建段落文本
		xwpfRuntop1.setText("- abcd"); // 设置文本
//		xwpfRuntop1.setFontSize(12);
//		xwpfRuntop1.addBreak();// 换行
		xwpfRuntop1.addTab();


		FileOutputStream out = null; // 创建输出流
		try {
			//需要的配置项
			writeItemBGGS(doc);
			writeItemNGDWQK(doc);
			writeItemNGZCQK(doc);
			writeItemDDZLQK(doc);

			if (System.getProperty("os.name").toLowerCase().contains("linux")) {
				filePath = "/usr/local/createfile/weekly/";
			} else {
				filePath = "D:\\hian\\createfile\\weekly\\";
			}

			filename = LocalDateTime.now().getYear() + "年" + LocalDateTime.now().getMonth().getValue() + "月-" + DateTime.now().getTime();

			File file = new File(filePath + filename + ".docx");
			if (!file.exists()) {
				file.getParentFile().mkdirs();
				file.createNewFile();
			}
			out = new FileOutputStream(file);
			doc.write(out);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (out != null) {
				try {
					doc.close();
					out.close();

				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}


	public void writeItemBGGS(XWPFDocument doc) {
		//编号等级
		CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
		cTAbstractNum.setAbstractNumId(BigInteger.valueOf(10));

		CTLvl cTLvl = cTAbstractNum.addNewLvl();
		cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);
		cTLvl.addNewLvlText().setVal("%1.");
		cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

		XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
		XWPFNumbering numbering = doc.createNumbering();
		BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
		BigInteger numID = numbering.addNum(abstractNumID);

		XWPFParagraph xwpfParagraphtext = doc.createParagraph(); // 创建段落
		xwpfParagraphtext.setAlignment(ParagraphAlignment.LEFT);
		xwpfParagraphtext.setNumID(numID);
		xwpfParagraphtext.setStyle("标题 1");
		XWPFRun xwpfRuntext = xwpfParagraphtext.createRun(); // 创建段落文本
		xwpfRuntext.setText("标题");
		xwpfRuntext.setBold(true);

		XWPFParagraph xwpfParagraphtext1 = doc.createParagraph(); // 创建段落
		XWPFRun xwpfRuntext1 = xwpfParagraphtext1.createRun(); // 创建段落文本
		xwpfRuntext1.setStyle("正文");
		xwpfRuntext1.setText("abcd");
		xwpfRuntext1.addBreak();// 换行

		numLevel++;
	}


	public void writeItemNGDWQK(XWPFDocument doc) {
		//编号等级
		CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
		cTAbstractNum.setAbstractNumId(BigInteger.valueOf(10));


		CTLvl cTLvl = cTAbstractNum.addNewLvl();
		cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);
		cTLvl.addNewLvlText().setVal("%1.");
		cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

		XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
		XWPFNumbering numbering = doc.createNumbering();
		BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
		BigInteger numID = numbering.addNum(abstractNumID);

		XWPFParagraph xwpfParagraphtext = doc.createParagraph(); // 创建段落
		xwpfParagraphtext.setAlignment(ParagraphAlignment.LEFT);
		xwpfParagraphtext.setNumID(numID);
		xwpfParagraphtext.setStyle("标题 1");
		XWPFRun xwpfRuntext = xwpfParagraphtext.createRun(); // 创建段落文本
		xwpfRuntext.setText("标题");
		xwpfRuntext.setBold(true);

		XWPFParagraph xwpfParagraphtext1 = doc.createParagraph(); // 创建段落
		XWPFRun xwpfRuntext1 = xwpfParagraphtext1.createRun(); // 创建段落文本
		xwpfRuntext1.setStyle("正文");
		xwpfRuntext1.setText("abcd");

		xwpfRuntext1.addBreak();// 换行


		numLevel++;
	}


	public void writeItemNGZCQK(XWPFDocument doc) {
		//编号等级
		CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
		cTAbstractNum.setAbstractNumId(BigInteger.valueOf(10));

		CTLvl cTLvl = cTAbstractNum.addNewLvl();
		cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);
		cTLvl.addNewLvlText().setVal("%1.");
		cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

		XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
		XWPFNumbering numbering = doc.createNumbering();
		BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
		BigInteger numID = numbering.addNum(abstractNumID);

		XWPFParagraph xwpfParagraphtext = doc.createParagraph(); // 创建段落
		xwpfParagraphtext.setAlignment(ParagraphAlignment.LEFT);
		xwpfParagraphtext.setNumID(numID);
		xwpfParagraphtext.setStyle("标题 1");
		XWPFRun xwpfRuntext = xwpfParagraphtext.createRun(); // 创建段落文本
		xwpfRuntext.setText("标题");
		xwpfRuntext.setBold(true);

		numLevel++;

		writeItemZCRRQK(doc);
		writeItemGFXZC(doc);
		writeItemXTHGQK(doc);
	}

	public void writeItemDDZLQK(XWPFDocument doc) {
		//编号等级
		CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
		cTAbstractNum.setAbstractNumId(BigInteger.valueOf(10));

		CTLvl cTLvl = cTAbstractNum.addNewLvl();
		cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);
		cTLvl.addNewLvlText().setVal("%1.");
		cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

		XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
		XWPFNumbering numbering = doc.createNumbering();
		BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
		BigInteger numID = numbering.addNum(abstractNumID);

		XWPFParagraph xwpfParagraphtext = doc.createParagraph(); // 创建段落
		xwpfParagraphtext.setAlignment(ParagraphAlignment.LEFT);
		xwpfParagraphtext.setNumID(numID);
		xwpfParagraphtext.setStyle("标题 1");
		XWPFRun xwpfRuntext = xwpfParagraphtext.createRun(); // 创建段落文本
		xwpfRuntext.setText("标题");
		xwpfRuntext.setBold(true);

		numLevel++;
		writeItemZLLXTJ(doc);
		writeItemZLXYTJ(doc);
	}

	public void writeItemZCRRQK(XWPFDocument doc) {
		//编号等级
		CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
		cTAbstractNum.setAbstractNumId(BigInteger.valueOf(13));

		CTLvl cTLvl = cTAbstractNum.addNewLvl();
		cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);

		cTLvl.addNewLvlText().setVal(numLevel + ".%1");
		cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

		XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
		XWPFNumbering numbering = doc.createNumbering();
		BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
		BigInteger numID = numbering.addNum(abstractNumID);

		XWPFParagraph xwpfParagraphtext = doc.createParagraph(); // 创建标题段落
		xwpfParagraphtext.setNumID(numID);
		xwpfParagraphtext.setStyle("标题 2");
		XWPFRun xwpfRuntext = xwpfParagraphtext.createRun(); // 创建段落文本
		xwpfRuntext.setText("标题");
		xwpfRuntext.setBold(true);

		XWPFParagraph xwpfParagraphtext1 = doc.createParagraph(); // 创建段落
		XWPFRun xwpfRuntext1 = xwpfParagraphtext1.createRun(); // 创建段落文本
		xwpfRuntext1.setStyle("正文");
		xwpfRuntext1.setText(String.format("abcd:"));
//		xwpfRuntext1.addTab();
//		xwpfRuntext1.addBreak();// 换行

	}

	public void writeItemGFXZC(XWPFDocument doc) {
		//编号等级
		CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
		cTAbstractNum.setAbstractNumId(BigInteger.valueOf(13));

		CTLvl cTLvl = cTAbstractNum.addNewLvl();
		cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);

		cTLvl.addNewLvlText().setVal(numLevel + ".%1");
		cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

		XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
		XWPFNumbering numbering = doc.createNumbering();
		BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
		BigInteger numID = numbering.addNum(abstractNumID);

		XWPFParagraph xwpfParagraphtext = doc.createParagraph(); // 创建标题段落
		xwpfParagraphtext.setNumID(numID);
		xwpfParagraphtext.setStyle("标题 2");
		XWPFRun xwpfRuntext = xwpfParagraphtext.createRun(); // 创建段落文本
		xwpfRuntext.setText("标题");
		xwpfRuntext.setBold(true);

	}

	public void writeItemXTHGQK(XWPFDocument doc) {
		//编号等级
		CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
		cTAbstractNum.setAbstractNumId(BigInteger.valueOf(13));

		CTLvl cTLvl = cTAbstractNum.addNewLvl();
		cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);

		cTLvl.addNewLvlText().setVal(numLevel + ".%1");
		cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

		XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
		XWPFNumbering numbering = doc.createNumbering();
		BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
		BigInteger numID = numbering.addNum(abstractNumID);

		XWPFParagraph xwpfParagraphtext = doc.createParagraph(); // 创建标题段落
		xwpfParagraphtext.setNumID(numID);
		xwpfParagraphtext.setStyle("标题 2");
		XWPFRun xwpfRuntext = xwpfParagraphtext.createRun(); // 创建段落文本
		xwpfRuntext.setText("标题");
		xwpfRuntext.setBold(true);

	}

	public void writeItemZLLXTJ(XWPFDocument doc) {
		//编号等级
		CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
		cTAbstractNum.setAbstractNumId(BigInteger.valueOf(14));

		CTLvl cTLvl = cTAbstractNum.addNewLvl();
		cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);

		cTLvl.addNewLvlText().setVal(numLevel + ".%1");
		cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

		XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
		XWPFNumbering numbering = doc.createNumbering();
		BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
		BigInteger numID = numbering.addNum(abstractNumID);

		XWPFParagraph xwpfParagraphtext = doc.createParagraph(); // 创建标题段落
		xwpfParagraphtext.setNumID(numID);
		xwpfParagraphtext.setStyle("标题 2");
		XWPFRun xwpfRuntext = xwpfParagraphtext.createRun(); // 创建段落文本
		xwpfRuntext.setText("标题");
		xwpfRuntext.setBold(true);

	}

	public void writeItemZLXYTJ(XWPFDocument doc) {
		//编号等级
		CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
		cTAbstractNum.setAbstractNumId(BigInteger.valueOf(14));

		CTLvl cTLvl = cTAbstractNum.addNewLvl();
		cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);

		cTLvl.addNewLvlText().setVal(numLevel + ".%1");
		cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

		XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
		XWPFNumbering numbering = doc.createNumbering();
		BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
		BigInteger numID = numbering.addNum(abstractNumID);

		XWPFParagraph xwpfParagraphtext = doc.createParagraph(); // 创建标题段落
		xwpfParagraphtext.setNumID(numID);
		xwpfParagraphtext.setStyle("标题 2");
		XWPFRun xwpfRuntext = xwpfParagraphtext.createRun(); // 创建段落文本
		xwpfRuntext.setText("标题");
		xwpfRuntext.setBold(true);

		XWPFParagraph xwpfParagraphtext1 = doc.createParagraph(); // 创建段落
		XWPFRun xwpfRuntext1 = xwpfParagraphtext1.createRun(); // 创建段落文本
		xwpfRuntext1.setStyle("正文");
		xwpfRuntext1.setText(String.format("abc"));

	}

	public static byte[] hexToBytes(String hexString) {
		HexBinaryAdapter adapter = new HexBinaryAdapter();
		byte[] bytes = adapter.unmarshal(hexString);
		return bytes;
	}

}

文章来源地址https://www.toymoban.com/news/detail-639191.html

到了这里,关于使用 POI 在 Word 中重新开始编号、自定义标题格式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Markdown标题自动添加编号

    用 markdown 写文档很方便,但是有个困扰的地方,就是标题的编号问题。 写文档的时候,经常会在中间插入新的标题和内容,所以手动管理编号的话,如果新的标题插在前面,则要调整后面所有的编号。 如果在文档完成后再手动加上编号的话,不仅容易忘记, 而且有时候我们

    2024年02月06日
    浏览(29)
  • 在word的文本框内使用Endnote引用文献,如何保证引文编号按照上下文排序

    如下图所示,我在word中插入了一个文本框(为了插图),然后文本框内有引用,结果endnote自动将文本框内的引用优先排序,变成文献[1]了,而事实上应该是[31]。请问如何能让文本框内的排序也自动按照整个文章从上到下的顺序来呢?[引用自这里] 文本框中不支持尾注(和脚

    2024年02月13日
    浏览(40)
  • 使用原生POI和EasyPoi根据word模板导出word工具类

    前两天接了个需求,要求将数据导出成word,里边有边个,有其他的东西,怎么说这,这个需求最开始就是上传word,下载附件就行了,非得改成上传数据然后支持下载word。有股脱裤子放屁的感觉 而且呢,当时做的时候前任开发在数据库存了一个巨大的Json文件,解析也挺费劲的

    2024年01月25日
    浏览(44)
  • 使用POI生成word文档的table表格

    //生成一行一列的table XWPFTable table = document.createTable(); //添加列 table.getRow(0).addNewTableCell(); //添加行(添加的新行默认就是总共的列数) table.createRow(); 测试Demo:CreateTableDemo1.java 生成结果: //生成3行5列的table XWPFTable table2 = document.createTable(3, 5); 测试Demo: 生成结果: 创建的两

    2024年01月25日
    浏览(35)
  • java使用apache.poi导出word文件

    功能说明: 将试卷导出word,并可以打印,装订,效果图: 下面是实现代码:

    2024年02月15日
    浏览(35)
  • 根据模板动态生成word(三)使用poi-tl生成word

    @ 目录 一、前言 1、什么是poi-tl 2、官方信息 2.1 源码仓库 2.2 中文文档 2.3 开源协议 3、poi-tl的优势 3.1 poi-tl和其他模板引擎的对比 3.2 poi-tl Word模板引擎支持的功能 二、基本的使用配置 1、引入依赖 1.1 Maven 1.2 Gradle 2、配置 2.1 新建配置 2.2 标签前后缀替换 2.3 加载模板 2.4 填充数

    2024年02月13日
    浏览(36)
  • java使用poi解析word表格,把数据入库

    77、java解析word表格,把数据入库

    2023年04月09日
    浏览(31)
  • OrCAD原理图元件快速重新编号

    在绘制原理图的时候经常不是按顺序去放元件的,而且偶尔会在原理图某个地方又加几个电阻电容或者其他元件什么的,这样就会出现同一个模块地方编号乱七八糟的,例如这个电阻编号R14,然后他旁边那个电阻编号R198…又或者说有时候不小心某个电阻电容编号相同了没发现

    2024年02月05日
    浏览(27)
  • java 使用POI-TL根据word模版,生成word文件,含图片,富文本。

    1.引入mavna坐标` 2 .poi-tl-ext插件主要用于富文本内容格式在word展现 3.word模版创建 3.具体代码实现 4.本文的miniourl路径实质为网络路径的文件。

    2024年02月16日
    浏览(44)
  • 【Java】poi-tl 使用Word模板渲染动态表格

    poi-tl 是一个基于 Apache POI 和 FreeMarker 的 Java 模板引擎,可以用于动态生成 Word、Excel、PowerPoint 等文档。使用 poi-tl 可以方便地将数据填充到模板中,生成符合要求的文档。 poi-tl官方文档地址:http://deepoove.com/poi-tl/#_%E7%89%88%E6%9C%AC 先附上导出效果图: 这步建议手动创建,之前客服

    2024年01月21日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包