No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

README.md 13 KiB

hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 9 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 9 años
hace 9 años
hace 9 años
hace 9 años
hace 10 años
hace 9 años
hace 9 años
hace 9 años
hace 9 años
hace 9 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
hace 10 años
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. ===========================
  2. EasyPoi Excel和 Word简易工具类
  3. ===========================
  4. easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员
  5. 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板
  6. 语言(熟悉的表达式语法),完成以前复杂的写法
  7. 作者博客:http://blog.csdn.net/qjueyue
  8. 作者邮箱: qrb.jueyue@gmail.com
  9. QQ群: 364192721
  10. [测试项目](http://git.oschina.net/jueyue/easypoi-test): http://git.oschina.net/jueyue/easypoi-test
  11. ---------------------------
  12. EasyPoi的主要特点
  13. --------------------------
  14. 1.设计精巧,使用简单
  15. 2.接口丰富,扩展简单
  16. 3.默认值多,write less do more
  17. 4.AbstractView 支持,web导出可以简单明了
  18. ---------------------------
  19. EasyPoi的几个入口工具类
  20. ---------------------------
  21. 1.ExcelExportUtil Excel导出(
  22. 普通导出,模板导出)
  23. 2.ExcelImportUtil Excel导入
  24. 3.WordExportUtil Word导出(只支持docx ,doc版本poi存在图片的bug,暂不支持)
  25. ---------------------------
  26. 关于Excel导出XLS和XLSX区别
  27. ---------------------------
  28. 1.导出时间XLS比XLSX快2-3倍
  29. 2.导出大小XLS是XLSX的2-3倍或者更多
  30. 3.导出需要综合网速和本地速度做考虑^~^
  31. ---------------------------
  32. 几个工程的说明
  33. ---------------------------
  34. 1.easypoi 父包--作用大家都懂得
  35. 2.easypoi-annotation 基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理
  36. 3.easypoi-base 导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能
  37. 4.easypoi-web 耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能
  38. 5.sax 导入使用xercesImpl这个包(这个包可能造成奇怪的问题哈),word导出使用poi-scratchpad,都作为可选包了
  39. --------------------------
  40. maven
  41. --------------------------
  42. maven库应该都可以了
  43. SNAPSHOT 版本
  44. https://oss.sonatype.org/content/repositories/snapshots/
  45. ```xml
  46. <dependency>
  47. <groupId>org.jeecg</groupId>
  48. <artifactId>easypoi-base</artifactId>
  49. <version>2.1.5</version>
  50. </dependency>
  51. <dependency>
  52. <groupId>org.jeecg</groupId>
  53. <artifactId>easypoi-web</artifactId>
  54. <version>2.1.5</version>
  55. </dependency>
  56. <dependency>
  57. <groupId>org.jeecg</groupId>
  58. <artifactId>easypoi-annotation</artifactId>
  59. <version>2.1.5</version>
  60. </dependency>
  61. ```
  62. ---------------------------
  63. EasyPoi 文档
  64. ---------------------------
  65. 这几篇是旧的教程,不过和现在大同小异
  66. [Excel 介绍篇](http://note.youdao.com/share/?id=ea5166076313d437abbfb28a18d85486&type=note)
  67. [Excel 工具类](http://note.youdao.com/share/?id=dcfef5355d1d75b718be8fd563ad5216&type=note)
  68. [Excel 注解介绍.第一篇](http://note.youdao.com/share/?id=9898d1777ca97b81d82a6e151b880dbb&type=note)
  69. [Excel 注解介绍.第二篇](http://note.youdao.com/share/?id=9898d1777ca97b81d82a6e151b880dbb&type=note)
  70. [Excel 实体类](http://note.youdao.com/share/?id=dab97eababf8e91356f87be204b581e8&type=note)
  71. [Word模板导出教程](http://note.youdao.com/share/?id=26794c8eb4a285828663178c0ae854a2&type=note)
  72. 后面都是新的了
  73. [EasyPoi-在财务报表中的应用](http://git.oschina.net/jueyue/easypoi/wikis/EasyPoi-%E5%9C%A8%E8%B4%A2%E5%8A%A1%E6%8A%A5%E8%A1%A8%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8)
  74. [EasyPoi-如何筛选导出属性](http://git.oschina.net/jueyue/easypoi/wikis/EasyPoi-%E5%A6%82%E4%BD%95%E7%AD%9B%E9%80%89%E5%AF%BC%E5%87%BA%E5%B1%9E%E6%80%A7)
  75. [EasyPoi 在spring mvc中简易开发方式](http://note.youdao.com/share/?id=8b04c4d88a0574a59aeaffd142c8e34b&type=note)
  76. [EasyPoi-新版自定义导出样式类型](http://note.youdao.com/share/?id=7937a9fe15f1016b8f39bf813be894f8&type=note)
  77. [EasyPoi-标签-模板导出的语法介绍](http://blog.csdn.net/qjueyue/article/details/45231801)
  78. [EasyPoi-Excel预览(New)](http://blog.afterturn.cn/?p=34)
  79. [EasyPoi-多行模板输出(New)](http://blog.afterturn.cn/?p=40)
  80. --------------------------
  81. EasyPoi 模板 表达式支持
  82. --------------------------
  83. - 空格分割
  84. - 三目运算 {{test ? obj:obj2}}
  85. - n: 表示 这个cell是数值类型 {{n:}}
  86. - le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
  87. - fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
  88. - fn: 格式化数字 {{fn:(obj;###.00)}}
  89. - fe: 遍历数据,创建row
  90. - !fe: 遍历数据不创建row
  91. - $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
  92. - !if: 删除当前列 {{!if:(test)}}
  93. - 单引号表示常量值 '' 比如'1' 那么输出的就是 1
  94. - &NULL& 控制
  95. - ]] 换行符
  96. --------------------------
  97. pom说明
  98. --------------------------
  99. word和sax读取的时候才使用,就不是必须的了,请手动引用
  100. ```xml
  101. <!-- sax 读取时候用到的 -->
  102. <dependency>
  103. <groupId>xerces</groupId>
  104. <artifactId>xercesImpl</artifactId>
  105. <version>${xerces.version}</version>
  106. <optional>true</optional>
  107. </dependency>
  108. <dependency>
  109. <groupId>org.apache.poi</groupId>
  110. <artifactId>poi-scratchpad</artifactId>
  111. <version>${poi.version}</version>
  112. <optional>true</optional>
  113. </dependency>
  114. ```
  115. --------------------------
  116. 版本修改
  117. --------------------------
  118. - 2.1.5 bug修复,建议升级
  119. - fix指定sheetNum导入的bug
  120. - add导入时候setIndex(null) 可以防止识别为集合的问题
  121. - fix导入excel列数量判断有bug,导致有些列数漏掉校验
  122. - update修改了getValue的方式,减少导入cell value识别错误
  123. - 2.1.4
  124. - 模板输出自动合并单元格功能
  125. - 多行模板数据导出
  126. - 导出链接功能
  127. - 把反射加入了缓存
  128. - word和Excel语法保持了统一
  129. - Excel to Html 增加了图片显示和缓存功能
  130. - 导入增加一个参数startSheetIndex 用以指定sheet位置
  131. - 2.1.3
  132. - 屏蔽了科学计数法的问题
  133. - 修复了多模版记得清空记录信息
  134. - 加入了map setValue的接口,用以自定义setValue,主要是可以自定义key
  135. - 把合并单元格的数据提起出来,让大家都可以复用
  136. - 多个sheet导出问题
  137. - 2.1.2
  138. - groupId 改成org.jeecg,为了以后可以直接提交到中央库了
  139. - 把test 那个模块删除了
  140. - 提供了Excel 预览的功能
  141. - type 新增一个 4类型,用于Excel是数字,但是java 是String,防止科学计数法
  142. - 修复一些bug
  143. - 2.1.1-release -小更新/防止下一个预览功能太久不能发布更新
  144. - $fe标签
  145. - 几个可能影响使用的bug
  146. - 导入Map的支持
  147. - 2.0.9-release--模板功能更新
  148. - 修复了中文路径,float类型导入等bug
  149. - 增加了根据CellStyler判断cell类型的功能
  150. - 优化了一下代码,sort 的compare 改为类实现接口,getValue统一由public处理
  151. - height和width 都改成double 可能更加准确的调整
  152. - 升级到common-lang3
  153. - 可以循环解析多个模板
  154. - !!模板增加了多个标签功能
  155. - 2.0.8-release--小版本更新
  156. - 分开了基础注解和base包,编译maven多模块集成
  157. - 加强了Excel导入的校验功能,可以追加错误信息,过滤不合格数据
  158. - 修复了spring mvc下的07版本不支持的问题
  159. - 添加了@ Controller 注解,扫描org.jeecgframework.poi.excel.view路径就可以了,不用写bean了
  160. - 加强了styler的自定义功能,参数改为entity,自由控制
  161. - test包下面增加了几个demo
  162. - 导出添加了一个冰冻列属性,可以简单执行
  163. - PS: 经过这段时间项目中的测试,模板导出Excel复杂报表可以省5倍以上的时间,特别是样式复杂的完全可以在Excel中完成,不是在代码中完成了
  164. - 2.0.7-release--推荐更新
  165. - 增加了合计的参数,便于统计合计信息
  166. - 修改了样式设置,使用默认设置,提供其他设置,和样式接口
  167. - 模板导出增加了插入导出的功能
  168. - 模板导出重用了Excel导出的代码功能更加强劲
  169. - 新增了Sax导入方式,大数据导入提供接口操作
  170. - Word修改了页眉页脚不替换的bug
  171. - 修改了捕获异常日志的bug
  172. - 修复了模板导出,Spring View没识别版本的bug
  173. - 修复了其他一些小bug
  174. - 2.0.6-release
  175. - 修复导入的自定义格式异常
  176. - 修复导入的BigDecimal不识别
  177. - 导出大数据替换为SXSSFWorkbook,提高07版本Excel导出效率
  178. - 根据sonar的提示,修复编码格式问题
  179. - 做了更加丰富的测试
  180. - word 导出的优化
  181. - 2.0.6-SNAPSHOT
  182. - 增加map的导出
  183. - 增加index 列
  184. ---------------------------
  185. EasyPoi导出实例
  186. ---------------------------
  187. 1.注解,导入导出都是基于注解的,实体上做上注解,标示导出对象,同时可以做一些操作
  188. ```Java
  189. @ExcelTarget("courseEntity")
  190. public class CourseEntity implements java.io.Serializable {
  191. /** 主键 */
  192. private String id;
  193. /** 课程名称 */
  194. @Excel(name = "课程名称", orderNum = "1", needMerge = true)
  195. private String name;
  196. /** 老师主键 */
  197. @ExcelEntity(id = "yuwen")
  198. @ExcelVerify()
  199. private TeacherEntity teacher;
  200. /** 老师主键 */
  201. @ExcelEntity(id = "shuxue")
  202. private TeacherEntity shuxueteacher;
  203. @ExcelCollection(name = "选课学生", orderNum = "4")
  204. private List<StudentEntity> students;
  205. ```
  206. 2.基础导出
  207. 传入导出参数,导出对象,以及对象列表即可完成导出
  208. ```Java
  209. HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams(
  210. "2412312", "测试", "测试"), CourseEntity.class, list);
  211. ```
  212. 3.基础导出,带有索引
  213. 在到处参数设置一个值,就可以在导出列增加索引
  214. ```Java
  215. ExportParams params = new ExportParams("2412312", "测试", "测试");
  216. params.setAddIndex(true);
  217. HSSFWorkbook workbook = ExcelExportUtil.exportExcel(params,
  218. TeacherEntity.class, telist);
  219. ```
  220. 4.导出Map
  221. 创建类似注解的集合,即可完成Map的导出,略有麻烦
  222. ```Java
  223. List<ExcelExportEntity> entity = new ArrayList<ExcelExportEntity>();
  224. entity.add(new ExcelExportEntity("姓名", "name"));
  225. entity.add(new ExcelExportEntity("性别", "sex"));
  226. List<Map<String, String>> list = new ArrayList<Map<String, String>>();
  227. Map<String, String> map;
  228. for (int i = 0; i < 10; i++) {
  229. map = new HashMap<String, String>();
  230. map.put("name", "1" + i);
  231. map.put("sex", "2" + i);
  232. list.add(map);
  233. }
  234. HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams(
  235. "测试", "测试"), entity, list);
  236. ```
  237. 5.模板导出
  238. 根据模板配置,完成对应导出
  239. ```Java
  240. TemplateExportParams params = new TemplateExportParams();
  241. params.setHeadingRows(2);
  242. params.setHeadingStartRow(2);
  243. Map<String,Object> map = new HashMap<String, Object>();
  244. map.put("year", "2013");
  245. map.put("sunCourses", list.size());
  246. Map<String,Object> obj = new HashMap<String, Object>();
  247. map.put("obj", obj);
  248. obj.put("name", list.size());
  249. params.setTemplateUrl("org/jeecgframework/poi/excel/doc/exportTemp.xls");
  250. Workbook book = ExcelExportUtil.exportExcel(params, CourseEntity.class, list,
  251. map);
  252. ```
  253. 6.导入
  254. 设置导入参数,传入文件或者流,即可获得相应的list
  255. ```Java
  256. ImportParams params = new ImportParams();
  257. params.setTitleRows(2);
  258. params.setHeadRows(2);
  259. //params.setSheetNum(9);
  260. params.setNeedSave(true);
  261. long start = new Date().getTime();
  262. List<CourseEntity> list = ExcelImportUtil.importExcel(new File(
  263. "d:/tt.xls"), CourseEntity.class, params);
  264. ```
  265. 7.和spring mvc的无缝融合
  266. 简单几句话,Excel导出搞定
  267. ```Java
  268. @RequestMapping(params = "exportXls")
  269. public String exportXls(CourseEntity course,HttpServletRequest request,HttpServletResponse response
  270. , DataGrid dataGrid,ModelMap map) {
  271. CriteriaQuery cq = new CriteriaQuery(CourseEntity.class, dataGrid);
  272. org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, course, request.getParameterMap());
  273. List<CourseEntity> courses = this.courseService.getListByCriteriaQuery(cq,false);
  274. map.put(NormalExcelConstants.FILE_NAME,"用户信息");
  275. map.put(NormalExcelConstants.CLASS,CourseEntity.class);
  276. map.put(NormalExcelConstants.PARAMS,new ExportParams("课程列表", "导出人:Jeecg",
  277. "导出信息"));
  278. map.put(NormalExcelConstants.DATA_LIST,courses);
  279. return NormalExcelConstants.JEECG_EXCEL_VIEW;
  280. }
  281. ```
  282. 8.Excel导入校验,过滤不符合规则的数据,追加错误信息到Excel,提供常用的校验规则,已经通用的校验接口
  283. ```Java
  284. /**
  285. * Email校验
  286. */
  287. @Excel(name = "Email", width = 25)
  288. @ExcelVerify(isEmail = true, notNull = true)
  289. private String email;
  290. /**
  291. * 手机号校验
  292. */
  293. @Excel(name = "Mobile", width = 20)
  294. @ExcelVerify(isMobile = true, notNull = true)
  295. private String mobile;
  296. ExcelImportResult<ExcelVerifyEntity> result = ExcelImportUtil.importExcelVerify(new File(
  297. "d:/tt.xls"), ExcelVerifyEntity.class, params);
  298. for (int i = 0; i < result.getList().size(); i++) {
  299. System.out.println(ReflectionToStringBuilder.toString(result.getList().get(i)));
  300. }
  301. ```
  302. 9.导入Map
  303. 设置导入参数,传入文件或者流,即可获得相应的list,自定义Key,需要实现IExcelDataHandler接口
  304. ```Java
  305. ImportParams params = new ImportParams();
  306. List<Map<String,Object>> list = ExcelImportUtil.importExcel(new File(
  307. "d:/tt.xls"), Map.class, params);
  308. ```