JAVA poi-tl 制作word模板 表格数据行循环 带有复选框勾选的表格

这篇具有很好参考价值的文章主要介绍了JAVA poi-tl 制作word模板 表格数据行循环 带有复选框勾选的表格。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        java项目实际开发中经常会遇到制作word表单且表格数据行循环功能,甚至带有复选框勾选功能,本文简单介绍如何制作模板以及使用poi-tl生成word。


提示:以下是本篇文章正文内容,下面案例可供参考

一、需要的依赖

如果只用到word那么需要导入的依赖如下(本案例只需要如下2个依赖生成word):

		<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.0.M2</version>
        </dependency>
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.9.1</version>
        </dependency>

正常企业项目还有excel等其他office工具,所以需要导入其他依赖:

		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-scratchpad</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</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml-schemas</artifactId>
			<version>4.1.2</version>
		</dependency>

注意:一定要看清楚导入的poi-tl的版本,不同版本对应的jdk,Apache POI版本都不一样,且代码中需要调用的函数也可能会不一样。
poi-tl不同版本相关文档介绍

二、制作word模板

	以下都是示例模板

1. 原word表单文件

java poi-tl循环,java,word

2. 制作word模板

java poi-tl循环,java,word
java poi-tl循环,java,word

3. 最后通过代码生成的word数据表格

java poi-tl循环,java,word


三、示例代码

1.测试工具类

import cn.hutool.core.bean.BeanUtil;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import com.deepoove.poi.util.PoitlIOUtils;
import com.haiyang.Entity.DataForm;
import com.haiyang.Entity.VoteInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@Slf4j
public class GenerateWordTest {

    @Test
    public void generateWordForm() {

        /**
         *
         * 若是调用生成word的方法参数不能带response   可以通过request上下文获取
         */
        //获取response对象
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletResponse response = attributes.getResponse();

        /**
         *  1. 获取所有投票人的列表数据
         *    此处使用测试数据,实际项目中需要自己从数据库查询
         * */

        List<VoteInfo> infoList = new ArrayList<VoteInfo>() {{

            add(new VoteInfo("张三", "1", "没有意见"));
            add(new VoteInfo("李四", "1", "同意"));
            add(new VoteInfo("王五", "3", "拒绝,不同意"));
            add(new VoteInfo("宋小宝", "4", "我回避!不做任何评价"));
            add(new VoteInfo("海燕", "2", "我认为需要续议,日后再重新讨论"));
        }};

        StringBuffer allOpinion = new StringBuffer();
        for (VoteInfo info : infoList) {
            //拼接所有投票人的意见  并换行
            allOpinion.append(info.getVoterName() + ":" + info.getVoteOpinion() + "\n");
        }

        /**
         *  2. 获取并设置表单数据  此处为测试数据  meetingType和passFlag默认设置为1
         *  复选框 meetingType  会议类型 1、股东会 2、董事会  3、合伙人会 4、其他
         *  复选框 passFlag  是否通过 1、同意  2、续议  3、拒绝
         * */

        DataForm dataForm = new DataForm("程序猿公司", "2024", "1", "1",
                "程序猿股东大会-如何走向人生巅峰迎娶白富美", "1", "1",
                allOpinion.toString(), "程序猿", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));


        /**
         * 3. 数据map  用于渲染word表单的数据 将表单数据对象存入map中
         */
        Map<String, Object> dataMap = BeanUtil.beanToMap(dataForm);
        //需要循环的表单数据
        dataMap.put("dataTable", infoList);

