POI-TL导出带循环块和图片的word

  1. 导入依赖:
<dependency>
    <groupId>org.jeecgframework</groupId>
    <artifactId>autopoi-web</artifactId>
    <version>1.4.5</version>
    <exclusions>
        <exclusion>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
        <groupId>com.deepoove</groupId>
        <artifactId>poi-tl</artifactId>
        <version>1.10.0</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.4.1</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.4.1</version>
</dependency>
  1. 创建word模板,并放到项目的resources/docx-template下:

    image.png

    模板内容:
    image.png

  2. resources所在的模块po中加入以下内容,否则会报错(org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException: No valid entries or contents found, this is not a valid OOXML (Office Open XML) file):

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <nonFilteredFileExtensions>
                        <nonFilteredFileExtension>woff</nonFilteredFileExtension>
                        <nonFilteredFileExtension>woff2</nonFilteredFileExtension>
                        <nonFilteredFileExtension>eot</nonFilteredFileExtension>
                        <nonFilteredFileExtension>ttf</nonFilteredFileExtension>
                        <nonFilteredFileExtension>svg</nonFilteredFileExtension>
                        <nonFilteredFileExtension>docx</nonFilteredFileExtension>
                        <nonFilteredFileExtension>doc</nonFilteredFileExtension>
                        <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
                        <nonFilteredFileExtension>xls</nonFilteredFileExtension>
                    </nonFilteredFileExtensions>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
                <includes>
                    <include>**/*.docx</include>
                    <include>**/*.xlsx</include>
                    <include>**/*.pptx</include>
                    <include>**/*.png</include>
                    <include>**/*.jpg</include>
                    <include>**/*.gif</include>
                    <include>**/*.pdf</include>
                    <include>**/*.ttf</include>
                    <include>**/*.woff</include>
                    <include>**/*.woff2</include>
                    <include>**/*.eot</include>
                    <include>**/*.svg</include>
                    <include>**/*.zip</include>
                    <include>**/*.rar</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <excludes>
                    <exclude>**/*.docx</exclude>
                    <exclude>**/*.xlsx</exclude>
                    <exclude>**/*.pptx</exclude>
                    <exclude>**/*.png</exclude>
                    <exclude>**/*.jpg</exclude>
                    <exclude>**/*.gif</exclude>
                    <exclude>**/*.pdf</exclude>
                    <exclude>**/*.ttf</exclude>
                    <exclude>**/*.woff</exclude>
                    <exclude>**/*.woff2</exclude>
                    <exclude>**/*.eot</exclude>
                    <exclude>**/*.svg</exclude>
                    <exclude>**/*.zip</exclude>
                    <exclude>**/*.rar</exclude>
                </excludes>
            </resource>
        </resources>
    </build>
  1. 写代码:
@GetMapping(value = "/printBarCode")
public void printBarCode(@RequestParam(name = "ids") String ids, HttpServletResponse response) {
    if (oConvertUtils.isEmpty(ids)) {
        throw new RuntimeException("请选择要导出的数据");
    }

        # DataVO中的字段对应word模板中的参数
    List<DataVO> voList = dataService.printBarCode(Arrays.asList(ids.split(",")));

    try {
        for (DataVO vo : voList) {
            Object barCodeObj = createBarcode(vo.getBarCode());
            vo.setBarCodeImage(barCodeObj);
        }

        Map<String, Object> params = new HashMap<>();
        params.put("voList", voList);
        InputStream inputStream = new ClassPathResource("docx-template/DataVO.docx").getInputStream();
        XWPFTemplate render = XWPFTemplate.compile(inputStream).render(params);
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition","attachment;filename=" + URLEncoder.encode("数据打印.docx", "UTF-8"));
        OutputStream os = response.getOutputStream();
        render.writeAndClose(os);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

// 生成条码图片对象
private Object createBarcode(String content) throws Exception {
    int w = 400, h = 120;
    Map<EncodeHintType, Object> hints = new HashMap<>();
    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    hints.put(EncodeHintType.MARGIN, 0);
    BitMatrix matrix = new MultiFormatWriter().encode(content, BarcodeFormat.CODE_128, w, h, hints);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    MatrixToImageWriter.writeToStream(matrix, "PNG", baos);
    return Pictures.ofBytes(baos.toByteArray()).size(w, h).create();
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容