您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)Java項(xiàng)目中的word文檔如何利用Freemarker進(jìn)行導(dǎo)出,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
實(shí)現(xiàn)步驟
1.用Microsoft Office Word打開(kāi)word原件;
2.把需要?jiǎng)討B(tài)修改的內(nèi)容替換成***,如果有圖片,盡量選擇較小的圖片幾十K左右,并調(diào)整好位置;
3.另存為,選擇保存類(lèi)型Word 2003 XML 文檔(*.xml)【這里說(shuō)一下為什么用Microsoft Office Word打開(kāi)且要保存為Word 2003XML,本人親測(cè),用WPS找不到Word 2003XML選項(xiàng),如果保存為Word XML,會(huì)有兼容問(wèn)題,避免出現(xiàn)導(dǎo)出的word文檔不能用Word 2003打開(kāi)的問(wèn)題】;
4.用Firstobject free XML editor打開(kāi)文件,選擇Tools下的Indent【或者按快捷鍵F8】格式化文件內(nèi)容。左邊是文檔結(jié)構(gòu),右邊是文檔內(nèi)容;
5. 將文檔內(nèi)容中需要?jiǎng)討B(tài)修改內(nèi)容的地方,換成freemarker的標(biāo)識(shí)。其實(shí)就是Map<String, Object>中key,如${landName};
6.在加入了圖片占位的地方,會(huì)看到一片base64編碼后的代碼,把base64替換成${image},也就是Map<String, Object>中key,值必須要處理成base64;
代碼如:<w:binData w:name="wordml://自定義.png" xml:space="preserve">${image}</w:binData>
注意:“>${image}<”這尖括號(hào)中間不能加任何其他的諸如空格,tab,換行等符號(hào)。
如果需要循環(huán),則使用:<#list maps as map></#list> maps是Map<String, Object>中key,值為數(shù)組,map為自定義;
7. 標(biāo)識(shí)替換完之后,模板就弄完了,另存為.ftl后綴文件即可。注意:一定不要用word打開(kāi)ftl模板文件,否則xml內(nèi)容會(huì)發(fā)生變化,導(dǎo)致前面的工作白做了。
代碼實(shí)現(xiàn)
工具類(lèi)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 { //配置信息,代碼本身寫(xiě)的還是很可讀的,就不過(guò)多注解了 private static Configuration configuration = null; //這里注意的是利用WordUtils的類(lèi)加載器動(dòng)態(tài)獲得模板文件的位置 // private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath() + "WEB-INF/templetes/"; private static final String templateFolder = "H:/我的項(xiàng)目/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)用工具類(lèi)的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; // 通過(guò)循環(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(); // 刪除臨時(shí)文件 } } private static File createDoc(Map<?, ?> dataMap, Template template) { String name = "sellPlan.doc"; File f = new File(name); Template t = template; try { // 這個(gè)地方不能使用FileWriter因?yàn)樾枰付ň幋a類(lèi)型否則生成的Word文檔會(huì)因?yàn)橛袩o(wú)法識(shí)別的編碼而無(wú)法打開(kāi) 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();// 取當(dāng)前日期。 if(id!=null){ SellPlan plan=sellService.getSellPlanInfo(id); //獲得數(shù)據(jù) 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處理
//獲得圖片的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項(xiàng)目中的word文檔如何利用Freemarker進(jìn)行導(dǎo)出,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。