日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot實現Excel讀取的實例教程

瀏覽:191日期:2022-06-16 14:09:20
前言

這是本人寫的一個SpringBoot對Excel讀取的方法,實測能用,待提升的地方有很多,有不足之處請多多指點。

Excel2003版(后綴為.xls)最大行數是65536行,最大列數是256列。

Excel2007以上的版本(后綴為.xlsx)最大行數是1048576行,最大列數是16384列。

提供2種方法讀取:

1.根據指定的開始和結束行數讀取返回結果,結果格式為List<Map<String, Object>>

2.根據指定的開始和結束行數讀取返回結果,結果格式為List<POJO(傳入的實體類)>

請根據實際內存堆可用大小進行讀取,太多可進行分段讀取(類似分頁的原理)

讀取Excel所需要的幾個類

SpringBoot實現Excel讀取的實例教程

1.在pom.xml加上依賴

</dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version> </dependency></dependencies>2.ExcelPOJO實體類

package com.cly.utils.Excel;/** * @author : CLy * @ClassName : ExcelPOJO * @date : 2020/7/9 17:13 * 實體類所有成員變量都需要有GET,SET方法 * 所有成員變量都要加上注解@excelRescoure(value = '?'),?為Excel真實列名,必須一一對應 * @excelRescoure(value = '?'),?可為空,需要用到才賦值 * 成員變量目前只允許String,Double,Interge,Float **/public class ExcelPOJO { public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPasswork() { return passwork; } public void setPasswork(String passwork) { this.passwork = passwork; } public String getLook() { return look; } public void setLook(String look) { this.look = look; } @excelRescoure(value = 'XM') private String name; @excelRescoure(value = 'SFZH') private String passwork; @excelRescoure() private String look; @Override public String toString(){ return 'name:'+this.getName()+',passwork:'+this.getPasswork()+',look:'+this.getLook(); } public ExcelPOJO() {}}3.@interface自定義注解(用于實體類讀取)

