国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

【freemaker實(shí)現(xiàn)導(dǎo)出word②】代碼實(shí)現(xiàn)導(dǎo)出word(包括導(dǎo)出list數(shù)據(jù)和導(dǎo)出圖片到wor

bitkylin / 3512人閱讀

摘要:前面文章已經(jīng)分享了如何創(chuàng)建導(dǎo)出需要用到的模板了,接下來(lái)這里要給大家分享的是如何用后臺(tái)制作導(dǎo)出的代碼工具和實(shí)現(xiàn)。可以重,數(shù)據(jù)庫(kù)裝載。

前面文章已經(jīng)分享了如何創(chuàng)建導(dǎo)出word需要用到的xml/ftl模板了,接下來(lái)這里要給大家分享的是如何用后臺(tái)制作導(dǎo)出word的代碼工具和controller實(shí)現(xiàn)。

1、首先是工具類(lèi),沒(méi)有工具,談何實(shí)現(xiàn)呢?下面貼我這邊導(dǎo)出word的utils,大家可以直接復(fù)制粘貼到你們項(xiàng)目就可以引用了。

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;

/**
 * 類(lèi)名稱(chēng):DocUtil
 * 類(lèi)描述:導(dǎo)出word工具類(lèi)
 */
public class DocUtil {
    public Configuration configure=null;
    
    public DocUtil(){
        configure= new Configuration(Configuration.getVersion());
        configure.setDefaultEncoding("utf-8");
    }
    /**
     * 根據(jù)Doc模板生成word文件
     * @param dataMap 需要填入模板的數(shù)據(jù)
     * @param downloadType 文件名稱(chēng)
     * @param savePath 保存路徑
     */
    public File createDoc(Map dataMap,String modelPath,String downloadType,HttpServletRequest request){
        String name = "temp" + (int) (Math.random() * 100000) + ".doc";  
        File f = new File(name); 
        //加載需要裝填的模板
        Template template=null;
        try {
            
            //設(shè)置模板裝置方法和路徑,F(xiàn)reeMarker支持多種模板裝載方法。可以重servlet,classpath,數(shù)據(jù)庫(kù)裝載。
            //加載模板文件,放在/uploadFiles/file/demoDoc下
            configure.setServletContextForTemplateLoading(request.getServletContext(), modelPath);
            //設(shè)置對(duì)象包裝器
//            configure.setObjectWrapper(new DefaultObjectWrapper());
            //設(shè)置異常處理器
            configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
            //定義Template對(duì)象,注意模板類(lèi)型名字與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;  
    }
    
    /**
     * 根據(jù)Doc模板生成word文件
     * @param dataMap 需要填入模板的數(shù)據(jù)
     * @param downloadType 文件名稱(chēng)
     * @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();
            }
            
            //設(shè)置模板裝置方法和路徑,F(xiàn)reeMarker支持多種模板裝載方法。可以重servlet,classpath,數(shù)據(jù)庫(kù)裝載。
            //加載模板文件,放在/uploadFiles/file/demoDoc下
            configure.setDirectoryForTemplateLoading(new File(webPath + "uploadFiles" + File.separator + "file" + File.separator));
            //設(shè)置對(duì)象包裝器
//            configure.setObjectWrapper(new DefaultObjectWrapper());
            //設(shè)置異常處理器
            configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
            //定義Template對(duì)象,注意模板類(lèi)型名字與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、接下來(lái)是處理圖片的工具類(lèi),這里導(dǎo)出word包含導(dǎo)出圖片到word,所以需要對(duì)圖片進(jìn)行處理,是怎么個(gè)原理呢,在這里和大家簡(jiǎn)單介紹下,具體在后續(xù)我會(huì)具體詳細(xì)另外寫(xiě)一篇文章分享。
(1)圖片我們可以在前臺(tái)將要的圖片轉(zhuǎn)成base64編碼,然后提交給后臺(tái)接收
(2)后臺(tái)接收base64編碼后使用工具類(lèi)將base64解碼成圖片然后保存到本地中
(3)在要導(dǎo)出word的時(shí)候讀取下本地存儲(chǔ)圖片的路徑然后把圖片導(dǎo)出來(lái)就行了。
工具類(lèi)如下:同第一條一樣可直接復(fù)制到你們項(xiàng)目中使用。

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;


/**
 * 類(lèi)名稱(chēng):ImageUtil
 * 類(lèi)描述:圖片處理工具類(lèi)
 */
public class ImageUtil {
    
     /**
      * 從path這個(gè)地址獲取一張圖片然后轉(zhuǎn)為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();      
     }
     
     /**
      * 將一個(gè)base64轉(zhuǎn)換成圖片保存在  path文件夾下  ,命名隨機(jī)
      * @param base64String
      * @param path  是一個(gè)文件夾路徑
      * @param imgName 圖片名字(沒(méi)有后綴)
      * @throws Exception
      */
     public static String savePictoServer(String base64String,String path)throws Exception{
        
         BASE64Decoder decoder = new BASE64Decoder();
         //要把+在上傳時(shí)變成的空格再改為+
         base64String = base64String.replaceAll(" ", "+");
         //去掉“data:image/png;base64,”后面才是base64編碼,去掉之后才能解析
         base64String = base64String.replace("data:image/png;base64,","");
         //在本地指定位置建立文件夾,path由控制臺(tái)那邊進(jìn)行定義
         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;i

3、接下來(lái)就要介紹下在控制臺(tái)怎么使用工具類(lèi)實(shí)現(xiàn)導(dǎo)出word啦,詳細(xì)細(xì)節(jié)看注釋

static String MODELPATH = "/uploadFiles/…";

@RequestMapping(value = { "/downloadDoc" }, produces = "text/html;charset=UTF-8")
public void downloadDoc(HttpServletRequest request, HttpServletResponse response) {
    //引入導(dǎo)出word的工具類(lèi)
    DocUtil docUtil = new DocUtil();
    //引入處理圖片的工具類(lèi),包含將base64編碼解析為圖片并保存本地,獲取圖片本地路徑
    ImageUtil imageUtil = new ImageUtil();
    //建立map存儲(chǔ)所要導(dǎo)出到word的各種數(shù)據(jù)和圖像,不能使用自己項(xiàng)目封裝的類(lèi)型,例如PageData
    Map dataMap = new HashMap(); 
    
    /*
     *  這一步,請(qǐng)求所需要導(dǎo)出到word的數(shù)據(jù)quotaList,把你們的數(shù)據(jù)處理放到這里就行了
     */
    
    
    //這一步,進(jìn)行圖片的處理,獲取前臺(tái)傳過(guò)來(lái)的圖片base64編碼,在利用工具類(lèi)解析圖片保存到本地,然后利用工具類(lèi)獲取圖片本地地址
    String barBase64Info = request.getParameter("barBase64Info");
    String path = "D:";
    String image1 = ImageUtil.savePictoServer(barBase64Info, path);
    image1  = imageUtil.getImageStr(image1);
    
    //將以上處理的數(shù)據(jù)都存入dataMap 中
    
    //以下都是進(jìn)行word文件的處理,直接復(fù)制,然后細(xì)節(jié)按需修改就行了
    request.setCharacterEncoding("utf-8");
    File file = null;
    InputStream fin = null;
    OutputStream out = null;
    String filename = "文件名.doc";
        //dataMap是上面處理完的數(shù)據(jù),MODELPATH是模板文件的存儲(chǔ)路徑,"模板.xml"是相應(yīng)的模板文件
    file = docUtil.createDoc(dataMap, MODELPATH, "模板.xml", request);
    fin = new FileInputStream(file);
    response.setContentLength((int) file.length());//需要傳遞這個(gè)長(zhǎng)度,不然下載文件后,打開(kāi)提示內(nèi)容有問(wèn)題,如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]; // 緩沖區(qū)  
    int bytesToRead = -1;
    // 通過(guò)循環(huán)將讀入的Word文件的內(nèi)容輸出到瀏覽器中  
    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(); // 刪除臨時(shí)文件
    
    
}

注意:模板的list在后臺(tái)構(gòu)造的時(shí)候必須是實(shí)體類(lèi)或者有屬性類(lèi)型的,如果是自己項(xiàng)目封裝的類(lèi)型,如在我的項(xiàng)目中有自己封裝的PageData類(lèi)型的,在模板的list是識(shí)別不出list里面的數(shù)據(jù)的。

各位看官看在本仙女這么辛苦分享的份上隨手點(diǎn)個(gè)贊唄^_^!!!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/67885.html

相關(guān)文章

  • freemaker實(shí)現(xiàn)導(dǎo)出word①】創(chuàng)建xml/ftl模板

    摘要:在項(xiàng)目中,往往很多時(shí)候需要我們實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到文檔中,但是導(dǎo)出首要做法就是創(chuàng)建模板,沒(méi)有模板,請(qǐng)求出來(lái)的數(shù)據(jù)就沒(méi)有可以存放和顯示的地方。代碼實(shí)現(xiàn)導(dǎo)出請(qǐng)看后續(xù)文章。 在javaweb項(xiàng)目中,往往很多時(shí)候需要我們實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到word文檔中,但是導(dǎo)出word首要做法就是創(chuàng)建模板,沒(méi)有模板,請(qǐng)求出來(lái)的數(shù)據(jù)就沒(méi)有可以存放和顯示的地方。導(dǎo)出的模板需要xml或者ftl格式的文件。 新建word文...

    Kross 評(píng)論0 收藏0
  • freemaker實(shí)現(xiàn)導(dǎo)出word③】詳解將echarts的圖片word

    摘要:前面介紹了導(dǎo)出到的代碼實(shí)現(xiàn),詳見(jiàn)這里,里面有一部分涉及導(dǎo)出圖片到,在這里我再另外做一個(gè)詳細(xì)的介紹。在前臺(tái)用將生成的圖片轉(zhuǎn)成編碼,提交給后臺(tái)。 前面介紹了導(dǎo)出到word的代碼實(shí)現(xiàn),詳見(jiàn)這里,里面有一部分涉及導(dǎo)出圖片到word,在這里我再另外做一個(gè)詳細(xì)的介紹。是這樣的,我項(xiàng)目有個(gè)功能,里面就涉及到要將echarts形成的柱狀圖或者地圖之類(lèi)的圖表導(dǎo)出到word,在網(wǎng)上找了很久,都是說(shuō)將圖片轉(zhuǎn)...

    flyer_dev 評(píng)論0 收藏0
  • freemaker實(shí)現(xiàn)導(dǎo)出word③】詳解將echarts的圖片word

    摘要:前面介紹了導(dǎo)出到的代碼實(shí)現(xiàn),詳見(jiàn)這里,里面有一部分涉及導(dǎo)出圖片到,在這里我再另外做一個(gè)詳細(xì)的介紹。在前臺(tái)用將生成的圖片轉(zhuǎn)成編碼,提交給后臺(tái)。 前面介紹了導(dǎo)出到word的代碼實(shí)現(xiàn),詳見(jiàn)這里,里面有一部分涉及導(dǎo)出圖片到word,在這里我再另外做一個(gè)詳細(xì)的介紹。是這樣的,我項(xiàng)目有個(gè)功能,里面就涉及到要將echarts形成的柱狀圖或者地圖之類(lèi)的圖表導(dǎo)出到word,在網(wǎng)上找了很久,都是說(shuō)將圖片轉(zhuǎn)...

    endless_road 評(píng)論0 收藏0
  • FineReport中JS如何自定義按鈕導(dǎo)出

    FineReport支持多種不同的導(dǎo)出方式,直接使用FineReport內(nèi)置導(dǎo)出按鈕可以非常快捷方便的來(lái)對(duì)各種格式的輸出,但是我們?cè)趙eb頁(yè)面集成中的時(shí)候,往往只想將報(bào)表內(nèi)容嵌入到iframe中,而工具欄以及工具欄上的按鈕都會(huì)隱藏掉,而使用web頁(yè)面自定義的按鈕,那么,此時(shí),這種自定義按鈕如何實(shí)現(xiàn)導(dǎo)出呢? showImg(https://segmentfault.com/img/bVJR1H?w=...

    wujl596 評(píng)論0 收藏0
  • POI如何高效導(dǎo)出百萬(wàn)級(jí)Excel數(shù)據(jù)

    摘要:閱讀原文如何高效導(dǎo)出百萬(wàn)級(jí)數(shù)據(jù)在一個(gè)具有統(tǒng)計(jì)功能的系統(tǒng)中,導(dǎo)出功能幾乎是一定的,如何導(dǎo)出導(dǎo)出的數(shù)據(jù)有多少如何高效的導(dǎo)出簡(jiǎn)介什么是就不用介紹了,這里主要說(shuō)明不同版本下每個(gè)下的行列限制。 閱讀原文:POI如何高效導(dǎo)出百萬(wàn)級(jí)Excel數(shù)據(jù)? 在一個(gè)具有統(tǒng)計(jì)功能的系統(tǒng)中,導(dǎo)出excel功能幾乎是一定的,如何導(dǎo)出excel?導(dǎo)出的數(shù)據(jù)有多少?如何高效的導(dǎo)出? Excel簡(jiǎn)介什么是excel就不用...

    lemanli 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<