摘要:前面文章已經分享了如何創建導出需要用到的模板了,接下來這里要給大家分享的是如何用后臺制作導出的代碼工具和實現。可以重,數據庫裝載。
前面文章已經分享了如何創建導出word需要用到的xml/ftl模板了,接下來這里要給大家分享的是如何用后臺制作導出word的代碼工具和controller實現。
1、首先是工具類,沒有工具,談何實現呢?下面貼我這邊導出word的utils,大家可以直接復制粘貼到你們項目就可以引用了。
package com.*.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Map; import javax.servlet.http.HttpServletRequest; import Decoder.BASE64Encoder; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateExceptionHandler; /** * 類名稱:DocUtil * 類描述:導出word工具類 */ public class DocUtil { public Configuration configure=null; public DocUtil(){ configure= new Configuration(Configuration.getVersion()); configure.setDefaultEncoding("utf-8"); } /** * 根據Doc模板生成word文件 * @param dataMap 需要填入模板的數據 * @param downloadType 文件名稱 * @param savePath 保存路徑 */ public File createDoc(MapdataMap,String modelPath,String downloadType,HttpServletRequest request){ String name = "temp" + (int) (Math.random() * 100000) + ".doc"; File f = new File(name); //加載需要裝填的模板 Template template=null; try { //設置模板裝置方法和路徑,FreeMarker支持多種模板裝載方法。可以重servlet,classpath,數據庫裝載。 //加載模板文件,放在/uploadFiles/file/demoDoc下 configure.setServletContextForTemplateLoading(request.getServletContext(), modelPath); //設置對象包裝器 // configure.setObjectWrapper(new DefaultObjectWrapper()); //設置異常處理器 configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); //定義Template對象,注意模板類型名字與downloadType要一致 template=configure.getTemplate(downloadType); Writer out = new OutputStreamWriter(new FileOutputStream(f), "utf-8"); template.process(dataMap, out); out.close(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } return f; } /** * 根據Doc模板生成word文件 * @param dataMap 需要填入模板的數據 * @param downloadType 文件名稱 * @param savePath 保存路徑 */ public void createXls(Map dataMap,String downloadType,String webPath,String fileName,String savePath){ System.out.println(savePath.substring(savePath.length()-1)); if(savePath.substring(savePath.length()-1).equals(File.separator)) { savePath = savePath + "uploadFiles" + File.separator + "file" + File.separator + "jdhDailySheet"+ File.separator; }else { savePath = savePath + File.separator + "uploadFiles" + File.separator + "file" + File.separator + "jdhDailySheet"+ File.separator; } File f = new File(savePath+fileName); //加載需要裝填的模板 Template template=null; try { if(!f.getParentFile().exists()){ f.getParentFile().mkdirs(); } if(f.exists() && f.isFile()){ f.delete(); } else { f.createNewFile(); } //設置模板裝置方法和路徑,FreeMarker支持多種模板裝載方法。可以重servlet,classpath,數據庫裝載。 //加載模板文件,放在/uploadFiles/file/demoDoc下 configure.setDirectoryForTemplateLoading(new File(webPath + "uploadFiles" + File.separator + "file" + File.separator)); //設置對象包裝器 // configure.setObjectWrapper(new DefaultObjectWrapper()); //設置異常處理器 configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); //定義Template對象,注意模板類型名字與downloadType要一致 template=configure.getTemplate(downloadType); Writer out = new OutputStreamWriter(new FileOutputStream(f), "utf-8"); template.process(dataMap, out); out.close(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } } }
2、接下來是處理圖片的工具類,這里導出word包含導出圖片到word,所以需要對圖片進行處理,是怎么個原理呢,在這里和大家簡單介紹下,具體在后續我會具體詳細另外寫一篇文章分享。
(1)圖片我們可以在前臺將要的圖片轉成base64編碼,然后提交給后臺接收
(2)后臺接收base64編碼后使用工具類將base64解碼成圖片然后保存到本地中
(3)在要導出word的時候讀取下本地存儲圖片的路徑然后把圖片導出來就行了。
工具類如下:同第一條一樣可直接復制到你們項目中使用。
package com.*.util; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.UUID; import javax.imageio.ImageIO; import Decoder.BASE64Decoder; import Decoder.BASE64Encoder; /** * 類名稱:ImageUtil * 類描述:圖片處理工具類 */ public class ImageUtil { /** * 從path這個地址獲取一張圖片然后轉為base64碼 * @param imgName 圖片的名字 如:123.png(是帶后綴的) * @param path 123.png圖片存放的路徑 * @return * @throws Exception */ public static String getImageFromServer(String imgName,String path)throws Exception{ BASE64Encoder encoder = new BASE64Encoder(); File f = new File(path+imgName); if(!f.exists()){ f.createNewFile(); } BufferedImage bi = ImageIO.read(f); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bi, "png", baos); byte[] bytes = baos.toByteArray(); return encoder.encodeBuffer(bytes).trim(); } /** * 將一個base64轉換成圖片保存在 path文件夾下 ,命名隨機 * @param base64String * @param path 是一個文件夾路徑 * @param imgName 圖片名字(沒有后綴) * @throws Exception */ public static String savePictoServer(String base64String,String path)throws Exception{ BASE64Decoder decoder = new BASE64Decoder(); //要把+在上傳時變成的空格再改為+ base64String = base64String.replaceAll(" ", "+"); //去掉“data:image/png;base64,”后面才是base64編碼,去掉之后才能解析 base64String = base64String.replace("data:image/png;base64,",""); //在本地指定位置建立文件夾,path由控制臺那邊進行定義 String realPath = path+"/"+"echarts"; File dir=new File(realPath); if(!dir.exists()){ dir.mkdirs(); } String fileName=path+""+"echarts"+""+UUID.randomUUID().toString()+".png"; try { byte[] buffer = decoder.decodeBuffer(base64String); OutputStream os = new FileOutputStream(fileName); for(int i =0;i3、接下來就要介紹下在控制臺怎么使用工具類實現導出word啦,詳細細節看注釋
static String MODELPATH = "/uploadFiles/…"; @RequestMapping(value = { "/downloadDoc" }, produces = "text/html;charset=UTF-8") public void downloadDoc(HttpServletRequest request, HttpServletResponse response) { //引入導出word的工具類 DocUtil docUtil = new DocUtil(); //引入處理圖片的工具類,包含將base64編碼解析為圖片并保存本地,獲取圖片本地路徑 ImageUtil imageUtil = new ImageUtil(); //建立map存儲所要導出到word的各種數據和圖像,不能使用自己項目封裝的類型,例如PageData MapdataMap = new HashMap (); /* * 這一步,請求所需要導出到word的數據quotaList,把你們的數據處理放到這里就行了 */ //這一步,進行圖片的處理,獲取前臺傳過來的圖片base64編碼,在利用工具類解析圖片保存到本地,然后利用工具類獲取圖片本地地址 String barBase64Info = request.getParameter("barBase64Info"); String path = "D:"; String image1 = ImageUtil.savePictoServer(barBase64Info, path); image1 = imageUtil.getImageStr(image1); //將以上處理的數據都存入dataMap 中 //以下都是進行word文件的處理,直接復制,然后細節按需修改就行了 request.setCharacterEncoding("utf-8"); File file = null; InputStream fin = null; OutputStream out = null; String filename = "文件名.doc"; //dataMap是上面處理完的數據,MODELPATH是模板文件的存儲路徑,"模板.xml"是相應的模板文件 file = docUtil.createDoc(dataMap, MODELPATH, "模板.xml", request); fin = new FileInputStream(file); response.setContentLength((int) file.length());//需要傳遞這個長度,不然下載文件后,打開提示內容有問題,如docx等 response.setCharacterEncoding("utf-8"); response.setContentType("application/msword"); response.setHeader("Content-disposition", "attachment;filename=" + new String(filename.getBytes("utf-8"), "iso8859-1")); out = response.getOutputStream(); byte[] buffer = new byte[1024]; // 緩沖區 int bytesToRead = -1; // 通過循環將讀入的Word文件的內容輸出到瀏覽器中 while ((bytesToRead = fin.read(buffer)) != -1) { out.write(buffer, 0, bytesToRead); } if (fin != null) fin.close(); if (out != null) out.close(); if (file != null) file.delete(); // 刪除臨時文件 } 注意:模板的list在后臺構造的時候必須是實體類或者有屬性類型的,如果是自己項目封裝的類型,如在我的項目中有自己封裝的PageData類型的,在模板的list是識別不出list里面的數據的。
各位看官看在本仙女這么辛苦分享的份上隨手點個贊唄^_^!!!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67885.html
摘要:在項目中,往往很多時候需要我們實現將數據導出到文檔中,但是導出首要做法就是創建模板,沒有模板,請求出來的數據就沒有可以存放和顯示的地方。代碼實現導出請看后續文章。 在javaweb項目中,往往很多時候需要我們實現將數據導出到word文檔中,但是導出word首要做法就是創建模板,沒有模板,請求出來的數據就沒有可以存放和顯示的地方。導出的模板需要xml或者ftl格式的文件。 新建word文...
摘要:前面介紹了導出到的代碼實現,詳見這里,里面有一部分涉及導出圖片到,在這里我再另外做一個詳細的介紹。在前臺用將生成的圖片轉成編碼,提交給后臺。 前面介紹了導出到word的代碼實現,詳見這里,里面有一部分涉及導出圖片到word,在這里我再另外做一個詳細的介紹。是這樣的,我項目有個功能,里面就涉及到要將echarts形成的柱狀圖或者地圖之類的圖表導出到word,在網上找了很久,都是說將圖片轉...
摘要:前面介紹了導出到的代碼實現,詳見這里,里面有一部分涉及導出圖片到,在這里我再另外做一個詳細的介紹。在前臺用將生成的圖片轉成編碼,提交給后臺。 前面介紹了導出到word的代碼實現,詳見這里,里面有一部分涉及導出圖片到word,在這里我再另外做一個詳細的介紹。是這樣的,我項目有個功能,里面就涉及到要將echarts形成的柱狀圖或者地圖之類的圖表導出到word,在網上找了很久,都是說將圖片轉...
FineReport支持多種不同的導出方式,直接使用FineReport內置導出按鈕可以非常快捷方便的來對各種格式的輸出,但是我們在web頁面集成中的時候,往往只想將報表內容嵌入到iframe中,而工具欄以及工具欄上的按鈕都會隱藏掉,而使用web頁面自定義的按鈕,那么,此時,這種自定義按鈕如何實現導出呢? showImg(https://segmentfault.com/img/bVJR1H?w=...
摘要:閱讀原文如何高效導出百萬級數據在一個具有統計功能的系統中,導出功能幾乎是一定的,如何導出導出的數據有多少如何高效的導出簡介什么是就不用介紹了,這里主要說明不同版本下每個下的行列限制。 閱讀原文:POI如何高效導出百萬級Excel數據? 在一個具有統計功能的系統中,導出excel功能幾乎是一定的,如何導出excel?導出的數據有多少?如何高效的導出? Excel簡介什么是excel就不用...
閱讀 3318·2023-04-25 16:25
閱讀 3823·2021-11-15 18:01
閱讀 1600·2021-09-10 11:21
閱讀 3007·2021-08-02 16:53
閱讀 3081·2019-08-30 15:55
閱讀 2489·2019-08-29 16:24
閱讀 2098·2019-08-29 13:14
閱讀 1027·2019-08-29 13:00