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

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

SpringBoot實現Excel讀取的實例教程

瀏覽:195日期: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一区二区在线观看| 国产精品一国产精品| 久久国产精品毛片| 欧美在线看片| 精品亚洲美女网站| 伊人精品视频| 欧美一区激情| 免费高潮视频95在线观看网站| 国产精品日韩久久久| 国产精品中文字幕亚洲欧美| 伊人久久高清| 亚洲精品在线二区| 97精品国产| 亚洲少妇自拍| 精品入口麻豆88视频| 性色一区二区| 成人在线丰满少妇av| 中文无码久久精品| 激情综合五月| 亚洲午夜久久| 国产suv精品一区二区四区视频| 狠狠爱www人成狠狠爱综合网| 国产日产精品_国产精品毛片| 神马午夜久久| 久久狠狠久久| 欧美日韩精品一本二本三本 | 99国产精品视频免费观看一公开| 欧美日韩xxxx| 欧美精品一区二区久久| 欧美亚洲一级| 久久久9色精品国产一区二区三区| 亚洲理论在线| 日本欧美国产| 日本v片在线高清不卡在线观看| 亚洲精品福利电影| 91久久精品无嫩草影院| 国产在线不卡| 欧美激情 亚洲a∨综合| 久久都是精品| 久久久久国产一区二区| 国产剧情一区| 免费日韩精品中文字幕视频在线| 国产理论在线| 国产亚洲一区| 蜜臀久久99精品久久久久宅男| 中文字幕人成乱码在线观看| 欧美日本一区| 美日韩精品视频| 国产中文在线播放| 国产精品红桃| 亚洲青青久久| 亚洲激情社区| 亚洲最新无码中文字幕久久| 欧美中文一区| 老色鬼久久亚洲一区二区| 久久精品国内一区二区三区水蜜桃| 欧美日韩中出| 中文字幕一区二区三区日韩精品 | 香蕉久久久久久| 黄色成人精品网站| 激情久久99| 国产午夜久久av| 亚洲精品成人一区| 快she精品国产999| 欧美日韩国产一区二区三区不卡| 日韩av二区| 国产日韩免费| 欧美亚洲一区二区三区| 亚洲综合五月| 蜜臀精品一区二区三区在线观看| 黄色亚洲在线| 91成人精品视频| 久久久成人网| 亚洲精品一区三区三区在线观看| 国产自产自拍视频在线观看| 麻豆成人91精品二区三区| 国产日韩欧美| 国产精品视频3p| 国产精品综合| 国产视频一区二| 日韩高清在线一区| 日韩在线视频一区二区三区| 中文字幕乱码亚洲无线精品一区| 视频在线观看一区| 99国产精品自拍| 91久久亚洲| 黄色av日韩| 香蕉成人久久| 亚洲精品看片| 久久国产麻豆精品| 麻豆传媒一区二区三区| 国产精品亚洲一区二区在线观看| 国产亚洲第一伦理第一区| 国产精品蜜月aⅴ在线| 国产精品亚洲综合久久| 国产精品igao视频网网址不卡日韩| 国产精品白丝av嫩草影院| 国产精品最新| 国产一区二区三区天码| 婷婷综合六月| 夜夜精品视频| 日本不卡高清| 久久免费精品| 久久久久亚洲| 国产精品毛片在线看| 中文字幕日韩亚洲| 日韩精品高清不卡| 国产精品久久久久久久免费软件| 精品久久中文| 久久精品不卡| 亚洲日本国产| 国产精品成人一区二区网站软件| 国语对白精品一区二区| 精品国产免费人成网站| 99精品小视频| 石原莉奈在线亚洲二区| 日韩成人av影视| 久久一区国产| 欧美亚洲国产一区| 日韩中文欧美在线| 91成人福利| 国产成人黄色| 黄色亚洲免费| 国产日韩欧美三区| 日韩欧美中文| 中文字幕成人| 麻豆成人在线观看| 视频福利一区| 亚洲天堂av资源在线观看| 国产视频一区二| 九九精品调教| 亚洲三级网站| 精品久久电影| 亚洲制服少妇| 麻豆精品久久| 国产一区日韩欧美| 亚洲日产国产精品| 精品国产不卡一区二区| 久久香蕉国产| 日韩激情啪啪| 日韩理论片av| 日本亚洲不卡| 97在线精品| 丝袜亚洲精品中文字幕一区| 国产精品v一区二区三区| 亚洲二区免费| 国产日韩欧美中文在线| 99久久久久国产精品| 日韩精品一区二区三区免费视频| 91一区二区三区四区| 一区二区日韩免费看| 美日韩一区二区三区| 亚洲精品小说| 麻豆极品一区二区三区| 亚洲激情黄色| 精品亚洲精品| 亚洲免费福利一区| 肉色欧美久久久久久久免费看| 美国三级日本三级久久99 | 风间由美中文字幕在线看视频国产欧美| 欧美日韩日本国产亚洲在线| 欧美成人精品一级| 免费成人在线观看| 91亚洲国产高清| 日韩精品第二页| 久久中文字幕av| 国产精品日韩精品中文字幕| 亚洲一区免费| 欧美片第1页| 久久精品超碰| 视频一区国产视频| 日韩一区二区三区在线免费观看| 日本精品另类| 最新日韩av| 伊人久久在线| 国产精品色在线网站| 性一交一乱一区二区洋洋av| 综合日韩av| 国产欧美日韩影院| 91九色精品| 日韩电影在线视频| 国产精品白浆| 奇米亚洲欧美| 综合精品一区| 在线亚洲自拍| 久久久久免费av| 福利一区二区免费视频| 国产日韩一区二区三区在线| 日本 国产 欧美色综合| 久久亚洲精品中文字幕蜜潮电影| 韩国一区二区三区视频| 国产探花一区在线观看| 日韩在线卡一卡二| 日本美女一区| 久久av中文| 欧美日韩伊人| 综合国产视频| 久久大逼视频| 中文一区二区| 亚洲激情久久|