在项目持续集成的过程中,有时候需要实现报表导出和文档导出,类似于excel中这种文档的导出,在要求不高的情况下,有人可能会考虑直接导出csv文件来简化导出过程。但是导出xlsx文件,其实过程相对更复杂。解决方案就是使用poi的jar包。使用源生的poi来操作表格,代码冗余,处理复杂,同时poi的相关联的依赖还会存在版本兼容问题,所以直接使用poi来实现表格导出,维护成本大,不易于拓展。
我们需要学会站在巨人的肩膀上解决问题,jxls-poi这个就很好解决这个excel表格导出的多样化的问题。类似jsp和thymealf的模板定义,使得表格导出变得简单可控。
不多BB上代码
<强> 1。引入关键依赖包强>
& lt; !——jxls-api依赖——比; & lt; dependency> & lt; groupId> org.jxls & lt; artifactId> jxls-poi & lt; version> 1.0.15 & lt;/dependency> & lt; dependency> & lt; groupId> org.jxls & lt; artifactId> jxls & lt; version> 2.4.6 & lt;/dependency> >之前这里只需要两个依赖便操作excel表格了。
<强> 2。定义模板文件强>
新建一个excel文件,后缀名为.xlsx,在资源目录下新增一个jxl的文件夹,把模板文件放在这个文件夹下,便于后续的spring-boot的集成。
<强> 3。导出工具类强>
/* * * @author machenike */公开课ExcelUtils {/* * * * excel导出到响应 * @param文件名导出文件名 * @param templateFile模板文件地址 * @param params数据集合 * @param反应反应 */公共静态孔隙exportExcel(字符串文件名、InputStream templateFile Map<字符串,Object>参数, HttpServletResponse响应)抛出IOException { response.reset (); 响应。setHeader (“Accept-Ranges”、“字节”); OutputStream os=零; 响应。setHeader(“附加”,String.format(“附件;文件名=\ " % s \ ",文件名)); response.setContentType(“应用程序/八进制;charset=utf - 8”); 尝试{ 操作系统=response.getOutputStream (); exportExcel (templateFile、参数、操作系统); }捕捉(IOException e) { 把e; } }/* * *导出excel到输出流中 * @param templateFile模板文件 * @param params传入参数 * @param os输出流 * @throws IOException */公共静态孔隙exportExcel (InputStream templateFile Map<字符串,Object>params, OutputStream os)抛出IOException { 尝试{ 上下文语境=new上下文(); Set键盘=params.keySet (); (字符串键:键盘){//设置参数变量 上下文。putVar(关键params.get(键)); } Object> Map<字符串;,myFunction=new HashMap<的在(); myFunction。把(“有趣”,新的ExcelUtils ());//启动新的jxls-api加载自定义方法 变压器trans=TransformerFactory。createTransformer (templateFile、os); .getExpressionEvaluator JexlExpressionEvaluator评估者=(JexlExpressionEvaluator) trans.getTransformationConfig () (); evaluator.getJexlEngine () .setFunctions myFunction ();//载入模板,处理导出 AreaBuilder AreaBuilder=new XlsCommentAreaBuilder(反式); ListareaList=areaBuilder.build (); areaList.get (0)。applyAt(新CellRef (“sheet1 ! A1”),上下文); trans.write (); }捕捉(IOException e) { 把e; 最后}{ 尝试{ 如果(os !=null) { os.flush (); os.close (); } 如果(templateFile !=null) { templateFile.close (); } }捕捉(IOException e) { 把e; } } }/* * *格式化时间 */公共对象formatDate(日期日期){ 如果(日期!=null) { SimpleDateFormat自卫队=new SimpleDateFormat (“yyyy-MM-dd HH: mm: ss”); 字符串dateStr=sdf.format(日期); 返回dateStr; } 返回“-”; }/* * *设置超链接方法 */公共WritableCellValue getLink(字符串地址字符串标题){ 返回新WritableHyperlink(地址、标题); } } 这个工具类中我定义两个导出用的方法
一个是直接是HttpServletResponse导出在线下载文件
一个使用输入流导出
同时模板中还支持方法传入。SpringBoot快速集成jxls-poi(自定义模板,支持本地文件导出,在线文件导出)