Java导出word文件

后端

创建word模板使用的是:FreeMarker,如何制作可以搜到很多的文章

获取word模板工具类

package com.jtkj.utils;

import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import freemarker.template.Configuration;
import freemarker.template.Template;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Locale;
import java.util.Map;


public class ToWord {

    private static Configuration configuration = null;
    //注意这个地方的path是Word文档所在的路径
    private static final String templateFolder = ToWord.class.getClassLoader ().getResource ("").getPath ();

//判断当前项目是在windows服务器还是在其他服务器,用来存放模板文件;如果是本地的话模板存放在项目下的resources文件夹下,线上服务器的话需要自己创建文件夹存放模板文件
    static {
        configuration = new Configuration ();
        configuration.setDefaultEncoding ("utf-8");
        try {
            String Os = System.getProperty("os.name").toLowerCase(Locale.US);
            if (Os.indexOf("Window") >= 0 || Os.indexOf("window") >= 0) {
                configuration.setDirectoryForTemplateLoading (new File (templateFolder));
            }else {
            //线上模板所在地址
                configuration.setDirectoryForTemplateLoading (new File ("服务器存放word模板地址"));
            }
        } catch (IOException e) {
            e.printStackTrace ();
        }
    }

    private ToWord() {
        throw new AssertionError ();
    }

    public static void exportMillCertificateWord (HttpServletResponse response, Map map,int i) {
        String name=null,tille = null;
        Template freemarkerTemplate;
        try {
            //根据自己在controller传的i值添加case和自己模板名
            switch (i){
                case 1:
                    tille="ftl/SFYWRCYW";
                    name= "xxx";
                    break;
                case 2:
                    tille="ftl/SFYWRCYWZD";
                    //文件名
                    name= "xxx";
                    break;
                case 3:
                    tille="ftl/YWLXDGL";
                    name= "xxx";
                    break;
                default:
                    System.out.println("---111---");;
            }
            freemarkerTemplate = configuration.getTemplate (tille+".ftl");
            //freemarkerTemplate = configuration.getTemplate (tille+".ftl");
            File file = null;
                // 调用工具类的createDoc方法生成Word文档
                file = createDoc (map, freemarkerTemplate);
                response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(name+".doc", "UTF-8"));
                //读取要下载的文件,保存到文件输入流
                FileInputStream in = new FileInputStream(file);
                //创建输出流
                OutputStream out = response.getOutputStream();
                //创建缓冲区
                byte buffer[] = new byte[1024];
                int len = 0;
                //循环将输入流中的内容读取到缓冲区当中
                while ((len = in.read(buffer)) > 0) {
                    //输出缓冲区的内容到浏览器,实现文件下载
                    out.write(buffer, 0, len);
                }
                //关闭文件输入流
                in.close();
                //关闭输出流
                out.close();
        } catch (IOException e) {
            e.printStackTrace ();
        }
    }


    private static File createDoc (Map<?, ?> dataMap, Template template) {
        String name = "xxx";
        File f = new File (name);
        Template t = template;
        try {
            // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
            Writer w = new OutputStreamWriter (new FileOutputStream (f), "utf-8");
            t.process (dataMap, w);
            w.close ();
        } catch (Exception ex) {
            ex.printStackTrace ();
            throw new RuntimeException (ex);
        }
        return f;
    }
}

controller接口

获取需要导出的数据装到map中,然后调用工具类中的方法将数据放到word模板里,前端调用此方法下载word文件

 /**
     * 导出word
     *
     * @return
     */
    @ApiOperation("导出word")
    @GetMapping("/Model/Config/Word/{ids}")
    public void exporWord(@PathVariable("ids") String id, HttpServletResponse response) throws IOException {
        MajorEventsEntity majorEvents = majorEventsService.getById(id);
        BaseEventInfoEntity infoEntity = baseEventInfoService.getInfo(majorEvents.getFauequipment());
        Map<String,Object> map = new HashMap<>();
        //map中的key和模板的{}中的字段一一对应
        map.put("faultSite",majorEvents.getFaultSite());
        map.put("fauEquipment",infoEntity.getName());
        map.put("faultTime",majorEvents.getFaultTime());
        map.put("fauCondition",majorEvents.getFaucondition());
        map.put("accidentImpact",majorEvents.getAccidentImpact());
        map.put("responsibleParty",majorEvents.getResponsibleParty());
        map.put("resPartTel",majorEvents.getRespartTel());
        map.put("faultReason",majorEvents.getFaultReason());
        map.put("handleSituation",majorEvents.getHandleSituation());
        map.put("recoveryTime",majorEvents.getRecoveryTime());
        ToWord.exportMillCertificateWord(response,map,2);
    }

前端

给table每条数据加导出按钮

<el-button type="text" :disabled="scope.row.flowState!==2"
                         @click="exportWord(scope.row.id,scope.row.eventName)"  >导出word
              </el-button>
 exportWord(id,eventName) {
      this.$confirm('您确定要导出当前数据, 是否继续?', '提示', {
        type: 'warning'
      }).then(() => {
        request({
          url: `/api/business/MajorEvents/Model/Config/Word/${id}`,
          method: 'get',
          responseType: 'blob',
        }).then(res => {
          //设置下载word文件的文件名
          this.handleDownLoadFile(res,"doc","重大事件--"+eventName+"记录表.doc")
        })
      }).catch(() => {
      })
    },
    //word文件下载
    handleDownLoadFile(response, type, fileName) {
      let blob = new Blob([response], {
        type: type + ';charset=utf-8'
      });
      let src = window.URL.createObjectURL(blob);
      if (src) {
        let link = document.createElement('a');
        link.style.display = 'none';
        link.href = src;
        link.setAttribute('download', fileName);
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link); //下载完成移除元素
        window.URL.revokeObjectURL(src); //释放掉blob对象
      }
    },

你可能感兴趣的:(java,word,vue)