1.导入依赖
maven版:
org.apache.poi poi 4.1.1 org.apache.poi poi-ooxml 4.1.1 org.jxls jxls 2.6.0 ch.qos.logback logback-core org.jxls jxls-poi 1.2.0 fr.opensagres.xdocreport fr.opensagres.xdocreport.core 2.0.2 fr.opensagres.xdocreport fr.opensagres.xdocreport.document 2.0.2 fr.opensagres.xdocreport fr.opensagres.xdocreport.template 2.0.2 fr.opensagres.xdocreport fr.opensagres.xdocreport.document.docx 2.0.2 fr.opensagres.xdocreport fr.opensagres.xdocreport.template.freemarker 2.0.2 org.freemarker freemarker 2.3.23 commons-io commons-io 2.5
gradle版:
compile "fr.opensagres.xdocreport:fr.opensagres.xdocreport.core:2.0.2"
compile "fr.opensagres.xdocreport:fr.opensagres.xdocreport.document:2.0.2"
compile "fr.opensagres.xdocreport:fr.opensagres.xdocreport.document.docx:2.0.2"
compile "fr.opensagres.xdocreport:fr.opensagres.xdocreport.template:2.0.2"
compile "fr.opensagres.xdocreport:fr.opensagres.xdocreport.template.freemarker:2.0.2"
compile "org.freemarker:freemarker:2.3.23"
compile "commons-io:commons-io:2.5"
compile "org.apache.poi:poi:3.14"
compile "org.apache.poi:poi-ooxml:3.14"
2.创建导出模板
纯文字使用${}占位,图片使用建立初始化图片并添加书签的方式占位,
书签名就是datamap的键名,多张图片添加多个书签
3.编写代码(这里使用浏览器下载方式导出)
(1)导出工具方法
public static void exportFile (
HttpServletResponse response,
Map fileDataMap,
String fileName,
Map map,
List
(2)业务逻辑代码
try{
Map fileMap = null;
Map exportMap = new hashMap();
exportMap.put("???","data");
int num = 1;
//由于poitl和导入功能用的poi版本冲突,无法用,这里使用IXDocReport对象做导出
//可以循环添加,键名可以拼接为img1,img2,img3。。。,模板书签名对应
//需要导出的文件集合,对接实际业务service
List list = new arrayList();
if(list != null) {
fileMap = new hashMap();
for (File f : list) {
fileMap.put("img" + num , f);
num ++;
}
}
Kit.exportFile(response, fileMap, "模板名称.docx", exportMap, null);
} catch (Exception e) {
e.printStackTrace();
}
(3)因为我们业务文件接口返回的是byte数组,所以这里提供一个byte数组转File对象的方法(网上c的)
public static File createTmpFile(
InputStream inputStream, String name, String ext, File tmpDirFile) throws IOException {
File resultFile = File.createTempFile(name, '.' + ext, tmpDirFile);
resultFile.deleteOnExit();
FileUtils.copyToFile(inputStream, resultFile);
return resultFile;
}
public static File bytesToFile(byte[] bytes, String fileType) throws IOException {
return createTmpFile(
new ByteArrayInputStream(bytes),
UUID.randomUUID().toString(),
fileType,
Files.createTempDirectory("tempFile").toFile());
}
4.那么问题来了,图片数量不定怎么确定初始化图片再添加书签呢,困扰了很久,最后直接用20张纯白图片(这里采用微信截图,截了很小一张,100张也没有几k,全都添加对应书签,不够20张也看不出来,缺点是不满20张会空一行出来),弄好后调用方法点击导出ok
注:方法思路由该贴而来
https://blog.csdn.net/plxddyxnmd/article/details/109129838



