0
点赞
收藏
分享

微信扫一扫

SpringBoot动态导出word文档POI-TL

_阿瑶 2023-06-16 阅读 56

1、引入依赖,同步使用hutool工具进行开发

<dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.10.0</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>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.7</version>
        </dependency>


2、替换模板的方法

// 模板文件路径
File tempFile = new File(templatePath);
FileUtils.copyInputStreamToFile(in, tempFile);

// 生成word的路径
String fileDir = getClass().getClassLoader().getResource("").getPath();
// 生成word的文件
String fileName = UUID.randomUUID().toString().replace("-", "") + "_create." + templateAttach.getSuffix();

// 核心替换逻辑
String wordPath = createWord(templatePath, fileDir, fileName, param);
wordPath = wordPath.replace("\\", "/");


3、核心替换逻辑

public String createWord(String templatePath, String fileDir, String fileName, ContractWordTplReplaceParam param) {
        Assert.notNull(templatePath, "word模板文件路径不能为空");
        Assert.notNull(fileDir, "生成的文件存放地址不能为空");
        Assert.notNull(fileName, "生成的文件名不能为空");
        File dir = new File(fileDir);
        if (!dir.exists()) {
            log.info("目录不存在,创建文件夹{}!", fileDir);
            dir.mkdirs();
        }
        String filePath = fileDir +"\\"+ fileName;

        Map<String, Object> paramMap = new HashMap<>();
        // 基础信息
        paramMap.put("title", param.getTitle());

        DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
        String nowDate = dateFormat.format(new Date());
        paramMap.put("createTime", nowDate);

        DictDataItemQueryParam dictParam = new DictDataItemQueryParam();
        dictParam.setDictType("mg_contract_type");
        dictParam.setDictValue(param.getType());
        DictDataDto type = dictDataFeign.queryByTypeValue(dictParam).getData();
        paramMap.put("type", type.getDictLabel());

        dictParam.setDictType("mg_range_type");
        dictParam.setDictValue(String.valueOf(param.getRangeType()));
        DictDataDto rangeType = dictDataFeign.queryByTypeValue(dictParam).getData();
        paramMap.put("rangeType", rangeType.getDictLabel());

        paramMap.put("startTime", dateFormat.format(param.getStartTime()));
        paramMap.put("endTime", dateFormat.format(param.getStartTime()));

        paramMap.put("summary", param.getSummary());

        paramMap.put("amount", param.getAmount());

        // 列表循环
        paramMap.put("signList", param.getSignList());
        paramMap.put("productList", param.getProductList());
        paramMap.put("costList", param.getCostList());
        paramMap.put("expenseList", param.getExpenseList());

        // 读取模板渲染参数
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        Configure config = Configure.builder()
                .bind("signList", policy)
                .bind("productList", policy)
                .bind("costList", policy)
                .bind("expenseList", policy)
                .build();
        XWPFTemplate template = XWPFTemplate.compile(templatePath, config)
                .render(paramMap);
        try {
            // 将模板参数写入路径
            template.writeToFile(filePath);
            template.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return filePath;
    }

4、替换模板

文件没有办法上传,具体的可以参考百度,支持文本、列表、图片(实际上是特殊文本)的替换。



举报

相关推荐

0 条评论