日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

java實現(xiàn)excel導(dǎo)入 java批量導(dǎo)入excel數(shù)據(jù)( 六 )

  • 動態(tài)導(dǎo)入工具類
/** * 創(chuàng)建一個監(jiān)聽器 */public class DynamicEasyExcelListener extends AnalysisEventListener<Map<Integer, String>> {private static final Logger LOGGER = LoggerFactory.getLogger(UserDataListener.class);/*** 表頭數(shù)據(jù)(存儲所有的表頭數(shù)據(jù))*/private List<Map<Integer, String>> headList = new ArrayList<>();/*** 數(shù)據(jù)體*/private List<Map<Integer, String>> dataList = new ArrayList<>();/*** 這里會一行行的返回頭** @param headMap* @param context*/@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {LOGGER.info("解析到一條頭數(shù)據(jù):{}", JSON.toJSONString(headMap));//存儲全部表頭數(shù)據(jù)headList.add(headMap);}/*** 這個每一條數(shù)據(jù)解析都會來調(diào)用** @param data*one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {LOGGER.info("解析到一條數(shù)據(jù):{}", JSON.toJSONString(data));dataList.add(data);}/*** 所有數(shù)據(jù)解析完成了 都會來調(diào)用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 這里也要保存數(shù)據(jù),確保最后遺留的數(shù)據(jù)也存儲到數(shù)據(jù)庫LOGGER.info("所有數(shù)據(jù)解析完成!");}public List<Map<Integer, String>> getHeadList() {return headList;}public List<Map<Integer, String>> getDataList() {return dataList;}}/** * 編寫導(dǎo)入工具類 */public class DynamicEasyExcelImportUtils {/*** 動態(tài)獲取全部列和數(shù)據(jù)體,默認從第一行開始解析數(shù)據(jù)* @param stream* @return*/public static List<Map<String,String>> parseExcelToView(byte[] stream) {return parseExcelToView(stream, 1);}/*** 動態(tài)獲取全部列和數(shù)據(jù)體* @param streamexcel文件流* @param parseRowNumber指定讀取行* @return*/public static List<Map<String,String>> parseExcelToView(byte[] stream, Integer parseRowNumber) {DynamicEasyExcelListener readListener = new DynamicEasyExcelListener();EasyExcelFactory.read(new ByteArrayInputStream(stream)).registerReadListener(readListener).headRowNumber(parseRowNumber).sheet(0).doRead();List<Map<Integer, String>> headList = readListener.getHeadList();if(CollectionUtils.isEmpty(headList)){throw new RuntimeException("Excel未包含表頭");}List<Map<Integer, String>> dataList = readListener.getDataList();if(CollectionUtils.isEmpty(dataList)){throw new RuntimeException("Excel未包含數(shù)據(jù)");}//獲取頭部,取最后一次解析的列頭數(shù)據(jù)Map<Integer, String> excelHeadIdxNameMap = headList.get(headList.size() -1);//封裝數(shù)據(jù)體List<Map<String,String>> excelDataList = Lists.newArrayList();for (Map<Integer, String> dataRow : dataList) {Map<String,String> rowData = https://www.jinnalai.com/fenxiang/new LinkedHashMap<>();excelHeadIdxNameMap.entrySet().forEach(columnHead -> {rowData.put(columnHead.getValue(), dataRow.get(columnHead.getKey()));});excelDataList.add(rowData);}return excelDataList;}/*** 文件導(dǎo)入測試* @param args* @throws IOException*/public static void main(String[] args) throws IOException {FileInputStream inputStream = new FileInputStream(new File("/Users/panzhi/Documents/easyexcel-export-user5.xlsx"));byte[] stream = IoUtils.toByteArray(inputStream);List<Map<String,String>> dataList = parseExcelToView(stream, 2);System.out.println(JSONArray.toJSONString(dataList));inputStream.close();}}為了方便后續(xù)的操作流程,在解析數(shù)據(jù)的時候,會將列名作為key!
四、總結(jié)本文主要以實際使用場景為例,對 easyexcel 的使用做了簡單的介紹,尤其是動態(tài)導(dǎo)出導(dǎo)出,基于業(yè)務(wù)的需要,做了一個公共的工具類,方便后續(xù)進行快速開發(fā),避免重復(fù)的勞動!
當然,easyexcel 的功能還不只上面介紹的那些內(nèi)容,還有基于模版進行excel的填充,web 端restful的導(dǎo)出導(dǎo)出,使用方法大致都差不多,具體可以參與官方的文檔,地址如下:https://www.yuque.com/easyexcel/doc/read#1bfaf593

推薦閱讀