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 版本,剛開始不是用的這一個版本,遇見了稀奇古怪的問題


免責聲明!

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



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