java如何导出word和wps文档

使用场景:打开一个表单页面,导出word或wps文件,代码框架基于springboot+jpa

一、准备word模板

在这里插入图片描述

二、pom.xml文件中引入依赖

<dependency>
     <groupId>cn.afterturn</groupId>
     <artifactId>easypoi-base</artifactId>
     <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>3.0.3</version>
</dependency>

三、构造ExportWord工具类,里面包含导出word和导出wps两种方法
导出文件工具类中的文件流一定要按照最先使用的最后关闭原则,否则会造成临时文件删除不了的问题。导出wps的方法就是在导出word方法的基础上将临时文件内容写入到下载的wps文件中。

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.*;
import java.net.URLEncoder;
import java.util.Map;

public class ExportWord {
     /**
     * 导出word
     * <p>第一步生成替换后的word文件,只支持docx</p>
     * <p>第二步下载生成的文件</p>
     * <p>第三步删除生成的临时文件</p>
     * @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(temDir,"导出文件名不能为空");
        Assert.isTrue(fileName.endsWith(".docx"),"word导出请使用docx格式");
        FileOutputStream fos = null;
        OutputStream out = null;
        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;
            fos = new FileOutputStream(tmpPath);
            doc.write(fos);
            //设置强制下载不打开
            response.setContentType("application/force-download");
            //设置文件名
            response.addHeader("Content-Disposition","attachment;fileName=" + fileName);
            out = response.getOutputStream();
            doc.write(out);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                out.close();
                fos.close();
                delFileWord(temDir,fileName);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 删除临时生成的文件
     */
    public static void delFileWord(String filePath,String fileName){
        File file = new File(filePath + fileName);
        File file1 = new File(filePath);
        file.delete();
        file1.delete();
    }

     /**
     * 导出wps
     * <p>第一步生成替换后的word文件,只支持docx</p>
     * <p>第二步将临时word文件内容复制到下载生成的wps文件中</p>
     * <p>第三步删除生成的临时文件</p>
     * @param templatePath word模板地址
     * @param temDir 生成临时文件存放地址
     * @param fileName 文件名
     * @param params 替换的参数
     * @param request HttpServletRequest
     * @param response HttpServletResponse
     */
    public static void exportWps(String templatePath, String temDir,String fileName,Map<String,Object> params,  HttpServletRequest request, HttpServletResponse response){
        FileOutputStream fos = null;
        InputStream input = null;
        BufferedInputStream bins=null;
        OutputStream outs = null;
        BufferedOutputStream bouts = null;
        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;
            fos= new FileOutputStream(tmpPath);
            doc.write(fos);
            input = new FileInputStream(tmpPath);
            bins = new BufferedInputStream(input);
            outs = response.getOutputStream();
            bouts = new BufferedOutputStream(outs);
            response.setContentType("application/x-download");
            response.setHeader("Content-Disposition","attachment;fileName=" + fileName);        
            int bytesRead=0;
            byte[] buffer = new byte[8192];
            while((bytesRead = bins.read(buffer,0,8192))!=-1){
                 bouts.write(buffer,0,bytesRead);
            }
            bouts.flush();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                bouts.close();
                outs.close();
                bins.close();
                input.close();
                fos.close();    
                delFileWord(temDir,fileName);
            }catch (Exception e){
                e.printStackTrace();
            }

        }
    } 
}

四、Controller层代码

/**
* @param id 实体类id
* @param flag 标志位,用来判断调用导出word还是导出wps
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
@ApiOperation("导出word")
@GetMapping("/exportWord")
public void exportWord(@RequestParam String id,@RequestParam String flag,HttpServletRequest request, HttpServletResponse response) {
    handleTipService.exportWord(id,flag,request,response);   
}

五、Service实现层

@Override
public void exportWord(String id, String flag,HttpServletRequest request, HttpServletResponse response)  {
    //处理模板需要的参数信息
    List<HashMap> byId = handleTipNativeRepository.findById(id);
    String path = "";
    HashMap hashMap = byId.get(0);
    if(hashMap.get("repeatCode")!=null){
        String repeatCode = hashMap.get("repeatCode").toString();
        int length = repeatCode.split(",").length;
        hashMap.put("repeatCode",length);
    }
    try {
        //取到模板所在系统中的静态资源位置
        path = ResourceUtils.getFile("classpath:static/wps/handleTip.docx").getPath();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    //根据前端传过来的标志位判断是用word还是wps
    if(flag!=null){
        if("word".equals(flag)){
            ExportWord.exportWord(path,"test", "HandleTip.docx", hashMap,request,response);
        }else if("wps".equals(flag)){
            ExportWord.exportWps(path,"test", "HandleTip.wps", hashMap,request,response);
        }
    }
}

六、Repository实现层

@Override
public List<HashMap> findById(String id){
    String sql = " sql语句 ";
    StringBuilder whereSql = new StringBuilder(" ");
    if (StringUtils.isNotEmpty(id)) {
        whereSql.append(" and h.ID = :id ");
    }
    Query query = this.entityManager.createNativeQuery(sql+(whereSql).toString());
    if (StringUtils.isNotEmpty(id)) {
        query.setParameter("id", id);
    }
    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
    List<HashMap> list = query.getResultList();
    return list;
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值