精华内容
下载资源
问答
  • java模板导出excel

    千次阅读 2019-06-29 20:07:24
    java模板导出excel 2003excel不适合大数据分页导出,非常容易内存溢出,因此没有将模板导出poi的逻辑整合进来。2003模板导出网络上有挺多的工具包。 2007excel模板导出,目前没发现相关工具包可用,因此重构了以前写...

    原创,转载请注明原创博客

    java模板导出excel

    2003excel不适合大数据分页导出,非常容易内存溢出,因此没有将模板导出poi的逻辑整合进来。2003模板导出网络上有挺多的工具包。
    2007excel模板导出,目前没发现相关工具包可用,因此重构了以前写的模板导出工具包。用户可供参考的非模板导出工具包有hutool和阿里开源的eashexcel,具体区别不在此分析。

    功能描述

    • 目前支持简单的表达式替换导出数据功能,详见支持标签小节。支持合并单元格的导出(包括模板合并单元格和动态配置单元格,以及在循环和分页循环导出都支持合并单元格)。PS:模板中的公式,图片等未处理,如果有需要,应该很方便就加上去了。
    • 只需配置好2007excel模板,自动替换指定的模板变量为具体数据,自动导出excel
    • 自定义了部分表达式标签,支持if,迭代,循环语法,分页导出等。支持模板中的合并单元格导出。

    支持标签

    • if标签,如果表达式值为空,则if标签块内容不输出。eq: ~#if ${eachModel}~
    • each标签,可以嵌套配合if、foreach、pageforeach使用,迭代输出对象或map的key数据。eq: ~#each ${eachModel}~
    • foreach标签,一次性将所有数据遍历处理,将foreach块循环输出。eq: ~#foreach obj in ${forEachList}~
    • pageforeach标签,可解决内存溢出问题,分页读取数据遍历处理,将pageforeach块循环输出。eq: ~#pageforeach pageObj in ${pageForeachList}~

    使用步骤

    • mvn导入,主要依赖如下,其他的依赖是可选的,参考”sstool模板导出2007excel的demo“导入
    <dependency>
    	<groupId>com.github.shaohj</groupId>
    	<artifactId>sstool-all</artifactId>
    	<version>1.0.3</version>
    </dependency>
    
    • 配置2007excel模板
    • 编码导出,主要是封装模板导出excel需要的参数,配置模板路径,导出路径等,详见demo

    核心部分介绍

    模板文件信息如下:
    导出模板07Excel.jpg

    导出核心参数代码如下

    @Builder(toBuilder = true)
    @Getter
    @Setter
    public class Sax07ExcelExportParam {
        /** 模板文件路径是否为class路径.true:是;false:否 */
        private boolean tempIsClassPath;
        /** 模板文件名称 */
        private String tempFileName;
        /** 导出java参数 */
        private Map<String, Object> params;
        /** 输出文件流 */
        private OutputStream outputStream;
        /** 分页导出处理service,支持多页分页导出 */
        private List<Sax07ExcelPageWriteService> sax07ExcelPageWriteServices;
    }
    

    含4种标签的导出demo代码如下,举例用因此导出数据少了些,实际测试时配置8M的JVM可以导出百万级数据,不会出现内存溢出,只是大部分的时间都在进行gc

    @Test
    public void exportSstoolTest(){
    	int pageSize = 10;
    	int pageForeachTotalNum = 5;
    	int totalPageNum = pageForeachTotalNum % pageSize == 0 ? pageForeachTotalNum/pageSize : pageForeachTotalNum/pageSize + 1;
    	// 使用类classpath路径下的模板文件导出
    	String tempPath = "xlsx/";
    
    	Map<String, Object> params = new HashMap<>();
    
    	// 普通数据mock
    	params.put("printDate", "2019-06-29");
    
    	// each数据mock
    	ModelTest eachModel = new ModelTest("张三", "zhangsan", 123.234);
    	eachModel.setYear("2008");
    	params.put("eachModel", eachModel);
    
    	// foreach数据mock
    	List forEachList = new ArrayList();
    	for(int i = 0; i< 4; i++){
    		forEachList.add(new ModelTest("姓名" + i, "user" + i, i));
    	}
    	params.put("forEachList", forEachList);
    
    	// 分页导出数据mock
    	Sax07ExcelPageWriteService sax07ExcelPageWriteService = new Sax07ExcelPageWriteService(){
    		@Override
    		public void pageWriteData() {
    			for (int i = 0; i <totalPageNum; i++) {
    				Map<String, Object> pageParams = new HashMap<>();
    				List pageForeachList = new ArrayList(pageSize);
    				for (int j = 0; j <pageSize && pageSize * i + j < pageForeachTotalNum; j++) {
    					pageForeachList.add(new ModelTest("分页姓名" + i + "," + j, "分页user" + i + "," + j, j));
    				}
    				pageParams.put("pageForeachList", pageForeachList);
    				tagData.writeTagData(writeWb, writeSheet, writeSheetData, pageParams, writeCellStyleCache);
    			}
    		}
    	};
    	//设置sax07ExcelPageWriteService对应的表达式
    	sax07ExcelPageWriteService.setExprVal("#pageforeach pageObj in ${pageForeachList}");
    
    	CostTimeUtil.apply(null, "导出" + pageForeachTotalNum + "条数据,耗费时间为{}毫秒", s -> {
    		try (FileOutputStream fos = new FileOutputStream(exportPath + "sstool_demo_data.xlsx");){
    			Sax07ExcelExportParam param = Sax07ExcelExportParam.builder()
    					.tempIsClassPath(true)
    					.tempFileName(tempPath + "sstool_demo_temp.xlsx")
    					.params(params)
    					.sax07ExcelPageWriteServices(Arrays.asList(sax07ExcelPageWriteService))
    					.outputStream(fos).build();
    			Sax07ExcelUtil.export(param);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	});
    }
    

    模板导出结果如下:
    导出07Excel结果.jpg

    缺陷

    暂无记录,若发现了其他问题,可以提到issue里面。

    代码地址

    sstool源码
    sstool模板导出2007excel的demo

    展开全文
  • EasyPOI模板导出,论模板导出的坑

    千次阅读 2020-07-08 15:19:41
    EasyPOI模板导出 原文链接: https://blog.csdn.net/u013374164/article/details/78292194 https://blog.csdn.net/lovexiaotaozi/article/details/85598424 https://www.jianshu.com/p/9f82e6630a37 ...

    EasyPOI模板导出

    原文链接:
    https://blog.csdn.net/u013374164/article/details/78292194
    https://blog.csdn.net/lovexiaotaozi/article/details/85598424
    https://www.jianshu.com/p/9f82e6630a37
    https://blog.csdn.net/hzygcs/article/details/85100608

    从原生的POI转到使用EasyPOI的人深有感触,就是代码效率提高了不少,EasyPOI作为POI的封装,有其优点,但是也有一定“坑”,本人近期踩了多坑,所以在这里进行一下总结

    坑1.

    EasyPOI模板导出不支持输入流,仔细看一下TemplateExportParams这个类,说明一下,该类主要是读取模板的,在模板的style基础之上可以定义导出的一些参数,观察一下这个类中的templateUrl,也就是到读取你本地的路径,当然我们在实际开发过程中,一般都会使用到文件服务器比如FastDFS,这个时候你就傻逼了,因为不支持流嘛,当然呢也可以做一些转换,也就是先将文件服务器中的模板读出来然后将该流写到本地磁盘上,再通过本地磁盘上的路径读取模板,这个方案笨了一些,但是是可以解决这个问题的,不知道高的版本改进了这个问题没,我目前用的是3.2.0版本,希望这个社区不断的壮大,后期版本可以解决此问题
    TemplateExportParams模板类
    package cn.afterturn.easypoi.excel.entity;
    
    import cn.afterturn.easypoi.excel.export.styler.ExcelExportStylerDefaultImpl;
    
    /**
     * 模板导出参数设置
     * 
     * @author JueYue
     *  2013-10-17
     * @version 1.0
     */
    public class TemplateExportParams extends ExcelBaseParams {
    
        /**
         * 输出全部的sheet
         */
        private boolean   scanAllsheet    = false;
        /**
         * 模板的路径
         */
        private String    templateUrl;
    
        /**
         * 需要导出的第几个 sheetNum,默认是第0个
         */
        private Integer[] sheetNum        = new Integer[] { 0 };
    
        /**
         * 设置sheetName 不填就使用原来的
         */
        private String[]  sheetName;
    
        /**
         * 表格列标题行数,默认1
         */
        private int       headingRows     = 1;
    
        /**
         * 表格列标题开始行,默认1
         */
        private int       headingStartRow = 1;
        /**
         * 设置数据源的NUM
         */
        private int       dataSheetNum    = 0;
        /**
         * Excel 导出style
         */
        private Class<?>  style           = ExcelExportStylerDefaultImpl.class;
        /**
         * FOR EACH 用到的局部变量
         */
        private String    tempParams      = "t";
        
        private boolean  colForEach      = false;
    
        /**
         * 默认构造器
         */
        public TemplateExportParams() {
    
        }
    
        /**
         * 构造器
         * @param templateUrl 模板路径
         * @param scanAllsheet 是否输出全部的sheet
         * @param sheetName    sheet的名称,可不填
         */
        public TemplateExportParams(String templateUrl, boolean scanAllsheet, String... sheetName) {
            this.templateUrl = templateUrl;
            this.scanAllsheet = scanAllsheet;
            if (sheetName != null && sheetName.length > 0) {
                this.sheetName = sheetName;
    
            }
        }
    
        /**
         * 构造器
         * @param templateUrl 模板路径
         * @param sheetNum    sheet 的位置,可不填
         */
        public TemplateExportParams(String templateUrl, Integer... sheetNum) {
            this.templateUrl = templateUrl;
            if (sheetNum != null && sheetNum.length > 0) {
                this.sheetNum = sheetNum;
            }
        }
    
        /**
         * 单个sheet输出构造器
         * @param templateUrl 模板路径
         * @param sheetName   sheet的名称
         * @param sheetNum    sheet的位置,可不填
         */
        public TemplateExportParams(String templateUrl, String sheetName, Integer... sheetNum) {
            this.templateUrl = templateUrl;
            this.sheetName = new String[] { sheetName };
            if (sheetNum != null && sheetNum.length > 0) {
                this.sheetNum = sheetNum;
            }
        }
    }
    

    坑2.

    EasyPOI读取的模板有特定的语法规则,新人直接用的时候很容易踩坑

    关于模版使用语法如下:

    下面列举下EasyPoi支持的指令以及作用,最主要的就是各种fe的用法

    • 三目运算 {{test ? obj:obj2}}
    • n: 表示 这个cell是数值类型 {{n:}}
    • le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
    • fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
    • fn: 格式化数字 {{fn:(obj;###.00)}}
    • fe: 遍历数据,创建row
    • !fe: 遍历数据不创建row
    • $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
    • #fe: 横向遍历
    • v_fe: 横向遍历值
    • !if: 删除当前列 {{!if:(test)}}
    • 单引号表示常量值 ‘’ 比如’1’ 那么输出的就是 1
    • &NULL& 空格
    • ]] 换行符 多行遍历导出
    • sum: 统计数据

    一般用的多的就是{{n:}}以及{{fe: list t.XXX}},一个的普通的替换,一个是纵向的循环,本次案例即将讲到

    案例:

    1.先看看模板

    在这里插入图片描述

    2.导入EasyPOI的jar支持

     <!-- easypoi的支持 -->
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-base</artifactId>
                <version>3.2.0</version>
            </dependency>
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-web</artifactId>
                <version>3.2.0</version>
            </dependency>
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-annotation</artifactId>
                <version>3.2.0</version>
            </dependency>
    

    3.测试

    package com.Day5;
    
    import cn.afterturn.easypoi.excel.ExcelExportUtil;
    import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
    import org.apache.poi.ss.usermodel.Workbook;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author 
     * @create 2020-07-08 10:53
     */
    public class EasyPOITest
    {
        public static void main(String[] args) throws IOException
        {
    
            //读取模板,注意EasyPOI只能支持路径,不支持流,这个EasyPOI的缺点
            TemplateExportParams templateExportParams = new TemplateExportParams("G:\\模板.xlsx");
    //        templateExportParams.setColForEach(true);
            // 标题开始行
            // templateExportParams.setHeadingStartRow(0);
            // 标题行数
            // templateExportParams.setHeadingRows(2);
            // 设置sheetName,若不设置该参数,则使用得原本得sheet名称
            templateExportParams.setSheetName("班级体检信息");
    
            Map<String,Object> map = new HashMap<>();
            map.put("provinceName","浙江省");
            map.put("cityName","杭州市");
            map.put("areaName","江干区");
            map.put("schoolName","杭州第一中学");
            map.put("grade","初一");
            map.put("nowDate","2020-7-8");
            List<Map<String,Object>> mapList = new ArrayList<>();
            for (int i = 0; i <10 ; i++)
            {
                Map<String,Object> ml = new HashMap<>();
                ml.put("id",i+1);
                ml.put("className","一班");
                ml.put("studentName","张三");
                ml.put("code","10000011");
                ml.put("odVision","4.8");
                ml.put("osVision","5.3");
                ml.put("odSph","+0.3");
                ml.put("odCyl","+0.3");
                ml.put("odAxial","0.0");
                ml.put("osSph","+0.5");
                ml.put("osCyl","+0.3");
                ml.put("osAxial","-0.2");
                ml.put("odSeriesMirror","5");
                ml.put("osSeriesMirror","4");
                ml.put("odAmetropia","3");
                ml.put("osAmetropia","2");
                mapList.add(ml);
            }
            map.put("maplist",mapList);
    
            Workbook workbook = ExcelExportUtil.exportExcel(templateExportParams, map);
            System.out.println(workbook);
    
            workbook.write(new FileOutputStream(new File("G:\\test.xlsx")));
            workbook.close();
    
        }
    }
    

    4. 结果:

    在这里插入图片描述

    5.总结:

    1.我们在模板里面写到了{{fe:mapList t.id }},这个mapList不用多说就是我们的数据列表,t主要是来源于TemplateExportParams的 tempParams参数,默认是t ,当然你看到不爽也可以修改的

     /**
     * FOR EACH 用到的局部变量
     */
    private String    tempParams      = "t";
    

    2.此处的循环用到的模板语法是{{fe:}},是遍历数据,创建row,也就是向下创建行,一定不能错了,我之前用成{{$fe:}}报了ExcelExportOfTemplateUtil.createExcleByTemplate - firstMovedIndex,lastMovedIndex out of order异常,我后来改成{{fe:}}就正常了

    了解这些,我觉得对模板的简单使用还是可以的

    展开全文
  • POI模板导出

    热门讨论 2014-10-20 18:05:01
    利用POI将数据导出到给定的EXCEL模板,并根据要求合并单元格。
  • Excel模板导出(针对复杂模板情况)

    热门讨论 2011-12-14 10:03:03
    Excel模板导出(针对复杂模板情况)
  • java模板导出word

    千次阅读 2018-11-19 00:50:55
    只需配置好word模板,自动替换指定的模板变量为具体数据,自动导出word 支持导出doc和docx 支持word内有静态图片导出 支持word静态图片上有文字导出 支持中文名word文件导出 解决思路 本demo采用的解决思路...

    原创,转载请注明原创博客

    java模板导出word

    功能描述

    • 只需配置好word模板,自动替换指定的模板变量为具体数据,自动导出word
    • 支持导出doc和docx
    • 支持word静态图片上有文字导出,导出自动添加图片未尝试
    • 支持中文名word文件导出

    解决思路

    本demo采用的解决思路为freemarker导出(freemarker的主要作用为将动态表达式替换为javabean的值)。
    word的doc和docx的底层存储结构不一样,因此对这两种情况分别进行处理。

    freemarker导出doc及docx注意事项

    请取消拼写检查的功能以及,docdocx 和表达式字体设置为一致,否则doc或docx的表达式~{numNo},转为xml后会变成<w:t>${</w:t>…numNo…<w:t>}~,将导致freemark无法正确解析表达式,也可手动删除,但没那必要是不。

    freemarker导出doc

    doc为单文件格式,我们将其转为可编辑的xml格式后,替换掉表达式值,再将其还原为doc文件即可。
    手动模拟步骤:

    • 创建doc,新建内容如“hello,${name}”,文件另存为word 2003 xml文档
    • 用文本编辑器打开xml文件,找到${name},改为张三,文件另存为doc文件
    • 打开doc文件,内容显示为“hello,张三”
      步骤演示图如下 模板导出doc.gif

    代码步骤,对应如上步骤

    • 使用jacob将doc转为了xml,jacob使用注意事项见以下小节
    • freemarker读取模板字符串后,使用javabean值替换模板表达式值,再将xml另存为doc,删除xml临时文件,完成,具体请看代码
    jacob使用

    我的环境为win10 64位系统,linux环境未测试。另一个不用jacob的方案如下,手动将doc转为xml,即直接跳过第一步,使用xml导出doc即可

    • jacob引入maven依赖
    <dependency>  
        <groupId>com.hynnet</groupId>  
        <artifactId>jacob</artifactId>  
        <version>1.18</version>  
    </dependency>
    
    • 将common-freemarker/lib/jacob-1.18-x64.dll的文件复制到C:\Program Files\Java\jdk1.8.0_131\jre\bin\jacob-1.18-x64.dll
    • 写代码将doc转为xml,具体测试请看JacobUtilsTest.docToXmlTest
      注意使用jacob转xml时,最好手动另存为xml看下表达式是否可以正确转,因为单词拼写检查去除后,去除前的单词拼写的样式还是会让我们的表达式不正确。

    freemarker导出docx

    docx是压缩文件格式,我们需要找到对应的文本模板文件,替换掉表达式的值后,将新的文本模板文件替换掉原docx的模板文件即可。
    手动模拟步骤:

    • 创建docx,新建内容如“hello,${name}”
    • 用7z(使用winrar压缩软件也是一样的)打开docx文件,编辑word/document.xml,修改为“hello,张三”,系统为提示是否将已更改的内容更新到压缩包,点击确认即可。
    • 打开docx文件,内容显示为“hello,张三”
      程序实现时,涉及到了压缩包文件的操作,因此使用了apache的压缩包工具类,具体请看代码,步骤演示图如下
      模板导出docx.gif

    代码步骤,对应如上步骤

    • 使用apache zip包打开压缩文件
    • 编辑压缩文件,找到word/document.xml
    • 因为要用freemarker,需要将ftl模板文件生成至模板文件目录中,我们将找到的word/document.xml文件复制过去改为ftl后缀即可(也可不改后缀)
    • 将生成的ftl模板文件中的表达式翻译为具体数据,生成翻译后的ftl文件
    • 将翻译后的ftl文件和其他文件一起写入新的doc文件中,删除2个ftl临时文件,完成,具体请看代码

    注意

    测试代码基本都在junit的FmRealPathManagerTest中写了,但是全是使用的真实路径测试的,带简单图片的我也测试成功了,测试时,需要将类路径下的资源拷贝到你本地真实路径测试即可。
    类路径的不建议使用,动态生成的ftl模板文件在类路径下会失效,需要重启才会生效,另外类路径还有些其他小问题,未测试成功,总而言之,类路径方式不太合理,放弃该方式吧。

    缺陷

    暂无记录,若发现了其他问题,可以提到issue里面。

    代码地址

    https://github.com/shaohj/spring-boot-common-modules/tree/master/common-freemarker

    展开全文
  • easyPOI 模板导出Excel

    千次阅读 2019-02-13 17:25:12
    easyPOI 模板导出Excel步骤: 步骤: 依赖引入 &lt;!-- Easypoi Excel导入导出工具 --&gt; &lt;dependency&gt; &lt;groupId&gt;cn.afterturn&lt;/groupId&gt; &lt;...

    easyPOI 模板导出Excel

    步骤:

    1. 依赖引入
    <!-- Easypoi Excel导入导出工具 -->
      <dependency>
          <groupId>cn.afterturn</groupId>
          <artifactId>easypoi-base</artifactId>
          <version>3.2.0</version>
      </dependency>
      <dependency>
          <groupId>cn.afterturn</groupId>
          <artifactId>easypoi-web</artifactId>
          <version>3.2.0</version>
      </dependency>
      <dependency>
          <groupId>cn.afterturn</groupId>
          <artifactId>easypoi-annotation</artifactId>
          <version>3.2.0</version>
      </dependency>
    
    1. 导出工具类
    package cn.afterturn.easypoi.excel;
    
    import java.util.Collection;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.streaming.SXSSFWorkbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    import cn.afterturn.easypoi.excel.entity.ExportParams;
    import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
    import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
    import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
    import cn.afterturn.easypoi.excel.export.ExcelBatchExportService;
    import cn.afterturn.easypoi.excel.export.ExcelExportService;
    import cn.afterturn.easypoi.excel.export.template.ExcelExportOfTemplateUtil;
    
    
    public class ExcelExportUtil {
    
        private ExcelExportUtil() {
        }
    
        /**
         * @param entity
         *            表格标题属性
         * @param pojoClass
         *            Excel对象Class
         * @param dataSet
         *            Excel对象数据List
         */
        public static Workbook exportBigExcel(ExportParams entity, Class<?> pojoClass,
                                              Collection<?> dataSet) {
            ExcelBatchExportService batchService = ExcelBatchExportService
                .getExcelBatchExportService(entity, pojoClass);
            return batchService.appendData(dataSet);
        }
    
        public static Workbook exportBigExcel(ExportParams entity, List<ExcelExportEntity> excelParams,
                                              Collection<?> dataSet) {
            ExcelBatchExportService batchService = ExcelBatchExportService
                .getExcelBatchExportService(entity, excelParams);
            return batchService.appendData(dataSet);
        }
    
        public static void closeExportBigExcel() {
            ExcelBatchExportService batchService = ExcelBatchExportService.getCurrentExcelBatchExportService();
            if(batchService != null) {
                batchService.closeExportBigExcel();
            }
        }
    
        /**
         * @param entity
         *            表格标题属性
         * @param pojoClass
         *            Excel对象Class
         * @param dataSet
         *            Excel对象数据List
         */
        public static Workbook exportExcel(ExportParams entity, Class<?> pojoClass,
                                           Collection<?> dataSet) {
            Workbook workbook = getWorkbook(entity.getType(),dataSet.size());
            new ExcelExportService().createSheet(workbook, entity, pojoClass, dataSet);
            return workbook;
        }
    
        private static Workbook getWorkbook(ExcelType type, int size) {
            if (ExcelType.HSSF.equals(type)) {
                return new HSSFWorkbook();
            } else if (size < 100000) {
                return new XSSFWorkbook();
            } else {
                return new SXSSFWorkbook();
            }
        }
    
        /**
         * 根据Map创建对应的Excel
         * @param entity
         *            表格标题属性
         * @param entityList
         *            Map对象列表
         * @param dataSet
         *            Excel对象数据List
         */
        public static Workbook exportExcel(ExportParams entity, List<ExcelExportEntity> entityList,
                                           Collection<?> dataSet) {
            Workbook workbook = getWorkbook(entity.getType(),dataSet.size());;
            new ExcelExportService().createSheetForMap(workbook, entity, entityList, dataSet);
            return workbook;
        }
    
        /**
         * 一个excel 创建多个sheet
         * 
         * @param list
         *            多个Map key title 对应表格Title key entity 对应表格对应实体 key data
         *            Collection 数据
         * @return
         */
        public static Workbook exportExcel(List<Map<String, Object>> list, ExcelType type) {
            Workbook workbook = getWorkbook(type,0);
            for (Map<String, Object> map : list) {
                ExcelExportService service = new ExcelExportService();
                service.createSheet(workbook, (ExportParams) map.get("title"),
                    (Class<?>) map.get("entity"), (Collection<?>) map.get("data"));
            }
            return workbook;
        }
    
        /**
         * 导出文件通过模板解析,不推荐这个了,推荐全部通过模板来执行处理
         * 
         * @param params
         *            导出参数类
         * @param pojoClass
         *            对应实体
         * @param dataSet
         *            实体集合
         * @param map
         *            模板集合
         * @return
         */
        @Deprecated
        public static Workbook exportExcel(TemplateExportParams params, Class<?> pojoClass,
                                           Collection<?> dataSet, Map<String, Object> map) {
            return new ExcelExportOfTemplateUtil().createExcleByTemplate(params, pojoClass, dataSet,
                map);
        }
    
        /**
         * 导出文件通过模板解析只有模板,没有集合
         * 
         * @param params
         *            导出参数类
         * @param map
         *            模板集合
         * @return
         */
        public static Workbook exportExcel(TemplateExportParams params, Map<String, Object> map) {
            return new ExcelExportOfTemplateUtil().createExcleByTemplate(params, null, null, map);
        }
    
        /**
         * 导出文件通过模板解析只有模板,没有集合
         * 每个sheet对应一个map,导出到处,key是sheet的NUM
         * @param params
         *            导出参数类
         * @param map
         *            模板集合
         * @return
         */
        public static Workbook exportExcel(Map<Integer, Map<String, Object>> map,
                                           TemplateExportParams params) {
            return new ExcelExportOfTemplateUtil().createExcleByTemplate(params, map);
        }
    
    }
    
    

    下载工具类

    package com.hzrys.atplatform.finance.utils;
    
    import cn.afterturn.easypoi.excel.ExcelExportUtil;
    import cn.afterturn.easypoi.excel.ExcelImportUtil;
    import cn.afterturn.easypoi.excel.entity.ExportParams;
    import cn.afterturn.easypoi.excel.entity.ImportParams;
    import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.springframework.web.multipart.MultipartFile;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.IOException;
    import java.net.URLEncoder;
    import java.util.List;
    import java.util.Map;
    import java.util.NoSuchElementException;
    
    
    public class FileUtil {
        public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response){
            ExportParams exportParams = new ExportParams(title, sheetName);
            exportParams.setCreateHeadRows(isCreateHeader);
            defaultExport(list, pojoClass, fileName, response, exportParams);
    
        }
        public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){
            defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
        }
        public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){
            defaultExport(list, fileName, response);
        }
    
        private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
            Workbook workbook = ExcelExportUtil.exportExcel(exportParams,pojoClass,list);
            if (workbook != null){
                downLoadExcel(fileName, response, workbook);
            }
        }
    
        public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
            try {
                response.setCharacterEncoding("UTF-8");
                response.setHeader("content-Type", "application/vnd.ms-excel");
                response.setHeader("Content-Disposition",
                        "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
                workbook.write(response.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
            Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
            if (workbook != null){
                downLoadExcel(fileName, response, workbook);
            }
        }
    
        public static <T> List<T> importExcel(String filePath,Integer titleRows,Integer headerRows, Class<T> pojoClass){
            if (StringUtils.isBlank(filePath)){
                return null;
            }
            ImportParams params = new ImportParams();
            params.setTitleRows(titleRows);
            params.setHeadRows(headerRows);
            List<T> list = null;
            try {
                list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
            }catch (NoSuchElementException e){
                //("模板不能为空");
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return list;
        }
        public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){
            if (file == null){
                return null;
            }
            ImportParams params = new ImportParams();
            params.setTitleRows(titleRows);
            params.setHeadRows(headerRows);
            List<T> list = null;
            try {
                list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
            }catch (NoSuchElementException e){
                //("excel文件不能为空");
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return list;
        }
    }
    
    

    3.Controller实现

    	/**
         * 导出余额列表Excel
         *
         * @return
         */
        @GetMapping("api/finance/actbalance/excelexport")
        @ApiOperation(httpMethod = "GET", value = "导出余额列表Excel")
        public void actBalanceExcelExport(@Valid ActBalanceQryDto actBalanceQryDto, HttpServletResponse response) {
            TemplateExportParams params = new TemplateExportParams(actBalanceQryDto.isNumDisplay() ? "exceltemplate/科目余额表-数量.xls" : "exceltemplate/科目余额表.xls");
            //excel导出数据
            Map<String, Object> map = actBalanceService.actBalanceExcelExport(actBalanceQryDto);
            Workbook workbook = ExcelExportUtil.exportExcel(params, map);
            FileUtil.downLoadExcel("kmye.xls", response, workbook);
        }
    

    xls模板 单元格内容取自easyPOI命令

    展开全文
  • php excel模板导出

    千次阅读 2018-08-31 10:57:56
    最近两周都在弄关于excel模板导出、excel转pdf、多文件压缩下载。弄得头都大了,接下来说说实现的方法吧。 我用的是laravel5.1的框架,读取模板生成excel,并且插入图片,直接上代码 /*需要引用的扩展 use Excel; ...
  • poi-tl根据word模板导出word、使用spring-thymeleaf模板生成html并通过docx4jhtml转word,使用jxls根据excel模板导出excel(2) thymeleaf 官网 ... 参考 ...Thymeleaf是用于Web和独.
  • EsayPoi模板导出

    千次阅读 2018-07-20 09:47:25
    1.首先导入jar包 <!--EasyPoi导入导出--> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <...
  • 提到Excel导出功能,可能很多人都使用springmvc框架做过,笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能(所谓复杂模板指在模板里的特定表头里有不同的单元格合并以及背景色,字体颜色的填充,...
  • POI模板导出word

    千次阅读 2016-04-17 22:18:27
    java使用poi模板方式完成word导出,亲测可用。
  • 导出时添加模板导出Excel

    千次阅读 2016-12-14 09:48:11
    C# .NET导出时添加模板导出Excel1.EPPlusExcelPackage package = new ExcelPackage(new FileInfo(@"D:\lvou.xlsx"))2.NPOIstring TempletFileName = Server.MapPath("template.xls"); //模板路径 FileStream file = ...
  • xenserver 模板导出导入

    2018-11-05 18:51:00
    xenserver 模板导出导入 由于业务需求,新增一台xenserver,需要将原先创建好的模板环境导入到新的母机上面,此处记录一下 1、导出模板 # 获取需要导出的模板uuid [root@localhost ~]# xe template-list| grep ...
  • jxls使用模板导出Excel表格

    千次阅读 2017-11-09 08:56:30
    jxls使用模板导出Excel表格,java导出Excel
  • Framemarker模板导出

    千次阅读 2019-05-22 19:27:19
    1.首先创建word模板文件,需要替换动态的数据使用字段代替。 2.文件另存为xml文档,使用编辑器打开文档,复制xml源码,(格式比较混乱,可以使用格式化xml编译器整理格式) xml格式化:...
  • jxls模板导出excel

    千次阅读 2019-04-28 10:35:40
    需要将数据导出excel,如果excel的样式很负责,用HSSFWorkbook去画的话,会很复杂,所以此时jxls模板导出就派上用场啦。 二。使用方法: 1.引入jxls的依赖包: net.sf.jxls jxls-core 1.0.5 2.穿件需要导出的...
  • JEECG Word模板导出教程

    千次阅读 2019-04-11 14:16:53
    功能目标:读取word模板,解析数据导出word,对数据赋值 功能点1: 值替换 功能点2: 表格的创建 功能点3: 图片的插入 下面将根据这个三个功能点来做讲解 1.值替换 最基础的功能 在word中需要插入数据的地方加入{{...
  • java 根据excel模板导出excel

    千次阅读 2019-09-12 16:43:20
    java 根据excel模板导出excel 由于项目需求,最近做了一个需要根据查询接口导出excel表格数据的需求 pom依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</...
  • EasyExcel通过模板导出数据

    万次阅读 2020-03-20 17:14:18
    EasyExcel通过模板导出数据 大家好,这两天在做excel导出功能,使用的是easyExcel,不得不说其功能全面,很好入手。 easyExcel入口. 但是在开发的过程中也会遇到一些文档里无法提供解决的问题,这里我分享代码,方便...
  • EasyPoi 使用html模板导出Excel

    千次阅读 2019-11-16 14:46:33
    文章目录EasyPoi 使用html模板导出Excel依赖编写freemarker(.ftl)页面模版将数据渲染到模板中生成html并转换成Excel EasyPoi 使用html模板导出Excel 总体思路如下 1、编写freemarker(.ftl)页面模版 2、将数据渲染到...
  • java通过Excel模板导出各种Excel

    热门讨论 2013-07-04 11:04:48
    java通过Excel模板导出各种Excel , 支持所有的动态数据,列表,图片, 好用的请给好评! 解压导入到eclipse就可以运行看到效果,里面有简单的例子 , 有很复杂的模板,通过模板导出数据。
  • java根据模板导出pdf(动态增加模板页数)

    千次阅读 热门讨论 2018-10-16 14:57:03
    java根据模板导出pdf(动态增加模板页数) 这两天碰到了一个根据模板导出pdf的需求,研究了几天以后,发现网上的资料不太齐全,主要是没找到既根据模板导出,又可以动态增加页数的例子。只能通过各种资料结合来实现...
  • easypoi使用模板导出报XmlValueDisconnectedException 我是在ExcelExportOfTemplateUtil 类中的下面这个方法中的row.getRowNum()方法报错。具体原因不知道,返回的数据集空数组[]修改为null。就好了。 具体如下: ...
  • java根据模板导出excel(二)

    万次阅读 热门讨论 2018-10-19 14:21:32
    最近在做一个项目,关于excel的导出问题,上网查了很多,最后自己整理并编写了关于模板导出的方法,可能会有一些局限性,但是对于简单的模板导出功能是可以实现的,先留下笔记,以供日后参考!思路其实很简单,主要...
  • Java使用EasyExcel实现模板导出一、引入Maven依赖二、模板数据实现2.1模板数据准备2.2实现效果展示2.3代码实现如下: 项目中需要使用到Java来处理Excel模板式导出的情况,记录一次Java使用阿里开源EasyExcel来处理...
  • POI按照模板导出Excel

    2016-11-30 19:42:31
    此代码包括poi导出excel的所有jar,自定义Excel模板后,将数据导入其中
  • Excel模板导出

    千次阅读 2016-12-27 16:03:32
    //下面是实体类package ... import java.util.Date; //模板数据实体public class UserTmpl { private int id; private String name; private Date birthday; private String identity; private String phone; p
  • Java使用模板导出Excel

    千次阅读 2018-07-31 17:28:43
    导出类如下: public String outputEXcel(HttpServletRequest request, HttpServletResponse response) { //报表模板路径 String importFilePath = &amp;amp;quot;/inventory_gap_rate.xlsx&amp;amp;...
  • freemark模板导出pdf

    千次阅读 2017-06-08 20:26:50
    使用freeMark作为模板导出pdf pom引入如下: <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf-itext5</artifactId> <version&...
  • 1.(简单)JFinal实现Demo - 导出Excel 使用模板导出(POI + JXLS); 2.可以自己设定excel的模板,不用通过程序控制excel的样式,从而导出复杂的表格;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,602
精华内容 39,840
关键字:

怎么把模板导出