以前咱们导excel大部分用的是jxl和poi,JXL只能对Excel进行操做,属于比较老的框架,它只支持到Excel 95-2000的版本。如今已经中止更新和维护java
POI是apache的项目,可对微软的Word,Excel,ppt等进行操做,包括office2003和2007,Excl2003和2007。poi如今一直有更新。因此如今主流使用POI数据库
若是只是简单的excel,用上述工具导出没有任何问题,但若是导出定制化复杂的excel或word,就会显得很繁琐,代码也有必定难度,因此我尝试用freemarkerapache
来导出app
先制做一个定制的excel框架
新建一个excel,在里面写上点数据并将后缀改成.xmlmaven
将下图的 1和张三改一下以接收数据,将excel复制到项目的resource目录中将后缀名改成.ftl工具
到这一步excel已经好了,接下来就是代码this
须要的maven包spa
<!--word;excel导出包--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency>
导出的方法.net
package com.pskj.GSLZ.utils.word; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import java.io.*; import java.util.HashMap; import java.util.Map; /** * word,excel导出 */ public class FreemarkerWord { private Configuration configuration = null; public FreemarkerWord() { configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); } /** * dataMap为要装载的数据 * @param dataMap */ public void createDoc(Map dataMap) { // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。能够重servlet,classpath,数据库装载, // 这里个人模板是放在resources/ftl包下(放在其它位置总会报文件找不到) configuration.setClassForTemplateLoading(this.getClass(), "/ftl"); Template t = null; try { // test2.ftl为要装载的模板 t = configuration.getTemplate("test2.ftl"); t.setEncoding("utf-8"); } catch (IOException e) { e.printStackTrace(); } // 输出文档路径及名称 File outFile = new File("E:/test2.xls"); Writer out = null; try { out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(outFile), "utf-8")); } catch (Exception e1) { e1.printStackTrace(); } try { t.process(dataMap, out); out.close(); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { Map map=new HashMap(); map.put("id", "1");//添加数据 map.put("name", "光头权"); FreemarkerWord fw=new FreemarkerWord(); fw.createDoc(map);//调用导出方法 } }
运行以后
再就是导出多条数据,修改以后的可循环遍历数据
查询数据库后调用导出方法,数据也能正常导出
/** * 根据excel模板导出数据 */ @RequestMapping("listAll") @ResponseBody public void listAll() { PageData pd=this.getPageData();//用于接受参数的封装类 FreemarkerWord fw=new FreemarkerWord();//实例化该导出类 Map dataMap = new HashMap(); try{ List<Map> list=fhlogService.listAll(pd);//获取多组数据 dataMap.put("list",list);//将数据装进Map fw.createDoc(dataMap);//调用导出方法 }catch (Exception e){ e.printStackTrace(); } }
参考连接: https://blog.csdn.net/guangcigeyun/article/details/78769704
参考连接: https://www.jianshu.com/p/66645b71942f