zoukankan      html  css  js  c++  java
  • java 导出数据为word文档(保持模板格式)

    导出数据到具体的word文档里面,word有一定的格式,需要保持不变

    这里使用freemarker来实现:

    ①:设计好word文档格式,需要用数据填充的地方用便于识别的长字符串替换  如  aaaaaaaaaaaaaaaa

    ②:将word文档另存为 2003 xml格式

    ③:找到需要替换的地方, 如 将 aaaaaaaaaaaa 修改为 ${userName}

          如果是list展示,注意按照如下方式修改:

           

    <#list list1 as list1Item>
    
       XXXXXXXXXXXXXXXXXX 原有格式代码  如一行数据或者一个单元格
    
    </#list>

    ④:替换完成后,将xml文件后缀修改为ftl

    java代码如下:

    package com.xiao;
    
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class Main {
    
        public static void main(String[] args) throws UnsupportedEncodingException {
            Map<String, Object> dataMap = new HashMap<String, Object>();
            dataMap.put("name", "肖昌伟");
            dataMap.put("depart", "云平台");
            dataMap.put("date", "2016年");
    
        //列表数据封装 List
    <String> list1 = new ArrayList<String>(); list1.add("itema"); list1.add("itemb"); list1.add("itemc"); dataMap.put("list1", list1); DocumentHandler mdoc = new DocumentHandler(); mdoc.createDoc(dataMap, "E:/outFile2.doc"); } }
    package com.xiao;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.UnsupportedEncodingException;
    import java.io.Writer;
    import java.util.Map;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    
    public class DocumentHandler {
    
        private Configuration configuration = null;
    
        public DocumentHandler() {
            configuration = new Configuration();
            configuration.setDefaultEncoding("utf-8");
        }
    
        public void createDoc(Map<String, Object> dataMap, String fileName) throws UnsupportedEncodingException {
            //需要导出模板的包路径
            configuration.setClassForTemplateLoading(this.getClass(), "/com/xiao");
            Template t = null;
            try {
                t = configuration.getTemplate("template.ftl");
            } catch (IOException e) {
                e.printStackTrace();
            }
            File outFile = new File(fileName);
            Writer out = null;
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(outFile);
                OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");
                out = new BufferedWriter(oWriter);
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }
    
            try {
                t.process(dataMap, out);
                out.close();
                fos.close();
            } catch (TemplateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            System.out.println("文档导出完成");
        }
    }

    这样就可以看到填充好了数据的word文档,格式和模板设置的保持一致。

    ps:

    如果是web项目,需要点击下载后弹出另存为或者保存提示框,则请按照下面代码修改,通过reponse将生成的文件以流形式保存到用户指定的位置:

    通过web下载文件

    public void download(HttpServletRequest request, HttpServletResponse response)
      throws Exception {
      try {
      File f = new File(文件路径);
      FileInputStream fin = new FileInputStream(f);
      response.reset();//设置为没有缓存
      response.setContentType("application/x-download;charset=GBK");
      response.setHeader("Content-Disposition", "attachment;filename="+ Util.getGBK_ISO(ft.getFilename()));
      /*attachment是以附件下载的形式,inline是以线上浏览的形式。当点击“保存”的时候都可以下载,当点击“打开”的时候attachment是在本地机里打开,inline是在浏览器里打开。*/
      OutputStream output = response.getOutputStream();
      byte[] buf = new byte[1024];
      int r = 0;
      while ((r = fin.read(buf, 0, buf.length)) != -1) {
      output.write(buf, 0, r);
      }
      response.getOutputStream().flush();
      response.getOutputStream().close();
      
      } catch (Exception e) {
      
      }
    }

    建议采用 freemarker-2.3.13.jar 版本,刚开始不是用的这一个版本,遇见了稀奇古怪的问题

  • 相关阅读:
    指针数组和数组指针表示二维数组
    scanf与getchar()区别
    选择循环
    朴素的思想
    asp.net中word转html碰到的权限异常问题(转)
    MAC下安装Fiddler抓包工具
    抓包工具charles的使用
    mysql 命令大全
    利用反射拼接SQL查询条件字符串
    赚自己的淘宝佣金,让返利网无路可走
  • 原文地址:https://www.cnblogs.com/xiaochangwei/p/5220688.html
Copyright © 2011-2022 走看看