日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EasyExcel快速上手~读取

發布時間:2024/7/23 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EasyExcel快速上手~读取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對象

// 如果沒有特殊說明,下面的案例將默認使用這個實體類 public class DemoData {private String string;private Date date;private Double doubleData;// getting setting }

監聽器

// 如果沒有特殊說明,下面的案例將默認使用這個監聽器 public class DemoDataListener extends AnalysisEventListener<DemoData> {List<DemoData> list = new ArrayList<DemoData>();/*** 如果使用了spring,請使用這個構造方法。每次創建Listener的時候需要把spring管理的類傳進來*/public DemoDataListener() {}/*** 這個每一條數據解析都會來調用** @param data* @param context*/@Overridepublic void invoke(DemoData data, AnalysisContext context) {System.out.println("解析到一條數據:{}", JSON.toJSONString(data));list.add(data);}/*** 所有數據解析完成了 都會來調用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println(JSON.toJSONString(list));} }

代碼

@Test public void simpleRead() {// 寫法1:String fileName = "demo.xlsx";// 這里 需要指定讀用哪個class去讀,然后讀取第一個sheet 文件流會自動關閉EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();// 寫法2:fileName = "demo.xlsx";ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build();ReadSheet readSheet = EasyExcel.readSheet(0).build();excelReader.read(readSheet);// 這里千萬別忘記關閉,讀的時候會創建臨時文件,到時磁盤會崩的excelReader.finish(); }

指定列的下標或名稱

對象

public class DemoData {/*** 強制讀取第三個 這里不建議 index 和 name 同時用,要么一個對象只用index,要么一個對象只用name去匹配*/@ExcelProperty(index = 2)private Double doubleData;/*** 用名字去匹配,這里需要注意,如果名字重復,會導致只有一個字段讀取到數據*/@ExcelProperty("字符串標題")private String string;@ExcelProperty("日期標題")private Date date; }

代碼

@Test public void indexOrNameRead() {String fileName = "demo.xlsx";// 這里默認讀取第一個sheetEasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead(); }

讀取多個sheet

代碼

@Test public void repeatedRead() {String fileName = "demo.xlsx";// 讀取全部sheet// 這里需要注意 DemoDataListener的doAfterAllAnalysed 會在每個sheet讀取完畢后調用一次。然后所有sheet都會往同一個DemoDataListener里面寫EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll();// 讀取部分sheetfileName = "demo.xlsx";ExcelReader excelReader = EasyExcel.read(fileName).build();// 這里為了簡單 所以注冊了 同樣的head 和Listener 自己使用功能必須不同的Listener// readSheet參數設置讀取sheet的序號ReadSheet readSheet1 =EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();ReadSheet readSheet2 =EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();// 這里注意 一定要把sheet1 sheet2 一起傳進去,不然有個問題就是03版的excel 會讀取多次,浪費性能excelReader.read(readSheet1, readSheet2);// 這里千萬別忘記關閉,讀的時候會創建臨時文件,到時磁盤會崩的excelReader.finish(); }

自定義格式轉換

對象

@Data public class ConverterData {/*** converter屬性定義自己的字符串轉換器*/@ExcelProperty(converter = CustomStringConverter.class)private String string;/*** 這里用string 去接日期才能格式化*/@DateTimeFormat("yyyy年MM月dd日 HH時mm分ss秒")private String date;/*** 我想接收百分比的數字*/@NumberFormat("#.##%")private String doubleData; }

自定義轉換器

public class CustomStringStringConverter implements Converter<String> {@Overridepublic Class supportJavaTypeKey() {return String.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}/*** 這里讀的時候會調用** @param cellData* NotNull* @param contentProperty* Nullable* @param globalConfiguration* NotNull* @return*/@Overridepublic String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return "自定義:" + cellData.getStringValue();}/*** 這里是寫的時候會調用 不用管** @param value* NotNull* @param contentProperty* Nullable* @param globalConfiguration* NotNull* @return*/@Overridepublic CellData convertToExcelData(String value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return new CellData(value);}}

代碼

@Test public void converterRead() {String fileName = "demo.xlsx";// 這里 需要指定讀用哪個class去讀,然后讀取第一個sheet EasyExcel.read(fileName, ConverterData.class, new ConverterDataListener())// 這里注意 我們也可以registerConverter來指定自定義轉換器, 但是這個轉換變成全局了, 所有java為string,excel為string的都會用這個轉換器。// 如果就想單個字段使用請使用@ExcelProperty 指定converter// .registerConverter(new CustomStringStringConverter())// 讀取sheet.sheet().doRead(); }

多行頭

代碼

@Test public void complexHeaderRead() {String fileName = "demo.xlsx";// 這里 需要指定讀用哪個class去讀,然后讀取第一個sheet EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet()// 這里可以設置1,因為頭就是一行。如果多行頭,可以設置其他值。不傳入默認1行.headRowNumber(1).doRead(); }

讀取表頭數據

監聽器

/*** 這里會一行行的返回頭* 監聽器只需要重寫這個方法就可以讀取到頭信息* @param headMap* @param context*/ @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {LOGGER.info("解析到一條頭數據:{}", JSON.toJSONString(headMap)); }

代碼

@Test public void headerRead() {String fileName = "demo.xlsx";// 這里 需要指定讀用哪個class去讀,然后讀取第一個sheetEasyExcel.read(fileName, DemoData.class, new ReadDataListener()).sheet().doRead(); }

異常處理

監聽器

/** * 監聽器實現這個方法就可以在讀取數據的時候獲取到異常信息 */ @Override public void onException(Exception exception, AnalysisContext context) {LOGGER.error("解析失敗,但是繼續解析下一行:{}", exception.getMessage());// 如果是某一個單元格的轉換異常 能獲取到具體行號// 如果要獲取頭的信息 配合invokeHeadMap使用if (exception instanceof ExcelDataConvertException) {ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;LOGGER.error("第{}行,第{}列解析異常", excelDataConvertException.getRowIndex(),excelDataConvertException.getColumnIndex());} }

web讀取

代碼

@PostMapping("upload") @ResponseBody public String upload(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();return "SUCCESS"; }

總結

以上是生活随笔為你收集整理的EasyExcel快速上手~读取的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。