        /**
         * 4. Configure类是该库中的一个配置类,其作用是提供了一些全局的配置选项
         * (1) useSpringEL() 开启El表达式{{ }}  word模板中的数据就以这个表达式传递数据 例如:{{companyName}};也可以调用buildGramer("${", "}") 可以修改模板为${}
         * (2) bind()  绑定标记需要循环的数据
         * (3) 实现表格行循环的策略 HackLoopTableRenderPolicy 不同poi版本实现行循环的策略不一样;当前案例是poi-tl 1.9.1版本
         *      1.9.x版本:HackLoopTableRenderPolicy  1.10.x以后的版本:LoopRowTableRenderPolicy
         *
         */
        ConfigureBuilder configureBuilder = Configure.builder().useSpringEL().bind("dataTable", new HackLoopTableRenderPolicy());
        Configure config = configureBuilder.build();
        InputStream is = null;
        try {
            /**
             *  5. word模板渲染数据  wordForm.docx为模板,本案例放在了项目根目录的wordTemplates下
             */
            is = new ClassPathResource("wordTemplates/wordForm.docx").getInputStream();
            XWPFTemplate template = XWPFTemplate.compile(is, config).render(dataMap);

            /** 6.  根据模板生成word文件的指定路径 */
            String filePath = "D:/note/程序猿会议意见反馈表.docx";
            //生成 意见反馈表word 到指定路径
            OutputStream out = new FileOutputStream(filePath);
            /**  若是直接访问下载打开 可以通过如下方式实现 不需要设置文件路径
             *  String fileName = URLEncodeUtil.encode("程序猿会议意见反馈表");
             *  response.setContentType("application/octet-stream;charset=utf-8");
             *  response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".docx");
             *  OutputStream out = response.getOutputStream();
             */

            /**
             *  7. 文件输出
             */
            template.writeAndClose(out);
            out.flush();
            PoitlIOUtils.closeQuietlyMulti(template, out);
        } catch (IOException e) {
            log.error("生成意见反馈表失败!", e);
        } finally {
            if (null != is) {
                try {
                    //最后别忘记了关闭流
                    is.close();
                } catch (IOException e) {
                    log.error("关闭流失败!", e);
                }
            }
        }

    }
}

2. 表单对象

/**
 *  word数据表单
 */
public class DataForm {

    /** 公司名称 */
    private String companyName;

    /** 时间-年 */
    private String year;

    /** 时间-月 */
    private String month;

    /** 时间-日 */
    private String day;

    /** 会议主题 */
    private String meetingTheme;

    /** 会议类型 1、股东会 2、董事会  3、合伙人会 4、其他 */
    private String meetingType;

    /** 是否通过  1、同意  2、续议  3、拒绝 */
    private String passFlag;

    /** 汇总意见 所有投票人的意见汇总 */
    private String allOpinion;

    /** 签名 */
    private String sign;

    /** 签名日期  yyyy-MM-dd */
    private String signDate;


    public DataForm() {
    }

