AutoPOI EXCEL导出导入工具

AutoPOI (Excel和 Word简易工具类 EasyPOI衍变升级版)

AutoPOI 功能如同名字auto,追求的就是自动化,让一个没接触过poi的人员,可以傻瓜式半智能化的快速实现Excel导入导出、Word模板导出、可以仅仅5行代码就可以完成Excel的导入导出。


AutoPOI的主要特点

  1. 1.设计精巧,使用简单
  2. 2.接口丰富,扩展简单
  3. 3.默认值多,write less do more
  4. 4.AbstractView 支持,web导出可以简单明了

AutoPOI的几个入口工具类

  1. 1.ExcelExportUtil Excel导出(普通导出,模板导出)
  2. 2.ExcelImportUtil Excel导入
  3. 3.WordExportUtil Word导出(只支持docx ,doc版本poi存在图片的bug,暂不支持)

关于Excel导出XLS和XLSX区别

  1. 1.导出时间XLSXLSX2-3
  2. 2.导出大小XLSXLSX2-3倍或者更多
  3. 3.导出需要综合网速和本地速度做考虑^~^

几个工程的说明

  1. 1.autopoi-parent 父包--作用大家都懂得
  2. 2.autopoi 导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能
  3. 3.autopoi-web 耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能
  4. 4.sax 导入使用xercesImpl这个包(这个包可能造成奇怪的问题哈),word导出使用poi-scratchpad,都作为可选包了

maven

  1. <dependency>
  2. <groupId>org.jeecgframework</groupId>
  3. <artifactId>autopoi-web</artifactId>
  4. <version>1.0.2</version>
  5. </dependency>

AutoPoi 模板 表达式支持

  • 空格分割
  • 三目运算 {{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()行,然后插入
  • !if: 删除当前列 {{!if:(test)}}
  • 单引号表示常量值 '' 比如'1' 那么输出的就是 1

AutoPoi导出实例

1.注解,导入导出都是基于注解的,实体上做上注解,标示导出对象,同时可以做一些操作

  1. @ExcelTarget("courseEntity")
  2. public class CourseEntity implements java.io.Serializable {
  3. /** 主键 */
  4. private String id;
  5. /** 课程名称 */
  6. @Excel(name = "课程名称", orderNum = "1", needMerge = true)
  7. private String name;
  8. /** 老师主键 */
  9. @ExcelEntity(id = "yuwen")
  10. @ExcelVerify()
  11. private TeacherEntity teacher;
  12. /** 老师主键 */
  13. @ExcelEntity(id = "shuxue")
  14. private TeacherEntity shuxueteacher;
  15. @ExcelCollection(name = "选课学生", orderNum = "4")
  16. private List<StudentEntity> students;

2.基础导出 传入导出参数,导出对象,以及对象列表即可完成导出

  1. HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams(
  2. "2412312", "测试", "测试"), CourseEntity.class, list);

3.基础导出,带有索引 在到处参数设置一个值,就可以在导出列增加索引

  1. ExportParams params = new ExportParams("2412312", "测试", "测试");
  2. params.setAddIndex(true);
  3. HSSFWorkbook workbook = ExcelExportUtil.exportExcel(params,
  4. TeacherEntity.class, telist);

4.导出Map 创建类似注解的集合,即可完成Map的导出,略有麻烦

  1. List<ExcelExportEntity> entity = new ArrayList<ExcelExportEntity>();
  2. entity.add(new ExcelExportEntity("姓名", "name"));
  3. entity.add(new ExcelExportEntity("性别", "sex"));
  4. List<Map<String, String>> list = new ArrayList<Map<String, String>>();
  5. Map<String, String> map;
  6. for (int i = 0; i < 10; i++) {
  7. map = new HashMap<String, String>();
  8. map.put("name", "1" + i);
  9. map.put("sex", "2" + i);
  10. list.add(map);
  11. }
  12. HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams(
  13. "测试", "测试"), entity, list);

5.模板导出 根据模板配置,完成对应导出

  1. TemplateExportParams params = new TemplateExportParams();
  2. params.setHeadingRows(2);
  3. params.setHeadingStartRow(2);
  4. Map<String,Object> map = new HashMap<String, Object>();
  5. map.put("year", "2013");
  6. map.put("sunCourses", list.size());
  7. Map<String,Object> obj = new HashMap<String, Object>();
  8. map.put("obj", obj);
  9. obj.put("name", list.size());
  10. params.setTemplateUrl("org/jeecgframework/poi/excel/doc/exportTemp.xls");
  11. Workbook book = ExcelExportUtil.exportExcel(params, CourseEntity.class, list,
  12. map);

6.导入 设置导入参数,传入文件或者流,即可获得相应的list

  1. ImportParams params = new ImportParams();
  2. params.setTitleRows(2);
  3. params.setHeadRows(2);
  4. //params.setSheetNum(9);
  5. params.setNeedSave(true);
  6. long start = new Date().getTime();
  7. List<CourseEntity> list = ExcelImportUtil.importExcel(new File(
  8. "d:/tt.xls"), CourseEntity.class, params);

7.SpringMvc的无缝融合 简单几句话,Excel导出搞定

  1. @RequestMapping(value = "/exportXls")
  2. public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
  3. ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
  4. List<JeecgDemo> pageList = jeecgDemoService.list();
  5. //导出文件名称
  6. mv.addObject(NormalExcelConstants.FILE_NAME,"导出Excel文件名字");
  7. //注解对象Class
  8. mv.addObject(NormalExcelConstants.CLASS,JeecgDemo.class);
  9. //自定义表格参数
  10. mv.addObject(NormalExcelConstants.PARAMS,new ExportParams("自定义导出Excel模板内容标题", "自定义Sheet名字"));
  11. //导出数据列表
  12. mv.addObject(NormalExcelConstants.DATA_LIST,pageList);
  13. return mv;
  14. }
