1. 程式人生 > >freemaker+echarts匯出word文件

freemaker+echarts匯出word文件

廢話不多說了 先上程式碼吧 程式碼完了之後 在整模板

這是dem的目錄結構 

 

好了 作為社會主義接班人 秉承著MVC思想 我寫程式碼的習慣是 先controller 再service 

controller 詳情 如下


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.transitmonthlyreport.dto.BaseTransferEntity;
import com.transitmonthlyreport.util.MobileConfig;



/**
 * 這是一個測試的例子
 * @author ZiAn
 *
 */

@Controller
@RequestMapping(value = "")
public class TestController {

    private static Logger log = Logger.getLogger(TestController.class);

    /**
     * 注入 測試匯出的  TestServiceImpl
     */
    @Autowired
    private TestServiceImpl testServiceImpl;

    

    /**
     * 這是個測試的demo 所以 有些定義的名字比較隨意 
     *
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "/service/exportDemo")
    @ResponseBody
    public BaseTransferEntity export(HttpServletRequest request, HttpServletResponse response) {

        BaseTransferEntity baseTransferEntity = new BaseTransferEntity();//這是自己封裝的東西

        try {

        	
            //第一張圖片  傳圖片base64的碼
            String a = request.getParameter("a");
            
            Map<String, Object> mapImageDown = new HashMap<String, Object>();
            
            mapImageDown.put("a", a);
          
            List<Map<String, Object>> lst = new ArrayList<Map<String,Object>>();
           
            Map<String,Object> newMap = new HashMap<String, Object>();
            
            // 添加個假資料
            newMap.put("y", "2020--nian---");
            
            lst.add(newMap);
           
            System.out.println(lst);
           
            // 下載文件到本地
            Map<String, Object> maplst = testServiceImpl.downWord(lst, mapImageDown);

            
            // 將上述得到的資料返回給頁面  ----自己定義的東西 不重要
            baseTransferEntity.setResultcode(MobileConfig.getStringCode("code.global.success"));

            baseTransferEntity.setData(maplst);

            baseTransferEntity.setDesc(MobileConfig.get("msg.global.success"));

        } catch (Exception e) {

            log.error("Test exportDemo--------->" + e.getMessage(), e);

            baseTransferEntity.setResultcode(MobileConfig.getStringCode("code.global.error.exception"));

            baseTransferEntity.setDesc("系統介面異常,請聯絡管理員!");

            baseTransferEntity.setData(null);
        }

        return baseTransferEntity;
    }


    


}

接下來 就是serviceImpl了 

睜大眼睛哈

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Service;


import sun.misc.BASE64Decoder;

/**
 * TODO
 * <p>
 * This contains the following methods:<br/>
 * <p>
 * 
 * @author ZiAn
 * @version 1.0
 * @since 1.0
 */

@Service
public class TestServiceImpl implements TestService {

    
	@Override
	public Map<String, Object> downWord(List<Map<String, Object>> lst,Map<String, Object> mapImageDown) throws Exception{
		Map<String, Object>  retMap  = new HashMap<String,Object>();
		String a = mapImageDown.get("a").toString();
		
		//下載圖片
		TestWordUtil wordUtil = new TestWordUtil();
        String fileStr = wordUtil.saveFile(); 
        
        
        try{
        	 String[] url = a.split(",");
             String u = url[1];
             // Base64解碼
             byte[] b1 = new BASE64Decoder().decodeBuffer(u);
             // 生成第一張圖片
             OutputStream out = new FileOutputStream(new File(fileStr+"\\test1.png"));
              
             out.write(b1);
             out.flush();
             out.close();
             
    
             //為模板賦值
             Map<String, Object> dataMap = new HashMap<String, Object>();
             //dataMap =lst.get(0);
             dataMap.putAll(lst.get(0));
             dataMap.put("a", TestWordUtil.getImageStr(fileStr+"\\test1.png"));  
             
             String wordName ="這是檔名稱.doc";
            
             //生成word
             wordUtil.createWord("TextXML.ftl", fileStr+"\\"+wordName, dataMap);
             
             
            
             //返回生成檔案路徑 以及 檔名稱
             retMap.put("wordDir", fileStr);
             retMap.put("wordName", wordName);
             
             System.out.println("目錄="+fileStr+"\\"+wordName);
             
        } catch (IOException e) {
			e.printStackTrace();
		}
        
		return retMap;
	}

	
}

有了 impl 那肯定得來個介面呀

import java.util.List;
import java.util.Map;

/**
 * TODO
 * <p>
 * This contains the following methods:<br/>
 * <p>
 * 
 * @author ZiAn
 * @version 1.0
 * @since 1.0
 */

public interface TestService {
    
    

	
	/**
	 * 下載文件到本地
	 * @param lst
	 * @param mapImageDown
	 * @return
	 * @throws Exception
	 */
	public Map<String, Object> downWord(List<Map<String, Object>> lst, Map<String, Object> mapImageDown) throws Exception;
}

接下來 就是最重要的玩意兒了 util  hahaha

import java.io.BufferedWriter;
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.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Map;

import sun.misc.BASE64Encoder;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class TestWordUtil {
	private Configuration configuration = null;

	public TestWordUtil() {
		configuration = new Configuration();
		configuration.setDefaultEncoding("utf-8");

	}

	public void createWord(String templetName, String filePathName, Map<String, Object> dataMap) {
		configuration.setClassForTemplateLoading(this.getClass(), "/com/transitmonthlyreport/template"); // FTL檔案所存在的位置 我這是放在專案底下了 自己的實際路徑自己比對
		Template t = null;
		try {
			// 獲取模版檔案
			t = configuration.getTemplate(templetName);
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 生成檔案的路徑和名稱
		File outFile = new File(filePathName);
		Writer out = null;
		try {
			try {
				out = new BufferedWriter(new OutputStreamWriter(
						new FileOutputStream(outFile),"UTF-8"));
			} catch (UnsupportedEncodingException e) {
				// TODO 
				e.printStackTrace();
			}
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		}

		try {
			t.process(dataMap, out);
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static String getImageStr(String imgFile) {
		InputStream in = null;
		byte[] data = null;
		try {
			in = new FileInputStream(imgFile);
			data = new byte[in.available()];
			in.read(data);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(data);
	}
	
	public String saveFile() {
		String nowpath = System.getProperty("user.dir");
		String path = nowpath.replace("bin", "webapps");
		path += "\\"+"testWord"+"\\"+"word";
		File tmp = new File(path);
		System.out.println("path==="+path);
		if (!tmp.exists()) {
			tmp.mkdirs();
		}
		return path;
	} 
	
 
    public String getEncodeImageStr(String imgFile) {
		InputStream in = null;
		byte[] data = null;
		try {
			in = new FileInputStream(imgFile);
			data = new byte[in.available()];
			in.read(data);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(data);
	}
}

好了 到這個地方 重要的 就來了 

製作模板

然後 另存為 xml 格式

都修改好之後 再儲存 字尾 修改為 ftl 然後 把這個檔案 扔到你的專案裡 (就是 模板存放的路徑)

 

然後 執行 tomcat 

 

然後 來自己的路徑裡看

寫這麼詳細 要是 再看不懂 那我就沒辦法了