本篇文章給大家分享的是有關(guān)Java項目中的word文檔如何利用Freemarker進行導(dǎo)出,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)是一家集成都網(wǎng)站設(shè)計、成都做網(wǎng)站、網(wǎng)站頁面設(shè)計、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)網(wǎng)絡(luò)公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗,以探求精品塑造與理念升華,設(shè)計最適合用戶的網(wǎng)站頁面。 合作只是第一步,服務(wù)才是根本,我們始終堅持講誠信,負責任的原則,為您進行細心、貼心、認真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場環(huán)境中,互促共生。
實現(xiàn)步驟
1.用Microsoft Office Word打開word原件;
2.把需要動態(tài)修改的內(nèi)容替換成***,如果有圖片,盡量選擇較小的圖片幾十K左右,并調(diào)整好位置;
3.另存為,選擇保存類型Word 2003 XML 文檔(*.xml)【這里說一下為什么用Microsoft Office Word打開且要保存為Word 2003XML,本人親測,用WPS找不到Word 2003XML選項,如果保存為Word XML,會有兼容問題,避免出現(xiàn)導(dǎo)出的word文檔不能用Word 2003打開的問題】;
4.用Firstobject free XML editor打開文件,選擇Tools下的Indent【或者按快捷鍵F8】格式化文件內(nèi)容。左邊是文檔結(jié)構(gòu),右邊是文檔內(nèi)容;
5. 將文檔內(nèi)容中需要動態(tài)修改內(nèi)容的地方,換成freemarker的標識。其實就是Map
6.在加入了圖片占位的地方,會看到一片base64編碼后的代碼,把base64替換成${image},也就是Map
代碼如:
注意:“>${image}<”這尖括號中間不能加任何其他的諸如空格,tab,換行等符號。
如果需要循環(huán),則使用:<#list maps as map>#list> maps是Map
7. 標識替換完之后,模板就弄完了,另存為.ftl后綴文件即可。注意:一定不要用word打開ftl模板文件,否則xml內(nèi)容會發(fā)生變化,導(dǎo)致前面的工作白做了。
代碼實現(xiàn)
工具類WordUtils.Java
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的類加載器動態(tài)獲得模板文件的位置 // 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 { // 調(diào)用工具類的createDoc方法生成Word文檔 file = createDoc(map,freemarkerTemplate); fin = new FileInputStream(file); response.setCharacterEncoding("utf-8"); response.setContentType("application/msword"); // 設(shè)置瀏覽器以下載的方式處理該文件名 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]; // 緩沖區(qū) int bytesToRead = -1; // 通過循環(huán)將讀入的Word文件的內(nèi)容輸出到瀏覽器中 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
@RequestMapping("/exportSellPlan") public @ResponseBody void exportSellPlan(Long id){ Calendar calendar = Calendar.getInstance();// 取當前日期。 if(id!=null){ SellPlan plan=sellService.getSellPlanInfo(id); //獲得數(shù)據(jù) Mapmap = new HashMap (); 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處理
//獲得圖片的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
window.location.href="<%=path%>/exportSellPlan?id=" rel="external nofollow" + id;
以上就是Java項目中的word文檔如何利用Freemarker進行導(dǎo)出,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。