package com.cly.utils.Excel;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * @author : CLy * @ClassName : myRescoure * @date : 2020/7/10 9:31 **/@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface excelRescoure { String value() default '';//默認為空}4.excelRead類(讀取Excel數據類)有很多冗余的代碼,可抽離出來

package com.cly.utils.Excel;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import com.sun.org.apache.bcel.internal.generic.NEW;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.formula.functions.T;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.xml.transform.Source;import java.beans.IntrospectionException;import java.beans.PropertyDescriptor;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.lang.reflect.*;import java.text.DecimalFormat;import java.util.*;/** * @author : CLy * @ClassName : excelRead * @date : 2020/7/9 11:08 **/public class excelRead { //日志輸出 private static Logger logger = LoggerFactory.getLogger(excelRead.class); //定義excel類型 private static final String XLS = 'xls'; private static final String XLSX = 'xlsx'; /** * 根據文件后綴名類型獲取對應的工作簿對象 * @param inputStream 讀取文件的輸入流 * @param fileType 文件后綴名類型(xls或xlsx) * @return 包含文件數據的工作簿對象 */ private static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException { //用自帶的方法新建工作薄 Workbook workbook = WorkbookFactory.create(inputStream); //后綴判斷有版本轉換問題 //Workbook workbook = null; //if (fileType.equalsIgnoreCase(XLS)) { // workbook = new HSSFWorkbook(inputStream); //} else if (fileType.equalsIgnoreCase(XLSX)) { // workbook = new XSSFWorkbook(inputStream); //} return workbook; } /** * 將單元格內容轉換為字符串 * @param cell * @return */ private static String convertCellValueToString(Cell cell) { if (cell == null) { return null; } String returnValue = null; switch (cell.getCellType()) { case NUMERIC: //數字 Double doubleValue = cell.getNumericCellValue(); // 格式化科學計數法,取一位整數,如取小數,值如0.0,取小數點后幾位就寫幾個0 DecimalFormat df = new DecimalFormat('0'); returnValue = df.format(doubleValue); break; case STRING: //字符串 returnValue = cell.getStringCellValue(); break; case BOOLEAN: //布爾 Boolean booleanValue = cell.getBooleanCellValue(); returnValue = booleanValue.toString(); break; case BLANK: // 空值 break; case FORMULA: // 公式 returnValue = cell.getCellFormula(); break; case ERROR: // 故障 break; default: break; } return returnValue; } /** * 處理Excel內容轉為List<Map<String,Object>>輸出 * workbook:已連接的工作薄 * StatrRow:讀取的開始行數(默認填0,0開始,傳過來是EXcel的行數值默認從1開始,這里已處理減1) * EndRow:讀取的結束行數(填-1為全部) * ExistTop:是否存在頭部(如存在則讀取數據時會把頭部拼接到對應數據,若無則為當前列數) */ private static List<Map<String, Object>> HandleData(Workbook workbook, int StatrRow, int EndRow, boolean ExistTop) { //聲明返回結果集result List<Map<String, Object>> result = new ArrayList<>(); //聲明一個Excel頭部函數 ArrayList<String> top = new ArrayList<>(); //解析sheet(sheet是Excel腳頁) /** *此處會讀取所有腳頁的行數據,若只想讀取指定頁,不要for循環,直接給sheetNum賦值,腳頁從0開始(通常情況Excel都只有一頁,所以此處未進行進一步處理) */ for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) { Sheet sheet = workbook.getSheetAt(sheetNum); // 校驗sheet是否合法 if (sheet == null) { continue; } //如存在頭部,處理頭部數據 if (ExistTop) { int firstRowNum = sheet.getFirstRowNum(); Row firstRow = sheet.getRow(firstRowNum); if (null == firstRow) { logger.warn('解析Excel失敗,在第一行沒有讀取到任何數據!'); } for (int i = 0; i < firstRow.getLastCellNum(); i++) { top.add(convertCellValueToString(firstRow.getCell(i))); } } //處理Excel數據內容 int endRowNum; //獲取結束行數 if (EndRow == -1) { endRowNum = sheet.getPhysicalNumberOfRows(); } else { endRowNum = EndRow <= sheet.getPhysicalNumberOfRows() ? EndRow : sheet.getPhysicalNumberOfRows(); } //遍歷行數 for (int i = StatrRow - 1; i < endRowNum; i++) { Row row = sheet.getRow(i); if (null == row) { continue; } Map<String, Object> map = new HashMap<>(); //獲取所有列數據 for (int y = 0; y < row.getLastCellNum(); y++) { if (top.size() > 0) { if (top.size() >= y) { map.put(top.get(y), convertCellValueToString(row.getCell(y))); } else { map.put(String.valueOf(y + 1), convertCellValueToString(row.getCell(y))); } } else { map.put(String.valueOf(y + 1), convertCellValueToString(row.getCell(y))); } } result.add(map); } } return result; } /** * 方法一 * 根據行數和列數讀取Excel * fileName:Excel文件路徑 * StatrRow:讀取的開始行數(默認填0) * EndRow:讀取的結束行數(填-1為全部) * ExistTop:是否存在頭部(如存在則讀取數據時會把頭部拼接到對應數據,若無則為當前列數) * 返回一個List<Map<String,Object>> */ public static List<Map<String, Object>> ReadExcelByRC(String fileName, int StatrRow, int EndRow, boolean ExistTop) { //判斷輸入的開始值是否少于等于結束值 if (StatrRow > EndRow && EndRow != -1) { logger.warn('輸入的開始行值比結束行值大,請重新輸入正確的行數'); List<Map<String, Object>> error = null; return error; } //聲明返回的結果集 List<Map<String, Object>> result = new ArrayList<>(); //聲明一個工作薄 Workbook workbook = null; //聲明一個文件輸入流 FileInputStream inputStream = null; try { // 獲取Excel后綴名,判斷文件類型 String fileType = fileName.substring(fileName.lastIndexOf('.') + 1); // 獲取Excel文件 File excelFile = new File(fileName); if (!excelFile.exists()) { logger.warn('指定的Excel文件不存在!'); return null; } // 獲取Excel工作簿 inputStream = new FileInputStream(excelFile); workbook = getWorkbook(inputStream, fileType); //處理Excel內容 result = HandleData(workbook, StatrRow, EndRow, ExistTop); } catch (Exception e) { logger.warn('解析Excel失敗,文件名:' + fileName + ' 錯誤信息:' + e.getMessage()); } finally { try { if (null != workbook) { workbook.close(); } if (null != inputStream) { inputStream.close(); } } catch (Exception e) { logger.warn('關閉數據流出錯!錯誤信息:' + e.getMessage()); return null; } } return result; }/**==============================================================================================================================**/ /** * 方法二 * 根據給定的實體類中賦值的注解值讀取Excel * fileName:Excel文件路徑 * StatrRow:讀取的開始行數(默認填0) * EndRow:讀取的結束行數(填-1為全部) * Class<T>:傳過來的實體類類型 * 返回一個List<T>:T為實體類 */ public static List<Object> ReadExcelByPOJO(String fileName, int StatrRow, int EndRow, Class t) throws InvocationTargetException, IntrospectionException, InstantiationException, IllegalAccessException, NoSuchFieldException { //判斷輸入的開始值是否少于等于結束值 if (StatrRow > EndRow && EndRow != -1) { logger.warn('輸入的開始行值比結束行值大,請重新輸入正確的行數'); List<Object> error = null; return error; } //聲明返回的結果集 List<Object> result = new ArrayList<>(); //聲明一個工作薄 Workbook workbook = null; //聲明一個文件輸入流 FileInputStream inputStream = null; try { // 獲取Excel后綴名,判斷文件類型 String fileType = fileName.substring(fileName.lastIndexOf('.') + 1); // 獲取Excel文件 File excelFile = new File(fileName); if (!excelFile.exists()) { logger.warn('指定的Excel文件不存在!'); return null; } // 獲取Excel工作簿 inputStream = new FileInputStream(excelFile); workbook = getWorkbook(inputStream, fileType); //處理Excel內容 result = HandleDataPOJO(workbook, StatrRow, EndRow, t); } catch (Exception e) { logger.warn('解析Excel失敗,文件名:' + fileName + ' 錯誤信息:' + e.getMessage()); } finally { try { if (null != workbook) { workbook.close(); } if (null != inputStream) { inputStream.close(); } } catch (Exception e) { logger.warn('關閉數據流出錯!錯誤信息:' + e.getMessage()); return null; } } return result; } /** * 處理Excel內容轉為List<T>輸出 * workbook:已連接的工作薄 * StatrRow:讀取的開始行數(默認填0,0開始,傳過來是EXcel的行數值默認從1開始,這里已處理減1) * EndRow:讀取的結束行數(填-1為全部) * Class<T>:所映射的實體類 */ private static <t> List<Object> HandleDataPOJO(Workbook workbook, int StatrRow, int EndRow, Class<?> t) throws IntrospectionException, NoSuchFieldException, IllegalAccessException, InstantiationException, InvocationTargetException, ClassNotFoundException { //聲明返回的結果集 List<Object> result = new ArrayList<Object>(); //解析sheet(sheet是Excel腳頁) for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) { Sheet sheet = workbook.getSheetAt(sheetNum); // 校驗sheet是否合法 if (sheet == null) { continue; } //獲取頭部數據 //聲明頭部數據數列對象 ArrayList<String> top = new ArrayList<>(); //獲取Excel第一行數據 int firstRowNum = sheet.getFirstRowNum(); Row firstRow = sheet.getRow(firstRowNum); if (null == firstRow) { logger.warn('解析Excel失敗,在第一行沒有讀取到任何數據!'); return null; } for (int i = 0; i < firstRow.getLastCellNum(); i++) { top.add(convertCellValueToString(firstRow.getCell(i))); } //獲取實體類的成原變量 Map<String, Object> POJOfields = getPOJOFieldAndValue(t); //判斷所需要的數據列 Map<String, Object> exceltoPOJO = new HashMap<>(); for (int i = 0; i < top.size(); i++) { if (POJOfields.get(top.get(i)) != null && !''.equals(POJOfields.get(top.get(i)))) { exceltoPOJO.put(String.valueOf(i), POJOfields.get(top.get(i))); } } /*處理Excel數據內容*/ int endRowNum; //獲取結束行數 if (EndRow == -1) { endRowNum = sheet.getPhysicalNumberOfRows(); } else { endRowNum = EndRow <= sheet.getPhysicalNumberOfRows() ? EndRow : sheet.getPhysicalNumberOfRows(); } List<Map<String, Object>> mapList = new ArrayList<>(); //遍歷行數 for (int i = StatrRow - 1; i < endRowNum; i++) { Row row = sheet.getRow(i); if (null == row) { continue; } //獲取需要的列數據 t texcel = (t) t.newInstance(); for (Map.Entry<String, Object> map : exceltoPOJO.entrySet()) { //獲取Exceld對應列的數據 String celldata = convertCellValueToString(row.getCell(Integer.parseInt(map.getKey()))); //使用發射 //獲取實體類T中指定成員變量的對象 PropertyDescriptor pd = new PropertyDescriptor((String) map.getValue(), texcel.getClass()); //獲取成員變量的set方法 Method method = pd.getWriteMethod(); //判斷成員變量的類型 Field field = texcel.getClass().getDeclaredField((String) map.getValue()); String object = field.getGenericType().getTypeName(); if (object.endsWith('String')) { //執行set方法 method.invoke(texcel, celldata); } if (object.endsWith('Double')) { Double middata = Double.valueOf(celldata); //執行set方法 method.invoke(texcel, middata); } if (object.endsWith('Float')) { Float middata = Float.valueOf(celldata); //執行set方法 method.invoke(texcel, middata); } if (object.endsWith('Integer')) { Integer middata = Integer.parseInt(celldata); //執行set方法 method.invoke(texcel, middata); } } result.add(texcel); } } return result; } /** * 獲取對應的實體類成員 * */ private static Map<String, Object> getPOJOFieldAndValue(Class T) { //聲明返回結果集 Map<String, Object> result = new HashMap<>(); Field[] fields = T.getDeclaredFields();//獲取屬性名 if (fields != null) { for (Field field : fields) { excelRescoure Rescoure = field.getAnnotation(excelRescoure.class); if (Rescoure.value() != null && !''.equals(Rescoure.value())) { result.put(Rescoure.value(), field.getName()); } } } else { logger.warn('實體類:' + T + '不存在成員變量'); return null; } return result; }}5.測試類

package com.cly.utils.Excel;import java.util.*;/** * @author : CLy * @ClassName : Readtest * @date : 2020/7/9 16:31 **/public class Readtest {public static void main(String[] args) throws Exception { /** 方法一 * fileName:Excel文件路徑 * StatrRow:讀取的開始行數(默認填0) * EndRow:讀取的結束行數(填-1為全部) * ExistTop:是否存在頭部(如存在則讀取數據時會把頭部拼接到對應數據作為KEY,若無則KEY為當前列數) */ List<Map<String,Object>> result =excelRead.ReadExcelByRC('D:.xls',2,10,false); System.out.println(result.size()); System.out.println(result); /** * 方法二 * ReadExcelByPOJO(String fileName, int StatrRow, int EndRow, Class t) * fileName:Excel文件路徑 * StatrRow:讀取的開始行數(默認填0) * EndRow:讀取的結束行數(填-1為全部) * Class<T>:傳過來的實體類類型 */ List<Object> result2 = excelRead.ReadExcelByPOJO('D:.xls',2,10,ExcelPOJO.class); System.out.println(result2.size()); System.out.println(result2); }} 6.運行結果和說明

exce表格數據

SpringBoot實現Excel讀取的實例教程

方法一的運行結果

1.ture:key為列名

SpringBoot實現Excel讀取的實例教程

2.false:key為第幾列列數

SpringBoot實現Excel讀取的實例教程

方法二的運行結果

實體類的所有成員變量一定要加上自定義注釋@excelRescoure,不然會報錯

SpringBoot實現Excel讀取的實例教程SpringBoot實現Excel讀取的實例教程

還有很多不足的地方,請多多指點,希望能給你帶來幫助。

SpringBoot實現內存數據導出成Excel在另一篇文章 文章地址:https://www.jb51.net/article/202767.htm

總結

到此這篇關于SpringBoot實現Excel讀取的文章就介紹到這了,更多相關SpringBoot實現Excel讀取內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: excel
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品黄网站| 国产精品一区二区三区av麻| 国产精品久久久一区二区| 成人在线免费观看网站| 男人操女人的视频在线观看欧美| 日本久久二区| 免费在线观看一区二区三区| 精品国产乱码久久久久久樱花| 999在线观看精品免费不卡网站| 日本欧美大码aⅴ在线播放| 久久久噜噜噜| 欧美黄色精品| 亚洲精品系列| 中文字幕一区二区三区日韩精品| 久久精品91| 国产99久久| 亚洲精品99| 久久久久网站| 欧美在线亚洲综合一区| 亚洲第一区色| 久久婷婷激情| 亚洲精品97| 日韩国产欧美一区二区三区| 精品久久久中文字幕| 亚洲人成网77777色在线播放| 国模大尺度视频一区二区| 日韩不卡一二三区| 男女性色大片免费观看一区二区| 夜久久久久久| 亚洲在线观看| 丝袜亚洲另类欧美| 免费成人av在线播放| 久久中文字幕av| 色天使综合视频| 欧美肉体xxxx裸体137大胆| 日韩毛片视频| 91精品成人| 最新国产精品久久久| 亚久久调教视频| 国产精品丝袜在线播放| 国产精品亚洲综合色区韩国| 欧美aⅴ一区二区三区视频| 精品亚洲成人| 激情综合网址| 日韩精品国产精品| 麻豆精品久久久| 久久精品欧美一区| 狠狠干成人综合网| 欧美日韩激情| 日韩激情av在线| 日本美女一区| 日韩免费精品| 日韩网站中文字幕| 91精品国产自产观看在线| 精品久久福利| 在线免费观看亚洲| 成人国产精品久久| 日韩一区二区三区精品| 人人香蕉久久| 国产亚洲一卡2卡3卡4卡新区| 成人看片网站| 欧美激情精品| 日产欧产美韩系列久久99| 美女免费视频一区| 视频一区在线播放| 99久久精品网| 久久99精品久久久野外观看| 久久国产精品99国产| 97精品国产福利一区二区三区| 香蕉久久国产| 亚洲网站视频| 亚洲播播91| 美女精品视频在线| 7m精品国产导航在线| 久久国产精品久久w女人spa| 欧洲在线一区| 国产一区二区三区不卡av| 日韩精品亚洲一区二区三区免费| 日韩伦理在线一区| 欧美aⅴ一区二区三区视频| 亚洲精品欧美| 免费在线视频一区| 亚洲综合不卡| 免费人成精品欧美精品| 视频一区二区三区入口| 国产99亚洲| 神马日本精品| 在线观看免费一区二区| 亚洲黑丝一区二区| 久久久久美女| 欧美1区2区3区| 喷白浆一区二区| 日韩在线成人| 日韩精品一区二区三区免费视频| 日韩不卡在线观看日韩不卡视频| 青草av.久久免费一区| 国产欧美亚洲一区| 久久亚洲黄色| 久久亚洲精品中文字幕蜜潮电影| 激情欧美丁香| 欧美日韩va| 国产一区国产二区国产三区| 97se综合| 中文字幕免费精品| 国产美女久久| 久久五月天小说| 日韩中文字幕| 国产在线一区不卡| 亚洲成av在线| 日韩国产在线观看| 91精品国产成人观看| 亚洲欧美日韩在线观看a三区| 欧美伊人影院| 中文字幕高清在线播放| av亚洲免费| 欧美经典一区| 亚洲一区二区av| 成人在线视频中文字幕| 六月天综合网| 久久青草久久| 精品黄色一级片| 亚洲精品女人| 亚洲午夜一级| 老司机精品视频在线播放| 国产一区二区中文| 开心激情综合| 丝袜诱惑制服诱惑色一区在线观看| 国产福利电影在线播放| 日韩制服丝袜av| av中文字幕在线观看第一页| 国产亚洲欧美日韩精品一区二区三区| 动漫av一区| 国产调教一区二区三区| 日韩在线卡一卡二| 99成人超碰| 国产精品久久久一区二区| 亚洲综合中文| 亚洲91久久| 国产精品久久久一区二区| 丝袜美腿亚洲一区二区图片| 久久中文欧美| 国产精品一区二区三区av| 日韩精品久久久久久| 国产一区成人| 国产主播一区| 久久激情一区| 亚洲一级网站| 9久re热视频在线精品| 午夜国产精品视频免费体验区| 国产乱码午夜在线视频| 超碰成人av| 久久久精品久久久久久96| 日韩欧美一区二区三区在线视频| 欧美日本不卡| 日韩欧美中文在线观看| 三级一区在线视频先锋| 亚洲永久字幕| 亚洲欧美日韩精品一区二区 | 国产拍在线视频| 天堂а√在线最新版中文在线| 久久精品资源| 高清av一区| 日韩大片免费观看| 欧美精品一二| 欧美91视频| 国产精品试看| 久久久久久美女精品| 中文在线资源| 久久久久久久久久久9不雅视频| 久久激情一区| 视频在线观看国产精品| 国产精品一区二区三区av麻| 国产一区二区三区四区二区| 日韩精品欧美| 国产欧美日韩| 91精品福利| 卡一卡二国产精品| 999国产精品999久久久久久| 亚洲精品123区| 欧美久久香蕉| 亚洲精品88| 欧美一区二区三区久久精品| 久久久久久婷| 日韩综合小视频| 丝袜诱惑一区二区| 日韩精品视频网| 亚洲国产影院| 国产一区福利| 91嫩草精品| 亚洲成人精品| 国产精品任我爽爆在线播放| 尤物网精品视频| 精品一区91| 国产精品一区二区精品视频观看| 欧美一区二区性| 国产va免费精品观看精品视频| 亚洲免费观看高清完整版在线观| 91精品亚洲| 丝袜美腿一区| 美女毛片一区二区三区四区最新中文字幕亚洲 |