国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java實現用Freemarker完美導出word文檔(帶圖片)

Java實現用Freemarker完美導出word文檔(帶圖片)

2020-12-02 14:29朝霧輕寒 Java教程

這篇文章主要介紹了Java實現用Freemarker完美導出word文檔(帶圖片),具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

最近在項目中,因客戶要求,將頁面內容(如合同協議)導出成word,在網上翻了好多,感覺太亂了,不過最后還是較好解決了這個問題。

準備材料

1.word原件 2.編輯器(推薦Firstobject free XML editor)

實現步驟

1.用Microsoft Office Word打開word原件;

2.把需要動態修改的內容替換成***,如果有圖片,盡量選擇較小的圖片幾十K左右,并調整好位置;

3.另存為,選擇保存類型Word 2003 XML 文檔(*.xml)【這里說一下為什么用Microsoft Office Word打開且要保存為Word 2003XML,本人親測,用WPS找不到Word 2003XML選項,如果保存為Word XML,會有兼容問題,避免出現導出的word文檔不能用Word 2003打開的問題】;

4.用Firstobject free XML editor打開文件,選擇Tools下的Indent【或者按快捷鍵F8】格式化文件內容。左邊是文檔結構,右邊是文檔內容;

5. 將文檔內容中需要動態修改內容的地方,換成freemarker的標識。其實就是Map<String, Object>中key,如${landName};

6.在加入了圖片占位的地方,會看到一片base64編碼后的代碼,把base64替換成${image},也就是Map<String, Object>中key,值必須要處理成base64;

代碼如:<w:binData w:name="wordml://自定義.png" xml:space="preserve">${image}</w:binData>

注意:“>${image}<”這尖括號中間不能加任何其他的諸如空格,tab,換行等符號。

如果需要循環,則使用:<#list maps as map></#list>  maps是Map<String, Object>中key,值為數組,map為自定義;

7. 標識替換完之后,模板就弄完了,另存為.ftl后綴文件即可。注意:一定不要用word打開ftl模板文件,否則xml內容會發生變化,導致前面的工作白做了。

代碼實現

工具類WordUtils.Java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Date;
import java.util.Map;
 
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import freemarker.template.Configuration;
import freemarker.template.Template;
 
public class WordUtils {
  //配置信息,代碼本身寫的還是很可讀的,就不過多注解了
 private static Configuration configuration = null;
 //這里注意的是利用WordUtils的類加載器動態獲得模板文件的位置
 // private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath() + "WEB-INF/templetes/";
 private static final String templateFolder = "H:/我的項目/lm/lm/web/src/main/webapp/WEB-INF/templates";
 static {
  configuration = new Configuration();
  configuration.setDefaultEncoding("utf-8");
  try {
   configuration.setDirectoryForTemplateLoading(new File(templateFolder));
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 private WordUtils() {
  throw new AssertionError();
 }
 
 public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map,String title,String ftlFile) throws IOException {
  Template freemarkerTemplate = configuration.getTemplate(ftlFile);
  File file = null;
  InputStream fin = null;
  ServletOutputStream out = null;
  try {
   // 調用工具類的createDoc方法生成Word文檔
   file = createDoc(map,freemarkerTemplate);
   fin = new FileInputStream(file);
 
   response.setCharacterEncoding("utf-8");
   response.setContentType("application/msword");
   // 設置瀏覽器以下載的方式處理該文件名
   String fileName = title+DateUtil.formatDateDetailTime(new Date()) + ".doc";
   response.setHeader("Content-Disposition", "attachment;filename="
     .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
 
   out = response.getOutputStream();
   byte[] buffer = new byte[512]; // 緩沖區
   int bytesToRead = -1;
   // 通過循環將讀入的Word文件的內容輸出到瀏覽器中
   while((bytesToRead = fin.read(buffer)) != -1) {
    out.write(buffer, 0, bytesToRead);
   }
  } finally {
   if(fin != null) fin.close();
   if(out != null) out.close();
   if(file != null) file.delete(); // 刪除臨時文件
  }
 }
 
 private static File createDoc(Map<?, ?> dataMap, Template template) {
  String name = "sellPlan.doc";
  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;
 }
}

Action

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@RequestMapping("/exportSellPlan")
 public @ResponseBody void exportSellPlan(Long id){
  Calendar calendar = Calendar.getInstance();// 取當前日期。
  if(id!=null){
   SellPlan plan=sellService.getSellPlanInfo(id);
    //獲得數據
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("bYear", plan.getBusinessYear()!=null?plan.getBusinessYear():"");
   map.put("lYear", plan.getLiveYear()!=null?plan.getLiveYear():"");
   map.put("leader",plan.getLeader()!=null?plan.getLeader():"");
   map.put("phone", plan.getPhone()!=null?plan.getPhone():"");
   map.put("curYear", calendar.get(Calendar.YEAR)+"");
   map.put("image", getImageBase(plan.getPositionImage()));
   try {
    WordUtils.exportMillCertificateWord(getRequest(),getResponse(),map,"方案","sellPlan.ftl");
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }

Base64處理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//獲得圖片的base64碼
 @SuppressWarnings("deprecation")
 public String getImageBase(String src) {
  if(src==null||src==""){
   return "";
  }
  File file = new File(getRequest().getRealPath("/")+src.replace(getRequest().getContextPath(), ""));
  if(!file.exists()) {
   return "";
  }
  InputStream in = null;
  byte[] data = null;
  try {
   in = new FileInputStream(file);
  } catch (FileNotFoundException e1) {
   e1.printStackTrace();
  }
  try {
   data = new byte[in.available()];
   in.read(data);
   in.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  BASE64Encoder encoder = new BASE64Encoder();
  return encoder.encode(data);
 }

Javascript

?
1
window.location.href="<%=path%>/exportSellPlan?id=" rel="external nofollow" + id;

結束語

如果對Freemarker標簽不熟的,可以在網上先學習下,了解文檔結構。

相關鏈接

Firstobject free XML editor下載地址:http://www.firstobject.com/dn_editor.htm

freemarker 官網:http://freemarker.org/

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/zwqh/p/7182953.html?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 91视频8mav | 国产精品网站在线观看 | 亚洲成人av免费看 | 操老逼 | 波多野吉衣网站 | 亚洲欧美国产日韩综合 | 天天操天天干天天插 | 国产精品久久久久白丝呻吟 | 91嫩草视频在线 | 国产精品免费av | 国产永久网站 | av黄网站| 欧美第一网站 | 寡妇性视频免费高清播放器 | 精品福利一区二区三区免费视频 | 超碰在线人人草 | 艹逼逼视频 | 不卡久久 | 色婷婷精品久久二区二区蜜臂av | 亚洲视频 中文字幕 | 成人精品鲁一区一区二区 | 国产婷婷色一区二区三区 | 一本色道久久综合狠狠躁的推荐 | 久久这里有精品视频 | 成人精品久久久 | 香蕉视频在线看 | 操操网 | 91香蕉 | 欧美日韩激情 | 亚洲xxxxx | 国产av毛片 | 国产在线欧美 | 中文字幕亚洲一区 | 一区视频在线 | 国产高清一区二区 | 欧美日本精品 | 欧美激情在线精品一区二区三区 | 国产美女久久久 | 一区二区三区中文字幕 | 欧美大成色www永久网站婷 | 欧美一区二区高清视频 |