自定义视图用途描述
JeecgMapExcelView实体对象导出视图例如:List<JeecgDemo>
JeecgEntityExcelViewMap对象导出视图List<Map<String, String>> list
JeecgTemplateExcelViewExcel模板导出视图-
JeecgTemplateWordViewWord模板导出视图-

8.Excel导入校验,过滤不符合规则的数据,追加错误信息到Excel,提供常用的校验规则,已经通用的校验接口

  1. /**
  2. * Email校验
  3. */
  4. @Excel(name = "Email", width = 25)
  5. @ExcelVerify(isEmail = true, notNull = true)
  6. private String email;
  7. /**
  8. * 手机号校验
  9. */
  10. @Excel(name = "Mobile", width = 20)
  11. @ExcelVerify(isMobile = true, notNull = true)
  12. private String mobile;
  13. ExcelImportResult<ExcelVerifyEntity> result = ExcelImportUtil.importExcelVerify(new File(
  14. "d:/tt.xls"), ExcelVerifyEntity.class, params);
  15. for (int i = 0; i < result.getList().size(); i++) {
  16. System.out.println(ReflectionToStringBuilder.toString(result.getList().get(i)));
  17. }

9.导入Map 设置导入参数,传入文件或者流,即可获得相应的list,自定义Key,需要实现IExcelDataHandler接口

  1. ImportParams params = new ImportParams();
  2. List<Map<String,Object>> list = ExcelImportUtil.importExcel(new File(
  3. "d:/tt.xls"), Map.class, params);

10.字典用法 在实体属性注解excel中添加dicCode="",此处dicCode即为jeecg系统中数据字典的Code

  1. @Excel(name="性别",width=15,dicCode="sex")
  2. private java.lang.String sex;

11.字典表用法 此处dictTable为数据库表名,dicCode为关联字段名,dicText为excel中显示的内容对应的字段

  1. @Excel(name="部门",dictTable="t_s_depart",dicCode="id",dicText="departname")
  2. private java.lang.String depart;

12.Replace用法 若数据库中存储的是0/1 ,则导出/导入的excel单元格中显示的是女/男

  1. @Excel(name="测试替换",width=15,replace={"男_1","女_0"})
  2. private java.lang.String fdReplace;

13.高级字段转换用法

  • exportConvert:在导出的时候需要替换值则配置该值为true,同时增加一个方法,方法名为原get方法名前加convert。
  • importConvert:在导入的时候需要替换值则配置该值为true,同时增加一个方法,方法名为原set方法名前加convert。
  1. @Excel(name="测试转换",width=15,exportConvert=true,importConvert=true)
  2. private java.lang.String fdConvert;
  3. /**
  4. * 转换值示例: 在该字段值的后面加上元
  5. * @return
  6. */
  7. public String convertgetFdConvert(){
  8. return this.fdConvert+"元";
  9. }
  10. /**
  11. * 转换值示例: 替换掉excel单元格中的"元"
  12. * @return
  13. */
  14. public void convertsetFdConvert(String fdConvert){
  15. this.fdConvert = fdConvert.replace("元","");
  16. }

