支持正版!这里把官网放在开头:http://deepoove.com/poi-tl/

思想:前端端写一个word类似的前端操作台,把数据存在数据库里(一般公司里的word格式都是固定的!),在用户下载文件时调用poi-tl对应把数据填到word里面。
引入maven库

 <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi</artifactId>
     <version>5.2.3</version>
 </dependency>
 <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml</artifactId>
     <version>5.2.3</version>
 </dependency>

 <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml-schemas</artifactId>
     <version>5.2.3</version>
 </dependency>
<dependency>
	<groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.12.1</version>
 </dependency>

注意:版本号是有要求的 不配套是会报错的!
其实只引入最后一个就行了,既然做了不如一不到位把excel表格需要的jar包一起导入进来了
不需要配置类jar里自带,用起来十分方便!
只需要你创建一个word模板即可
例如:
在这里插入图片描述
样式在word里调整好就行,要注意一{{table}}是一个列表,下面是遍历的一个表格这里表格我隐藏了!字体的样式等格式都是可以在word里预设好的非常方便!
来看代码:

/**
     * 下载 会议纪要doc
     * @return
     */
    @GetMapping("/export/{mettingId}")
    public void exportCrew(HttpServletResponse response,@PathVariable Long mettingId) throws Exception {
        // 行循环实例
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        //这里可以指定一个config类,用来指定一些规则,
        Configure config = Configure.builder()
                .bind("table", policy).build();
        // 模板文件
        XWPFTemplate template = XWPFTemplate.compile( resourceLoader.getResource("classpath:/docx/" + "mettingTemplate.docx").
                getInputStream(), config);
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition","attachment;filename=\""+ "mettingTemplate.docx" +"\"");
        response.setHeader("filename","mettingTemplate.docx");
        OutputStream out = response.getOutputStream();

        YyMettingRecord yyMettingRecord = yyMettingRecordService.selectYyMettingRecordByMettingRecordId(mettingId);

        MettingDocx data = new MettingDocx();
        List<MettingEndDocx> mettingEndDocxs = new ArrayList<>();
        //第一个参数是你的源数据,第二个参数是你要复制的目标对象
        BeanUtils.copyProperties(yyMettingRecord,data);
        if (StringUtils.isNotNull(yyMettingRecord.getMettingEnd())){
            JSONArray mettingEnd = yyMettingRecord.getMettingEnd();
            List<MettingEndInfo> busLineList = JSON.parseObject(mettingEnd.toString(),new TypeReference<List<MettingEndInfo>>(){});
            for (MettingEndInfo metting: busLineList){
                StringBuffer stringBuffer = new StringBuffer();
                for (SysUser user : metting.getUsers()){
                    stringBuffer.append(user.getNickName()+" ");
                }
                MettingEndDocx tempMettingEnd = new MettingEndDocx();
                tempMettingEnd.setTaskName(metting.getTaskName());
                tempMettingEnd.setUserNames(new String(stringBuffer));
                mettingEndDocxs.add(tempMettingEnd);
            }
            data.setTable(mettingEndDocxs);
        }
        if (StringUtils.isNotNull(yyMettingRecord.getMettingJoin())){
            JSONArray mettingJoin = yyMettingRecord.getMettingJoin();
            List<SysUser> userJoins = JSON.parseObject(mettingJoin.toString(),new TypeReference<List<SysUser>>(){});
            StringBuffer stringBuffer = new StringBuffer();
            for (SysUser user : userJoins){
                stringBuffer.append(user.getNickName()+" ");
            }
            data.setMettingJoin(new String(stringBuffer));
        }
        SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        data.setMettingTime(sim.format(yyMettingRecord.getMettingTime()));
        List<SysDictData> projectManages = dictTypeService.selectDictDataByType("project_manage");
        for (SysDictData dictData : projectManages){
            if (dictData.getDictValue().equals(data.getMettingType())){
                data.setMettingType(dictData.getDictLabel());
            }
        }
        template.render(data);

        BufferedOutputStream bos = new BufferedOutputStream(out);
        template.write(bos);
        String exportFilePath = profile + "/file/upload/" + System.currentTimeMillis() + ".docx";
        template.writeToFile(exportFilePath);
        yyMettingRecordService.updateYyMettingRecord(yyMettingRecord);

        bos.flush();
        out.flush();
        PoitlIOUtils.closeQuietlyMulti(template, bos, out);
}

注://这里可以指定一个config类,用来指定一些规则,
Configure config = Configure.builder()
.bind(“table”, policy).build();

这就是自带的配置类,bind绑定的列表,就是前面说的要遍历的列表!
获取模板后数据要与模板一一对应
data类


@Data
public class MettingDocx
{
    /** 会议名称 */
    @Excel(name = "会议名称")
    private String mettingName;

    /** 会议类型(00系统用户) */
    @Excel(name = "会议类型", readConverterExp = "0=0系统用户")
    private String mettingType;

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

    /** 参会人员 */
    @TableField(typeHandler = JsonTypeHandler.class)
    private String mettingJoin;

    /** 会议纪要 */
    private String mettingContent;

    /** 会后任务 */
    @TableField(typeHandler = JsonTypeHandler.class)
    private String mettingEnd;

    /** 会后总结 */
    private String mettingSummary;

    /** 会议时间 */
    private String mettingTime;

    /** 任务名称 */
    private String taskName;

    /** 用户列表 */
    private ArrayList<SysUser> users;

    private List<MettingEndDocx> table;
}

名称要与word文档里定义的占位符一一对应!重要事说三遍!!!!
不过没对应出问题了 错误提醒也很清晰一下就能看得到!
再往下就是生成输出流,在网页就行下载了。

Logo

快速构建 Web 应用程序

更多推荐