最近项目用到了springboot导出word。
使用了这篇博客里的方法 springboot根据模板导出word【可进行拓展】-CSDN博客
在本地测试使用IDEA运行都是可以导出的。但是打包以后就报如下错误:
cn.afterturn.easypoi.cache.WordCache : java.lang.NullPointerException
具体错误原因是路径不对。打包以后。springboot的路径会变。
找不到模板了。所以就报错。
有两种方法解决。第一种是把word模板文件都保存到服务器上的一个本地磁盘路径下(如桌面)。然后调用ExportWordUtils时写绝对路径:
ExportWordUtils.exportWord("C:/Users/Administrator/Desktop/cgspb.docx","D:/test","XXX.docx",params,request,response);
第二种方法是:使用
WordExportUtil.exportWord07(XWPFDocument document, Map<String, Object> map)方法
原文是使用的第一个方法。用URL做的参数
这时测试类需要修改如下: public void export(HttpServletRequest request, HttpServletResponse response){ Map<String,Object> params = new HashMap<>(); params.put("title","这是标题"); params.put("name","李四"); //这里是我说的一行代码 InputStream is = this.getClass().getResourceAsStream("/word/export.docx"); ExportWordUtils.exportWord(is,"D:/test","XXX.docx",params,request,response); }
工具类需要修改如下:
import cn.afterturn.easypoi.word.WordExportUtil;
import cn.afterturn.easypoi.word.entity.MyXWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.util.Assert;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;
public class ExportWordUtils {
/**
* 导出word
* <p>第一步生成替换后的word文件,只支持docx</p>
* <p>第二步下载生成的文件</p>
* <p>第三步删除生成的临时文件</p>
* 模版变量中变量格式:{{foo}}
*
* @param is word模板文件流
* @param temDir 生成临时文件存放地址
* @param fileName 文件名
* @param params 替换的参数
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
public static void exportWord(InputStream is, String temDir, String fileName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {
Assert.notNull(is, "模板不能为空");
Assert.notNull(temDir, "临时文件路径不能为空 ");
Assert.notNull(fileName, "导出文件名不能为空 ");
Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式");
if (!temDir.endsWith("/")) {
temDir = temDir + File.separator;
}
File dir = new File(temDir);
if (!dir.exists()) {
dir.mkdirs();
}
try {
String userAgent = request.getHeader("user-agent").toLowerCase();
if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
}
MyXWPFDocument doc = new MyXWPFDocument(is);
WordExportUtil.exportWord07(doc, params);
String tmpPath = temDir + fileName;
FileOutputStream fos = new FileOutputStream(tmpPath);
doc.write(fos);
// 设置强制下载不打开
response.setContentType("application/force-download");
// 设置文件名
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
OutputStream out = response.getOutputStream();
doc.write(out);
out.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
delFileWord(temDir, fileName);//这一步看具体需求,要不要删
}
}
/**
* 删除零时生成的文件
*/
public static void delFileWord(String filePath, String fileName) {
File file = new File(filePath + fileName);
File file1 = new File(filePath);
file.delete();
file1.delete();
}
}