Excel 注解说明

@Excel

属性类型默认值功能
nameStringnull列名,支持name_id
needMergebooleanfasle是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)
orderNumString"0"列的排序,支持name_id
replaceString[]{}值得替换 导出是{a_id,b_id} 导入反过来
savePathString"upload"导入文件保存路径,如果是图片可以填写,默认是upload/className/ IconEntity这个类对应的就是upload/Icon/
typeint1导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本
widthdouble10列宽
heightdouble10列高,后期打算统一使用@ExcelTarget的height,这个会被废弃,注意
isStatisticsbooleanfasle自动统计数据,在追加一行统计,把所有数据都和输出 这个处理会吞没异常,请注意这一点
isHyperlinkbooleanFALSE超链接,如果是需要实现接口返回对象
isImportFieldbooleanTRUE(作废参数)校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持name_id
exportFormatString""导出的时间格式,以这个是否为空来判断是否需要格式化日期
importFormatString""导入的时间格式,以这个是否为空来判断是否需要格式化日期
formatString""时间格式,相当于同时设置了exportFormat 和 importFormat
databaseFormatString"yyyyMMddHHmmss"导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出
numFormatString""数字格式化,参数是Pattern,使用的对象是DecimalFormat
imageTypeint1导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的
suffixString""文字后缀,如% 90 变成90%
isWrapbooleanTRUE是否换行 即支持\n
mergeRelyint[]{}合并单元格依赖关系,比如第二列合并是基于第一列 则{0}就可以了
mergeVerticalbooleanfasle纵向合并内容相同的单元格
fixedIndexint-1对应excel的列,忽略名字
isColumnHiddenbooleanFALSE导出隐藏列

@ExcelCollection

属性类型默认值功能
idStringnull定义ID
nameStringnull定义集合列名,支持nanm_id
orderNumint0排序,支持name_id
typeClass<?>ArrayList.class导入时创建对象使用

单表导出实体注解源码

  1. public class SysUser implements Serializable {
  2. /**id*/
  3. private String id;
  4. /**登录账号 */
  5. @Excel(name = "登录账号", width = 15)
  6. private String username;
  7. /**真实姓名*/
  8. @Excel(name = "真实姓名", width = 15)
  9. private String realname;
  10. /**头像*/
  11. @Excel(name = "头像", width = 15)
  12. private String avatar;
  13. /**生日*/
  14. @Excel(name = "生日", width = 15, format = "yyyy-MM-dd")
  15. private Date birthday;
  16. /**性别(1:男 2:女)*/
  17. @Excel(name = "性别", width = 15,dicCode="sex")
  18. private Integer sex;
  19. /**电子邮件*/
  20. @Excel(name = "电子邮件", width = 15)
  21. private String email;
  22. /**电话*/
  23. @Excel(name = "电话", width = 15)
  24. private String phone;
  25. /**状态(1:正常 2:冻结 )*/
  26. @Excel(name = "状态", width = 15,replace={"正常_1","冻结_0"})
  27. private Integer status;

一对多导出实体注解源码

  1. @Data
  2. public class JeecgOrderMainPage {
  3. /**主键*/
  4. private java.lang.String id;
  5. /**订单号*/
  6. @Excel(name="订单号",width=15)
  7. private java.lang.String orderCode;
  8. /**订单类型*/
  9. private java.lang.String ctype;
  10. /**订单日期*/
  11. @Excel(name="订单日期",width=15,format = "yyyy-MM-dd")
  12. private java.util.Date orderDate;
  13. /**订单金额*/
  14. @Excel(name="订单金额",width=15)
  15. private java.lang.Double orderMoney;
  16. /**订单备注*/
  17. private java.lang.String content;
  18. /**创建人*/
  19. private java.lang.String createBy;
  20. /**创建时间*/
  21. private java.util.Date createTime;
  22. /**修改人*/
  23. private java.lang.String updateBy;
  24. /**修改时间*/
  25. private java.util.Date updateTime;
  26. @ExcelCollection(name="客户")
  27. private List<JeecgOrderCustomer> jeecgOrderCustomerList;
  28. @ExcelCollection(name="机票")
  29. private List<JeecgOrderTicket> jeecgOrderTicketList;
  30. }