java导出word文档

        在项目中有的时候需要导出文件,一般情况下都是Excel文件。但是有时候也是需要导出word文件。今天我就根据以前的项目,修改的导出word文件的方法。

一、设置word文件模板

       新建一个word文档,设置好需要导出的文件的格式。将文件后缀修改为: .ftl;将需要填入数据的地方修改为:${station} 格式;

{ }中的字段不是乱设的,后面有用到。

二、获取数据后,将数据按模板的字段设置到map中

    Service代码:

public Map exportFile(String id){
        TroublesDao dao = new TroublesDaoImpl();
        TroublePrintingBean bean = dao.exportFile(id);
        Map map = new HashMap();
        map.put("station" ,bean.getStation_name());
        map.put("reporter" ,bean.getReporter());
        map.put("equipment" , bean.getEqu_name());
        map.put("phone" , bean.getPhone());
        map.put("report_time" , bean.getReport_time());
        map.put("happen_time" , bean.getTrouble_happen_time());
        map.put("title" , bean.getTheme());
        map.put("msg" , bean.getLarge()+"-"+bean.getSmall()); //故障点基本信息格式:故障大类 - 故障小类
        map.put("level" , bean.getTrouble_number());
        String LatestTime = "";//最后解决时间
        try {
            String report_time = bean.getReport_time();   //上报时间
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = sdf.parse(report_time); //将String时间格式转换成Date格式
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);//设置起时间
            cal.add(Calendar.DATE, 3);//时间增加3天;最后上报时间格式为:上报时间+故障点时效(72小时,即3天)
            LatestTime = sdf.format(cal.getTime());//最后解决时间
        } catch (ParseException e) {
            e.printStackTrace();
        }
        map.put("last_finish_time" , LatestTime);
        map.put("remark" , bean.getTrouble_describe());
        //下面两个字段虽然是空的,但是不能删。应为ftl模板文件中给了他们占位符,删除了会在导出文件时出异常。以后需要有数据时替换空字符串就好
        map.put("analysis" , "");//故障分析
        map.put("deal_way" , "");//解决方法
        return map;
    }

三、用IO流输出

     Controller代码:

/**
     * 导出
     * return 0:导出成功;1:导出异常
     */
    @Override
    @RequestMapping("/exportFile")
    @ResponseBody
    public String exportFile(HttpServletRequest request){
        String id = request.getParameter("id");
        Map map= new TroublesServiceImpl().exportFile(id);
        Configuration configuration = new Configuration();
        configuration.setDefaultEncoding("UTF-8");
       String path =  request.getSession().getServletContext().getRealPath("/files");//获取webroot文件下的files文件夹路径
        Template t = null;
        try {
            configuration.setDirectoryForTemplateLoading(new File(path));  //FTL文件所存在的位置
            t = configuration.getTemplate( File.separator + "trouble_model.ftl","UTF-8"); //文件名;File.separator:获取当前系统的路径斜杠
            File outFile = new File(path +File.separator + map.get("station")+"-"+map.get("title")+".doc");//设置导出的文件路径;导出的文件名为:油站名-故障主题
            FileOutputStream fos = new FileOutputStream(outFile);
            OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
            Writer out = new BufferedWriter(osw);
            t.process(map, out);
            if (fos != null){
                fos.close();
            }
            if(osw != null){
                osw.close();
            }
            if(out != null){
                out.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "1";
        }
        return "0";
    }

开发时遇到的BUG一:

        在导出文件后,打开文件时,报:文件被java …… 占用,无法操作;引起这种原因是输出流没有关闭,一直占着这个文件,所以无法打开。

       解决方法:关闭流;

开发时遇到的BUG二:

      导出文件后,打开文件时,报:根据结构,XML数据无效;

      java导出word文档_第1张图片

      解决方法:

      在下面的代码中,都要加上UTF-8;

configuration.setDefaultEncoding("UTF-8");
t = configuration.getTemplate( File.separator + "trouble_model.ftl","UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");

 

你可能感兴趣的:(IO,项目随笔,后端)