从零玩转EasyPoi-cong-ling-wan-zhuan-easypoi
EasyPoi Excel和 Word简易工具类
easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员
就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板
语言(熟悉的表达式语法),完成以前复杂的写法
基础示例
测试项目: http://git.oschina.net/lemur/easypoi-test
EasyPoi的主要特点
1.设计精巧,使用简单 2.接口丰富,扩展简单 3.默认值多,write less do more 4.AbstractView 支持,web导出可以简单明了
什么场景该用哪个方法
- 导出 1.正规excel导出 (格式简单,数据量可以,5W以内吧) 注解方式: ExcelExportUtil.exportExcel(ExportParams entity, Class<?> pojoClass,Collection<?> dataSet) 2.不定多少列,但是格式依然简单数据库不大 自定义方式: ExcelExportUtil.exportExcel(ExportParams entity, List<ExcelExportEntity> entityList,Collection<?> dataSet) 3.数据量大超过5W,还在100W以内 注解方式 ExcelExportUtil.exportBigExcel(ExportParams entity, Class<?> pojoClass,IExcelExportServer server, Object queryParams) 自定义方式: ExcelExportUtil.exportBigExcel(ExportParams entity, List<ExcelExportEntity> excelParams,IExcelExportServer server, Object queryParams) 4.样式复杂,数据量尽量别大 模板导出 ExcelExportUtil.exportExcel(TemplateExportParams params, Map<String, Object> map) 5.一次导出多个风格不一致的sheet 模板导出 ExcelExportUtil.exportExcel(Map<Integer, Map<String, Object>> map,TemplateExportParams params) 6.一个模板但是要导出非常多份 模板导出 ExcelExportUtil.exportExcelClone(Map<Integer, List<Map<String, Object>>> map,TemplateExportParams params) 7.模板无法满足你的自定义,试试html 自己构造html,然后我给你转成excel ExcelXorHtmlUtil.htmlToExcel(String html, ExcelType type) 8.数据量过百万级了.放弃excel吧,csv导出 注解方式: CsvExportUtil.exportCsv(CsvExportParams params, Class<?> pojoClass, OutputStream outputStream) 自定义方式: CsvExportUtil.exportCsv(CsvExportParams params, List<ExcelExportEntity> entityList, OutputStream outputStream) 9.word导出 模板导出: WordExportUtil.exportWord07(String url, Map<String, Object> map) 10.PDF导出 模板导出: TODO - 导入 如果想提高性能 ImportParams 的concurrentTask 可以帮助并发导入,仅单行,最小1000 excel有单个的那种特殊读取,readSingleCell 参数可以支持 1. 不需要检验,数据量不大(5W以内) 注解或者MAP: ExcelImportUtil.importExcel(File file, Class<?> pojoClass, ImportParams params) 2. 需要导入,数据量不大 注解或者MAP: ExcelImportUtil.importExcelMore(InputStream inputstream, Class<?> pojoClass, ImportParams params) 3. 数据量大了,或者你有特别多的导入操作,内存比较少,仅支持单行 SAX方式 ExcelImportUtil.importExcelBySax(InputStream inputstream, Class<?> pojoClass, ImportParams params, IReadHandler handler) 4. 数据量超过EXCEL限制,CSV读取 小数据量: CsvImportUtil.importCsv(InputStream inputstream, Class<?> pojoClass,CsvImportParams params) 大数据量: CsvImportUtil.importCsv(InputStream inputstream, Class<?> pojoClass,CsvImportParams params, IReadHandler readHandler)
关于Excel导出XLS和XLSX区别
1.导出时间XLS比XLSX快2-3倍 2.导出大小XLS是XLSX的2-3倍或者更多 3.导出需要综合网速和本地速度做考虑^~^
几个工程的说明
1.easypoi 父包--作用大家都懂得 2.easypoi-annotation 基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理 3.easypoi-base 导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能 4.easypoi-web 耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能 5.sax 导入使用xercesImpl这个包(这个包可能造成奇怪的问题哈),word导出使用poi-scratchpad,都作为可选包了
EasyPoi 模板 表达式支持
- 空格分割
- 三目运算 {{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
- &NULL& 控制
- ]] 换行符
EasyPoi导出实例
1.注解,导入导出都是基于注解的,实体上做上注解,标示导出对象,同时可以做一些操作
@ExcelTarget("courseEntity") public class CourseEntity implements java.io.Serializable { /** 主键 */ private String id; /** 课程名称 */ @Excel(name = "课程名称", orderNum = "1", needMerge = true) private String name; /** 老师主键 */ @ExcelEntity(id = "yuwen") @ExcelVerify() private TeacherEntity teacher; /** 老师主键 */ @ExcelEntity(id = "shuxue") private TeacherEntity shuxueteacher; @ExcelCollection(name = "选课学生", orderNum = "4") private List<StudentEntity> students;
2.基础导出
传入导出参数,导出对象,以及对象列表即可完成导出
HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams( "2412312", "测试", "测试"), CourseEntity.class, list);
3.基础导出,带有索引
在到处参数设置一个值,就可以在导出列增加索引
ExportParams params = new ExportParams("2412312", "测试", "测试"); params.setAddIndex(true); HSSFWorkbook workbook = ExcelExportUtil.exportExcel(params, TeacherEntity.class, telist);
4.导出Map
创建类似注解的集合,即可完成Map的导出,略有麻烦
List<ExcelExportEntity> entity = new ArrayList<ExcelExportEntity>(); entity.add(new ExcelExportEntity("姓名", "name")); entity.add(new ExcelExportEntity("性别", "sex")); List<Map<String, String>> list = new ArrayList<Map<String, String>>(); Map<String, String> map; for (int i = 0; i < 10; i++) { map = new HashMap<String, String>(); map.put("name", "1" + i); map.put("sex", "2" + i); list.add(map); } HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams( "测试", "测试"), entity, list);
5.模板导出
根据模板配置,完成对应导出
TemplateExportParams params = new TemplateExportParams(); params.setHeadingRows(2); params.setHeadingStartRow(2); Map<String,Object> map = new HashMap<String, Object>(); map.put("year", "2013"); map.put("sunCourses", list.size()); Map<String,Object> obj = new HashMap<String, Object>(); map.put("obj", obj); obj.put("name", list.size()); params.setTemplateUrl("org/jeecgframework/poi/excel/doc/exportTemp.xls"); Workbook book = ExcelExportUtil.exportExcel(params, CourseEntity.class, list, map);
6.导入
设置导入参数,传入文件或者流,即可获得相应的list
ImportParams params = new ImportParams(); params.setTitleRows(2); params.setHeadRows(2); //params.setSheetNum(9); params.setNeedSave(true); long start = new Date().getTime(); List<CourseEntity> list = ExcelImportUtil.importExcel(new File( "d:/tt.xls"), CourseEntity.class, params);
7.和spring mvc的无缝融合
简单几句话,Excel导出搞定
@RequestMapping(params = "exportXls") public String exportXls(CourseEntity course,HttpServletRequest request,HttpServletResponse response , DataGrid dataGrid,ModelMap map) { CriteriaQuery cq = new CriteriaQuery(CourseEntity.class, dataGrid); org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, course, request.getParameterMap()); List<CourseEntity> courses = this.courseService.getListByCriteriaQuery(cq,false); map.put(NormalExcelConstants.FILE_NAME,"用户信息"); map.put(NormalExcelConstants.CLASS,CourseEntity.class); map.put(NormalExcelConstants.PARAMS,new ExportParams("课程列表", "导出人:Jeecg", "导出信息")); map.put(NormalExcelConstants.DATA_LIST,courses); return NormalExcelConstants.JEECG_EXCEL_VIEW; }
8.Excel导入校验,过滤不符合规则的数据,追加错误信息到Excel,提供常用的校验规则,已经通用的校验接口
@Excel(name = "Email", width = 25) @Max(value = 15,message = "max 最大值不能超过15") private int email; /** * 手机号 */ @Excel(name = "Mobile", width = 20) @NotNull private String mobile; ExcelImportResult<ExcelVerifyEntity> result = ExcelImportUtil.importExcelVerify(new File( "d:/tt.xls"), ExcelVerifyEntity.class, params); for (int i = 0; i < result.getList().size(); i++) { System.out.println(ReflectionToStringBuilder.toString(result.getList().get(i))); }
9.导入Map
设置导入参数,传入文件或者流,即可获得相应的list,自定义Key,需要实现IExcelDataHandler接口
ImportParams params = new ImportParams(); List<Map<String,Object>> list = ExcelImportUtil.importExcel(new File( "d:/tt.xls"), Map.class, params);
10.大数据量Excel导出
exportBigExcel 的方法 ,最后可以关闭closeExportBigExcel 也可以不关闭
11.如果View不起作用,已经发现被其他View处理掉的情况,使用下面这个,进行了统一封装,相同的效果
PoiBaseView public static void render(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response, String viewName) { PoiBaseView view = null; if (BigExcelConstants.BIG_EXCEL_VIEW.equals(viewName)) { view = new BigExcelExportView(); } else if (MapExcelConstants.JEECG_MAP_EXCEL_VIEW.equals(viewName)) { view = new JeecgMapExcelView(); } else if (NormalExcelConstants.JEECG_EXCEL_VIEW.equals(viewName)) { view = new JeecgSingleExcelView(); } else if (TemplateExcelConstants.JEECG_TEMPLATE_EXCEL_VIEW.equals(viewName)) { view = new JeecgTemplateExcelView(); } else if (MapExcelGraphConstants.MAP_GRAPH_EXCEL_VIEW.equals(viewName)) { view = new MapGraphExcelView(); } try { view.renderMergedOutputModel(model, request, response); } catch (Exception e) { LOGGER.error(e.getMessage(), e); } } // Demo @RequestMapping(params = "exportXls") public void exportXls(CourseEntity course,HttpServletRequest request,HttpServletResponse response , DataGrid dataGrid,ModelMap map) { CriteriaQuery cq = new CriteriaQuery(CourseEntity.class, dataGrid); org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, course, request.getParameterMap()); List<CourseEntity> courses = this.courseService.getListByCriteriaQuery(cq,false); map.put(NormalExcelConstants.FILE_NAME,"用户信息"); map.put(NormalExcelConstants.CLASS,CourseEntity.class); map.put(NormalExcelConstants.PARAMS,new ExportParams("课程列表", "导出人:Jeecg", "导出信息")); map.put(NormalExcelConstants.DATA_LIST,courses); PoiBaseView.render(map,request,response,NormalExcelConstants.JEECG_EXCEL_VIEW); }
你的压力来源于无法自律,只是假装努力,现状跟不上内心欲望,所以你焦虑又恐慌。——杨不易
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南