可设置图片位置, 带图片的word导出

maven的pom.xml配置增加:
   
<dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.1.2</version>
            </dependency>

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-scratchpad</artifactId>
                <version>4.1.2</version>
            </dependency>
            <dependency>
                <groupId>com.deepoove</groupId>
                <artifactId>poi-tl</artifactId>
                <version>1.10.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.1.2</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-freemarker</artifactId>
                <version>2.6.7</version>
            </dependency>
java代码编写:

    /** word模板路径 **/
    @Value("${file.upload.templatePath}")
    private String templatePath;
    /** 文件上传路径 **/
    @Value("${file.upload.path}")
    private String path;


@RequestMapping("exportBookWord")
	public void exportBookWord(@RequestBody StandingBookDTO dto, HttpServletResponse response) {
		baseBiz.exportBookWord(dto, response);
	}

    public void exportBookWord(StandingBookDTO dto, HttpServletResponse response) {
        PageHelper.startPage(0, 500);
        List<Map> books = standingBookMapper.pageBookWord(dto);
        CustomExcelUtil excelUtil = new CustomExcelUtil();
        books.stream().forEach(book -> {
            if (StrUtil.isNotBlank(Convert.toStr(book.get("inPhotoUrl")))) {
                book.put("inPhotoUrl", excelUtil.getPic(Convert.toStr(book.get("inPhotoUrl")), path));
            } else {
                book.put("inPhotoUrl", "");
            }
            if (StrUtil.isNotBlank(Convert.toStr(book.get("outPhotoUrl")))) {
                book.put("outPhotoUrl", excelUtil.getPic(Convert.toStr(book.get("outPhotoUrl")), path));
            } else {
                book.put("outPhotoUrl", "");
            }
            if (StrUtil.isNotBlank(Convert.toStr(book.get("drivingFileFrontJson")))) {
                book.put("drivingFileFrontUrl", excelUtil.getPic(Convert.toStr(book.get("drivingFileFrontJson")), path));
            } else {
                book.put("drivingFileFrontUrl", "");
            }
            //货物状态 0: 正常开单; 1: 退货单据
            if (StrUtil.isNotBlank(Convert.toStr(book.get("cargoState")))) {
                Integer cargoState = Convert.toInt(Convert.toStr(book.get("cargoState")));
                book.put("cargoState", cargoState == 0 ? "正常开单" : cargoState == 1 ? "退货单据" : "");
            } else {
                book.put("cargoState", "");
            }
        });
        Map<String, Object> resultMap = new HashMap(8);
        resultMap.put("startTime", dto.getStartTime());
        resultMap.put("endTime", dto.getEndTime());
        resultMap.put("list", books);
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        Configure config = Configure.builder().useSpringEL().bind("standingBook", policy).build();
        try (ServletOutputStream out = response.getOutputStream();
             BufferedOutputStream bos = new BufferedOutputStream(out);
             //读取模板的文件流,并用datas替换模板标签,填充数据使用XWPFTemplate类的render(Map<String, Object> data)方法,将数据填充到模板中。其中,data参数是一个Map类型,表示占位符对应的实际数据。
             XWPFTemplate template = XWPFTemplate.compile(new File(templatePath + "/standingBookTemplate.docx"), config).render(resultMap);
             //XWPFTemplate template = XWPFTemplate.compile(new File("H:\\template\\templates\\standingBookTemplate.docx"), config).render(resultMap);
        ) {
            String filename = "运输台账列表.docx";
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
            //输出word文件流,输出后关闭流
            template.write(bos);
            bos.flush();
            out.flush();
            PoitlIOUtils.closeQuietlyMulti(template, bos, out);
        } catch (IOException e) {
            log.error("导出运输台账信息失败");
            log.error(e.getMessage(), e);
        }
    }
public class CustomExcelUtil extends ExcelUtil {   
    public String getPic(String basePic,String path) {
        //取出第一张图片
        JSONArray parse = (JSONArray) JSONArray.parse(basePic);
        JSON json = (JSON) parse.get(0);
        Map map = json.toJavaObject(Map.class);
        String filePath = String.valueOf(map.get("filePath"));
        if (StringUtils.isNotBlank(filePath)) {
            filePath = filePath.replace("preview/", "");
        }
        return path + "/upload/" + filePath;
     }
  }



application.xml配置:



file:
  upload:
     path: /usr/local
     templatePath: /usr/local/java_server/upload/wordTemplate
     size: 52428800


这个word模板起名为standingBookTemplate.docx,word模板格式语法如下所示:

