因爲在做項目的時候要涉及到導出Word,所有網上找了些資料,大部門的人都是使用FreeMarker製作模板,在導出Word。
但是在導出的時候遇到個問題,因爲導出的路徑我都是在JAVA代碼中寫好的,但是這樣肯定是不行的,然後在網上找了一些資料,看到也是比較多人遇到這個問題的,但是都沒有什麼解決的結果。得到的結果大多是叫我換另一種方式導出。這樣的話跟逃避有什麼區別。所有我就結合導出Excel的方式,通過如下代碼可以解決這個問題。
/**
* 導出Word的操作方法
*
* @param objects 元模型ID,支持批量上傳
* @throws Exception
*/
public void createWord(List<Object> objects, HttpServletRequest request, HttpServletResponse response) throws Exception {
//獲取ftl文件的路徑
String patha = ExprotWord.class.getResource("/").toString();
patha = patha.substring(0, patha.lastIndexOf("/"));
patha = patha.substring(0, patha.lastIndexOf("/"));
patha = patha.substring(0, patha.lastIndexOf("/"));
patha = patha.substring(0, patha.lastIndexOf("/"));
patha = patha.substring(patha.indexOf("/") + 1, patha.lastIndexOf("/"));
//最終得到的路徑
String sourcePath = patha + "/src/main/template";
configuration.setDirectoryForTemplateLoading(new File(sourcePath)); // FTL文件所存在的位置
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
Template t = null;
try {
t = configuration.getTemplate("exprotWord.ftl"); // 文件名
} catch (IOException e) {
e.printStackTrace();
}
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/msword");
String resultUrl = "對象類型清單_" + sf.format(new Date()) + ".doc";
//防止文件名含有中文亂碼
resultUrl = new String(resultUrl.getBytes("gb2312"), "ISO8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + resultUrl);
response.getWriter();
//存放的目標路徑
// File outFile = new File(resultUrl);
Map<String, Object> dataMap = new HashMap<String, Object>();
getData(dataMap, objects);
Writer out = null;
try {
// out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
out = response.getWriter();
// 必須加 "utf-8" 不然在 UserInfoRestController 通過webservice的方式調用 生成的文件 打開
// 不了,會報錯(而當做java程序去運行,則沒有"utf-8"生成的文件也能正常打開的),原因不詳
// 規範編寫應該是要加上文件的編碼的"utf-8"
} catch (Exception e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
out.close();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String resultUrl = "對象類型清單_" + sf.format(new Date()) + ".doc";這段代碼是點擊導出的時候彈窗展示的