@excel注解_Excel导入导出Java解决方案推荐
今天鋒哥介紹一款Excel導入導出Java解決方案Easy-POI,以前我們用POI,麻煩點,Easy-POI是封裝好的,用起來Easy點,封裝過,性能好,所以大伙有空可以研究下;
Easy-POI
Easy-POI是一款Excel導入導出解決方案組成的輕量級開源組件。
功能簡介
瀏覽器導出Excel文件(支持單/多sheet)
瀏覽器導出Excel模板文件
指定路徑生成Excel文件(支持單/多sheet)
返回Excel文件(支持單/多sheet)的OutputStream, 一般用于將Excel文件上傳到遠程, 例如FTP
導入Excel文件(支持單/多sheet)
解決的問題
1.解決導出大量數據造成的內存溢出問題(支持分頁查詢數據庫、采用poi官方推薦api(SXSSFWorkbook), 實現指定行數刷新到磁盤)
2.解決導入大量數據造成的內存溢出問題(分頁插入數據庫、采用poi官方推薦api(XSSF and SAX),采用SAX模式一行行讀取到內存當中去)
3.解決含有占位符的空假行造成的讀空值問題
4.解決Long類型或者BigDecimal的精度不準問題
組件特色
1.導入可以自定義解析成功或失敗的處理邏輯
2.導出支持分頁查詢、全量查詢, 自定義每條數據的處理邏輯
3.內置緩存,3萬條11列數據,第一次導出2.2s左右、第二次導出在1.4s左右;第一次導入3.5s左右、第二次導入2.5s左右
4.注解操作, 輕量且便捷
5.內置常用正則表達式類RegexConst(身份證號、手機號、金額、郵件)
6.適配單元格寬度(單元格內容最長不得超過20個漢字)
7.假如出現異常,Sheet、行、列位置也都一并打印
8.注解中的用戶自定義字符串信息以及Excel信息已全部trim,不用擔心存在前后空格的風險
9.Excel樣式簡潔、大方、美觀
10.導出的單條數據假如全部屬性都為null或0或0.0或0.00或空字符串者null字符串,自動忽略,此特性也可讓用戶自定義忽略規則
組件需知
導入和導出只支持尾綴為xlsx的Excel文件、標注注解的屬性順序即Excel列的排列順序、時間轉化格式(dateFormat)默認為“yyyy-MM-dd HH:mm:ss“.
導入
1.當導入Excel, 讀取到空行, 則停止讀取當前Sheet的后面數據行
2.導入Excel文件, 單元格格式使用文本或者常規, 防止出現不可預測異常
3.導入字段類型支持:Date、Short(short)、Integer(int)、Double(double)、Long(long)、Float(float)、BigDecimal、String類型
4.導入BigDecimal字段精度默認為2, roundingMode默認為BigDecimal.ROUND_HALF_EVEN
5.第一行有效單元格內必須包含內容并且以第一行為依據, 導入Excel文件列數必須等于標注注解的屬性數量
6.Date類型字段,Excel與時間轉化格式(dateFormat)相比,格式要保持一致(反例:2018/12/31和“yyyy-MM-dd“)并且長度要一致或更長(反例:"2018-12-31"和yyyy-MM-dd HH:mm:ss"),否則SimpleDateFormat將解析失敗,報 “Unparseable date:”
導出
1.導出BigDecimal字段默認不進行精度格式化
2.分頁查詢默認從第一頁開始, 每頁3000條
3.Excel每超過2000條數據, 將內存中的數據刷新到磁盤當中去
4.使用分Sheet導出方法, 每8萬行數據分Sheet
5.當使用(exportResponse、exportStream、generateExcelStream)方法時, 當單個Sheet超過100萬條則會分Sheet
6.標注屬性類型要與數據庫類型保持一致
擴展
繼承EasyPoi類, 可以使用子類構造器覆蓋以下默認參數
//Excel自動刷新到磁盤的數量public static final int DEFAULT_ROW_ACCESS_WINDOW_SIZE = 2000;//分頁條數public static final int DEFAULT_PAGE_SIZE = 3000;//分Sheet條數public static final int DEFAULT_RECORD_COUNT_PEER_SHEET = 80000;版本
當前為2.0版本,新版本正在開發
使用手冊
1.引入Maven依賴
2.將需要導出或者導入的實體屬性上標注@ExportField或@ImportField注解
3.直接調用導出或導入API即可
POM.xml
io.github.magic-coreeasy-poi2.0@ExportField
/*** 導出注解功能介紹*/public @interface ExportField {/** * excel列名稱 */String columnName();/** * 默認單元格值 */String defaultCellValue() default "";/** * 日期格式 默認 yyyy-MM-dd HH:mm:ss */String dateFormat() default "yyyy-MM-dd HH:mm:ss";/** * BigDecimal精度 默認:-1(默認不開啟BigDecimal格式化) */int scale() default -1;/** * BigDecimal 舍入規則 默認:BigDecimal.ROUND_HALF_EVEN */int roundingMode() default BigDecimal.ROUND_HALF_EVEN;}/*** 導出注解Demo*/public class ExportFielddemo {@ExportField(columnName = "ID", defaultCellValue = "1")private Integer id;@ExportField(columnName = "姓名", defaultCellValue = "張三")private String name;@ExportField(columnName = "收入金額", defaultCellValue = "100", scale = 2, roundingMode=BigDecimal.ROUND_HALF_EVEN)private BigDecimal money;@ExportField(columnName = "創建時間", dateFormat="yyyy-MM-dd", defaultCellValue = "2019-01-01")private Date createTime;}@ImportField
/*** 導入注解功能介紹*/public @interface ImportField {/** * @return 是否必填 */boolean required() default false;/** * 日期格式 默認 yyyy-MM-dd HH:mm:ss */String dateFormat() default "yyyy-MM-dd HH:mm:ss";/** * 正則表達式校驗 */String regex() default "";/** * 正則表達式校驗失敗返回的錯誤信息, regex配置后生效 */String regexMessage() default "正則表達式驗證失敗";/** * BigDecimal精度 默認:2 */int scale() default 2;/** * BigDecimal 舍入規則 默認:BigDecimal.ROUND_HALF_EVEN */int roundingMode() default BigDecimal.ROUND_HALF_EVEN;}/*** 導入注解Demo*/public class ImportField {@ImportField(required = true)private Integer id;@ImportField(regex = IDCARD_REGEX, regexMessage="身份證校驗失敗")private String idCard;@ImportField(scale = 2, roundingMode=BigDecimal.ROUND_HALF_EVEN)private BigDecimal money;@ImportField(dateFormat="yyyy-MM-dd")private Date createTime;}導出Demo
/** * 導出Demo */public class ExportDemo {/** * 瀏覽器導出Excel * * @param httpServletResponse */public void exportResponse(HttpServletResponse httpServletResponse) { ParamEntity queryQaram = new ParamEntity(); EasyPoi.ExportBuilder(httpServletResponse, "Excel文件名", AnnotationEntity.class).exportResponse(queryQaram,new ExportFunction() {/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */@Overridepublic List pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {//分頁查詢操作return new ArrayList(); }/** * 將查詢出來的每條數據進行轉換 * * @param o */@Overridepublic AnnotationEntity convert(ResultEntity o) {//轉換操作 } }); }/** * 瀏覽器多sheet導出Excel * * @param httpServletResponse */public void exportMultiSheetResponse(HttpServletResponse httpServletResponse) { ParamEntity queryQaram = new ParamEntity(); EasyPoi.ExportBuilder(httpServletResponse, "Excel文件名", AnnotationEntity.class).exportMultiSheetStream(queryQaram,new ExportFunction() {/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */@Overridepublic List pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {//分頁查詢操作return new ArrayList(); }/** * 將查詢出來的每條數據進行轉換 * * @param o */@Overridepublic AnnotationEntity convert(ResultEntity o) {//轉換操作 } }); }/** * 導出Excel到指定路徑 */public void exportStream() throws FileNotFoundException { ParamEntity queryQaram = new ParamEntity(); EasyPoi.ExportBuilder(new FileOutputStream(new File("C:\\Users\\Excel文件.xlsx")), "Sheet名", AnnotationEntity.class) .exportStream(queryQaram, new ExportFunction() {/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */@Overridepublic List pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {//分頁查詢操作return new ArrayList(); }/** * 將查詢出來的每條數據進行轉換 * * @param o */@Overridepublic ResultEntity convert(ResultEntity o) {//轉換操作 } }); }/** * 導出多sheet Excel到指定路徑 */@RequestMapping(value = "exportResponse")public void exportMultiSheetStream() throws FileNotFoundException { ParamEntity queryQaram = new ParamEntity(); EasyPoi.ExportBuilder(new FileOutputStream(new File("C:\\Users\\Excel文件.xlsx")), "Sheet名", AnnotationEntity.class) .exportMultiSheetStream(queryQaram, new ExportFunction() {/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */@Overridepublic List pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {//分頁查詢操作return new ArrayList(); }/** * 將查詢出來的每條數據進行轉換 * * @param o */@Overridepublic AnnotationEntity convert(ResultEntity o) {//轉換操作 } }); }/** * 生成Excel OutputStream對象 */public void generateExcelStream() throws FileNotFoundException { ParamEntity queryQaram = new ParamEntity(); OutputStream outputStream = EasyPoi.ExportBuilder(new FileOutputStream(new File("C:\\Users\\Excel文件.xlsx")), "Sheet名", AnnotationEntity.class) .generateExcelStream(queryQaram, new ExportFunction() {/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */@Overridepublic List pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {//分頁查詢操作return new ArrayList(); }/** * 將查詢出來的每條數據進行轉換 * * @param o */@Overridepublic AnnotationEntity convert(ResultEntity o) {//轉換操作 } }); }/** * 生成多Sheet Excel OutputStream對象 */public void generateMultiSheetExcelStream() throws FileNotFoundException { ParamEntity queryQaram = new ParamEntity(); OutputStream outputStream = EasyPoi.ExportBuilder(new FileOutputStream(new File("C:\\Users\\Excel文件.xlsx")), "Sheet名", AnnotationEntity.class) .generateMultiSheetExcelStream(queryQaram, new ExportFunction() {/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */@Overridepublic List pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {//分頁查詢操作return new ArrayList(); }/** * 將查詢出來的每條數據進行轉換 * * @param o */@Overridepublic AnnotationEntity convert(ResultEntity o) {//轉換操作 } }); }/** * 導出Excel模板 */public void exportTemplate(HttpServletResponse httpServletResponse) { EasyPoi.ExportBuilder(httpServletResponse, "Excel模板名稱", AnnotationEntity.class).exportTemplate(); }}導入Demo
/** * 導入Demo */public class ImportDemo {public void importExcel() throws IOException { EasyPoi.ImportBuilder(new FileInputStream(new File("C:\\Users\\導入Excel文件.xlsx")), AnnotationEntity.class) .importExcel(new ExcelImportFunction() {/** * @param sheetIndex 當前執行的Sheet的索引, 從1開始 * @param rowIndex 當前執行的行數, 從1開始 * @param resultEntity Excel行數據的實體 */@Overridepublic void onProcess(int sheetIndex, int rowIndex, AnnotationEntity resultEntity) {//對每條數據自定義校驗以及操作//分頁插入:當讀取行數到達用戶自定義條數執行插入數據庫操作 }/** * @param errorEntity 錯誤信息實體 */@Overridepublic void onError(ErrorEntity errorEntity) {//操作每條數據非空和正則校驗后的錯誤信息 } }); }}往期精彩推薦:
杠把子級別的Java開源后臺管理系統
這個Java分布式快速開發平臺比較厲害!!!
炸街版Java開源OA系統,你值得學習
長按關注鋒哥微信公眾號,非常感謝;
? ? ? ? ? ? ? ????加鋒哥微信 拉你進微信群扯淡^_^:
總結
以上是生活随笔為你收集整理的@excel注解_Excel导入导出Java解决方案推荐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实用必备xp框架模块_Xposed框架安
- 下一篇: java泰拉轴距_Java面向对象