    public DataForm(String companyName, String year, String month, String day, String meetingTheme, String meetingType, String passFlag, String allOpinion, String sign, String signDate) {
        this.companyName = companyName;
        this.year = year;
        this.month = month;
        this.day = day;
        this.meetingTheme = meetingTheme;
        this.meetingType = meetingType;
        this.passFlag = passFlag;
        this.allOpinion = allOpinion;
        this.sign = sign;
        this.signDate = signDate;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getMonth() {
        return month;
    }

    public void setMonth(String month) {
        this.month = month;
    }

    public String getDay() {
        return day;
    }

    public void setDay(String day) {
        this.day = day;
    }

    public String getMeetingTheme() {
        return meetingTheme;
    }

    public void setMeetingTheme(String meetingTheme) {
        this.meetingTheme = meetingTheme;
    }

    public String getMeetingType() {
        return meetingType;
    }

    public void setMeetingType(String meetingType) {
        this.meetingType = meetingType;
    }

    public String getPassFlag() {
        return passFlag;
    }

    public void setPassFlag(String passFlag) {
        this.passFlag = passFlag;
    }

    public String getAllOpinion() {
        return allOpinion;
    }

    public void setAllOpinion(String allOpinion) {
        this.allOpinion = allOpinion;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public String getSignDate() {
        return signDate;
    }

    public void setSignDate(String signDate) {
        this.signDate = signDate;
    }
}

3. 表单行数据循环对象

/**
 * 投票详情
 */
public class VoteInfo {

    /** 投票人名称 */
    private String voterName;

    /** 投票结果  1、同意  2、续议  3、拒绝  4、回避 */
    private String voteResult;

    /** 投票意见 */
    private String voteOpinion;


    public VoteInfo() {
    }

    public VoteInfo(String voterName, String voteResult, String voteOpinion) {
        this.voterName = voterName;
        this.voteResult = voteResult;
        this.voteOpinion = voteOpinion;
    }

    public String getVoterName() {
        return voterName;
    }

    public void setVoterName(String voterName) {
        this.voterName = voterName;
    }

    public String getVoteResult() {
        return voteResult;
    }

    public void setVoteResult(String voteResult) {
        this.voteResult = voteResult;
    }

    public String getVoteOpinion() {
        return voteOpinion;
    }

    public void setVoteOpinion(String voteOpinion) {
        this.voteOpinion = voteOpinion;
    }
}

四、参考或相关文档

poi-tl官方文档
poi-tl导出word, 含表格单元格合并,表格单元格多图合并
poi-tl导出复杂word/pdf文档文章来源地址https://www.toymoban.com/news/detail-848262.html

到了这里,关于JAVA poi-tl 制作word模板 表格数据行循环 带有复选框勾选的表格的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • POI-TL制作word

    本文相当于笔记,主要根据官方文档Poi-tl Documentation和poi-tl的使用(最全详解)_JavaSupeMan的博客-CSDN博客文章进行学习(上班够用) 两个实体类 下边测试类 word模板  生成结果:   如果想生成柱状图等,按照官网进行学习即可,以上两篇(官网,和博客学习够用)

    2024年02月10日
    浏览(52)
  • poi-tl导出word复杂表格(单元格合并,生成复杂表格)

    官方文档地址:http://deepoove.com/poi-tl/ 源码地址:https://github.com/Sayi/poi-tl poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。 最近在做项目时候有一个关于导出Word的文件的需求,需要导出的word文件较大,并且格式比较复杂,使用poi-tl可以很好的

    2024年02月16日
    浏览(49)
  • 根据模板动态生成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日
    浏览(53)
  • poi-tl设置图片(通过word模板替换关键字,然后转pdf文件并下载)

    选中图片右击  选择设置图片格式   例如word模板   maven依赖   读取  代码

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

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

    2024年02月16日
    浏览(68)
  • Spring Boot 中使用 Poi-tl 渲染数据并生成 Word 文档

    本文 Demo 已收录到 demo-for-all-in-java 项目中,欢迎大家 star 支持!后续将持续更新! 产品经理急冲冲地走了过来。「现在需要将按这些数据生成一个 Word 报告文档,你来安排下」 项目中有这么一个需求,需要将用户填写的数据填充到一个 Word 文档中,而这个 Word 文档是人家给

    2024年02月09日
    浏览(50)
  • java使用poi-tl导出word及转换PDF后的合并导出pdf

    为某单位开发的一款项目申报审批系统,用户需求在申报阶段填写的信息资料能够导出PDF。且项目申报的报告正文为用户上传,所以需要合并导出。 在项目初期阶段使用的是PDF的预设模板导出,因为以前使用过,比较熟悉。所以优先选择此方法,但项目测试阶段发现问题,因

    2024年02月06日
    浏览(82)
  • Java使用poi-tl1.9.1生成Word文档的几个小技巧

    目录 前言 一、poi-tl简介 1、什么是poi-tl 2、常见的word生成对比 3、poi-tl功能点 二、poi-tl文档生成 1、模板准备 2、目标参数填充 3、生成效果  三、可能会遇到的问题 1、混合图表生成报错 2、图表参数设置技巧  总结         也许在您的工作当中会碰到如下的一些场景,比

    2024年02月16日
    浏览(51)
  • poi-tl的使用(动态表格的生成)

    注意apache.poi版本要对应 创建两个文件夹,一个是用来存储模板文件,另一个是用来存储生成的文件 准备一个word模板,命名为test.docx, 注意,{{}}是官方指定的格式,也可以自定义。 [ ] 是可替换的属性 可以是多个 代码 生成文件 参考: 使用最全 讲解最全

    2024年02月13日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包