vue代码如下:
 <el-button type="primary" size="mini" class="com-button width80 marginL10" v-hasPerm="'export'" @click="handleExport">导 出</el-button>




        handleExport() {
            let params = JSON.parse(JSON.stringify(this.queryParam));
            params['extendValue'] = this.extendValue;
            delete params.page;
            delete params.limit;
            params.fileName = '台账列表';
            exportObj(params).then(res => {
                this.$fileDownload(res, params.fileName + '.docx');
            });
        },



export function exportObj(data) {
    return fetch({
        url: '/standingBook/exportBookWord',
        method: 'POST',
        responseType: 'blob', // 下载文件必须有这个类型
        data
    });
}

最后导出word效果如下所示:

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Freemarker可以通过使用Apache POI库来导出图片Word文档。首先,需要在模板中定义一个图片占位符,然后在Java代码中将图片插入到占位符中。具体步骤如下: 1. 在Word模板中定义一个图片占位符,例如:${image}。 2. 在Java代码中,使用Apache POI库加载模板文件,并获取到模板中的图片占位符。 3. 使用POI的XWPFRun类创建一个新的段落,并将图片插入到段落中。 4. 将段落插入到模板中的图片占位符位置。 5. 保存生成的Word文档。 示例代码如下: ``` // 加载模板文件 FileInputStream fis = new FileInputStream("template.docx"); XWPFDocument doc = new XWPFDocument(fis); // 获取图片占位符 XWPFParagraph imagePlaceholder = doc.getParagraphs().stream() .filter(p -> p.getText().contains("${image}")) .findFirst().orElse(null); // 创建新的段落 XWPFParagraph newParagraph = doc.createParagraph(); // 插入图片到段落中 XWPFRun newRun = newParagraph.createRun(); newRun.addPicture(new FileInputStream("image.jpg"), XWPFDocument.PICTURE_TYPE_JPEG, "image.jpg", Units.toEMU(200), Units.toEMU(200)); // 将段落插入到图片占位符位置 int index = doc.getPosOfParagraph(imagePlaceholder); doc.removeBodyElement(index); doc.setParagraph(newParagraph, index); // 保存生成的Word文档 FileOutputStream fos = new FileOutputStream("output.docx"); doc.write(fos); fos.close(); ``` 注意:在使用POI插入图片时,需要指定图片的类型和大小。示例代码中使用的图片类型为JPEG,大小为200x200像素。 ### 回答2: Freemarker是一种模板引擎,可以将数据和模板结合生成静态文本,并且常见在Spring框架中使用。而导出Word图片,一般需要通过POI或者Apache POI来实现,具体步骤如下: 1.首先需要引入POI和Freemarker的jar包。 2.在模板中添加图片的占位符,例如${logo}。 3.通过Java代码将图片读入到输出流中,然后在模板中替换${logo}的内容为图片字节数组的Base64编码。 4.通过Freemarker将数据和模板结合,生成Word文件。 5.最后需要使用POIWord文件的后缀名由.ftl改为.doc或.docx,并且编写下载逻辑进行下载。 需要注意的是,在将图片插入Word文档时,可能出现图片比例失调或者无法插入图片的情况,这时需要调整插入图片的方式,可以将图片插入一个模板中,然后将模板插入到Word文档中,以保证插入的图片比例正确。 ### 回答3: FreeMarker是一种Java模板引擎,它允许使用模板生成文本输出,其中包括MS Word文档。在导出word图片时,需要使用FreeMarker的JDBC模式来检索数据和图片,然后将它们插入Word文档中。以下是导出Word图片的步骤: 1.准备Word模板:首先需要创建一个Word模板,包含需要添加文本的区域和占位符来插入图片。这可以通过在Word中创建一个新文档,添加文本和占位符,然后保存为docx文件来完成。 2.准备模板数据:使用Java代码从数据库中检索需要导出的数据和图片,并将它们作为数据模型引入FreeMarker模板引擎中。 3.将数据模型应用于模板:使用FreeMarker模板引擎将数据模型应用于Word模板中,并生成将要输出的Word文档。 4.插入图片:通过在FreeMarker模板中使用图片占位符,将图片插入到生成的Word文档中。这可以通过将图片从数据库中检索出来并使用二进制方式插入模板中来完成。 5.保存Word文档:完成所有文本和图片的插入后,将生成的Word文档保存到文件系统或输出流中即可。 在使用FreeMarker导出Word图片时,需要注意以下几点: 1.在Word模板中应该包含正确的占位符并设置样式和布局。 2.从数据库中检索图片时应该压缩和缩放图片以确保它们适合文档中的区域。 3.在插入图片时,正确处理可能出现的图片格式和分辨率问题。 4.应对可能出现的异常情况进行处理,以确保生成的Word文档具有良好的稳定性和可靠性。 总之,使用FreeMarker导出Word图片是一项需要谨慎处理的复杂任务。通过遵循以上步骤和注意事项,可以生成具有高质量和稳健性的Word文档并满足客户的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值