easypoi導出word附帶圖片介紹及注意點


easypoi導出word帶圖片
 
一、導入pom包
        
<!-- easypoi處理excel -->
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>4.1.1</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>4.1.1</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>4.1.1</version>
</dependency>
<!-- poi處理excel -->
 
二、工具類
 
package com.zybimer.tools.utils;
import cn.afterturn.easypoi.word.WordExportUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.util.Assert;
 
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;
public class ExportWordUtils {
 
 
    /**
     * 導出word
     * <p>第一步生成替換后的word文件,只支持docx</p>
     * <p>第二步下載生成的文件</p>
     * <p>第三步刪除生成的臨時文件</p>
     * 模版變量中變量格式:{{foo}}
     * @param templatePath word模板地址
     * @param temDir 生成臨時文件存放地址
     * @param fileName 文件名
     * @param params 替換的參數
     * @param request HttpServletRequest
     * @param response HttpServletResponse
     */
    public static void exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {
        Assert.notNull(templatePath,"模板路徑不能為空");
        Assert.notNull(temDir,"臨時文件路徑不能為空");
        Assert.notNull(fileName,"導出文件名不能為空");
        Assert.isTrue(fileName.endsWith(".docx"),"word導出請使用docx格式");
        if (!temDir.endsWith("/")){
            temDir = temDir + File.separator;
        }
        File dir = new File(temDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        try {
            String userAgent = request.getHeader("user-agent").toLowerCase();
            if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
                fileName = URLEncoder.encode(fileName, "UTF-8");
            } else {
                fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
            }
            XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
            String tmpPath = temDir + fileName;
            FileOutputStream fos = new FileOutputStream(tmpPath);
            doc.write(fos);
            // 設置強制下載不打開
            response.setContentType("application/force-download");
            // 設置文件名
            response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
            OutputStream out = response.getOutputStream();
            doc.write(out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            delFileWord(temDir,fileName);//這一步看具體需求,要不要刪
        }
    }
    /**
     * 刪除零時生成的文件
     */
    public static void delFileWord(String filePath, String fileName){
        File file =new File(filePath+fileName);
        File file1 =new File(filePath);
        file.delete();
        file1.delete();
    }
 
 
}

 

 
三、調用
@Override
    public void exportWord(PbpGroupCostDto resources, HttpServletRequest request, HttpServletResponse response) throws IOException {
        Map<String,Object> groupCost = new HashMap<>();
        response.setContentType("application/octet-stream");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        String reportDate = sdf.format(resources.getDate());
        String filename = resources.getGroupName()+reportDate+".docx";
        ImageEntity image = new ImageEntity();
        image.setHeight(50);
        image.setWidth(150);
        String sourceFilePath = getUploadFilePathByLocation(resources.getSignatureUpImg()); // 源文件的磁盤位置
        image.setData(image2byte(sourceFilePath));
        image.setType(ImageEntity.Data);
        groupCost.put("img1", image);
        ExportWordUtils.exportWord("template/tourFeeReport.docx","D:/groupCost",filename,groupCost,request,response);
    }
    //使用Url到不出來,只有轉成base64字節數組才能導出
    //圖片到byte數組
    public byte[] image2byte(String path){
        byte[] data = null;
        FileImageInputStream input = null;
        try {
            input = new FileImageInputStream(new File(path));
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int numBytesRead = 0;
            while ((numBytesRead = input.read(buf)) != -1) {
                output.write(buf, 0, numBytesRead);
            }
            data = output.toByteArray();
            output.close();
            input.close();
        }
        catch (FileNotFoundException ex1) {
            ex1.printStackTrace();
        }
        catch (IOException ex1) {
            ex1.printStackTrace();
        }
        return data;
    }

四、注意點本人使用的是新版本的easypoi該版本貌似不支持setUrl導出,只支持base64位碼導出。最好使用新版的easypoi因為新版本支持{{fe:list }}橫向和縱向循環。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM