亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java使用Apache poi 導入Excel文件

2019-11-14 09:13:34
字體:
來源:轉載
供稿:網友

java使用Apache poi 操作Excel-基本概念與使用中介紹了poi與excel相關的基本概念,接下來通過poi來導入excel。

本文將使用如下版本的 POI來完成導入數據的演示。

<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency>

1 讀取Excel并打印結果

由上篇文章可知Excel的基本結構,因此導入Excel就是要將Excel某個電子表單中的所有行讀入到程序中。

public static <T> List<T> importExcel(File excelFile) throws InvalidFormatException, IOException, InstantiationException, IllegalaccessException { XSSFWorkbook workBook = new XSSFWorkbook(excelFile); XSSFSheet sheet = workBook.getSheetAt(0); for(int ri = sheet.getFirstRowNum() + 1 ; ri <= sheet.getLastRowNum(); ri++) { Row row = sheet.getRow(ri); for(int ci = row.getFirstCellNum(); ci < row.getLastCellNum(); ci++) { Cell cell = row.getCell(ci); Object value = getCellValue(cell,fields[ci]); System.out.如上代碼是將excelFile讀入,然后讀取workBook.getSheetAt(0);表單,接著遍歷各個行,并獲取各個行的數據并輸出。

由于Excel單元格的數據由不同的類型組成,因此獲取數據時要判斷單元格類型,并調對應的方法獲取數據。

2 將讀取的數據存入Java對象中

接下來將1中讀取的數據保存在Java對象中。這里以Person對象為例。Person對象省略了Getter,Setter,及toString方法。

public class Person { private String name; private String sex; private Integer age; private Double height; }

使用的Excel數據如下所示。首行是標題列,首行之后是數據列。

姓名 性別 年齡 身高(M)洛克 男 18 1.83 羅琳 女 18 1.76

為了將Excel中讀取的數據存儲在Java對象中,將1中的方法簽名修改為,其中type是最終的類型,本文中為Person。

public static <T> List<T> importExcel(File excelFile,Class<T> type)

修改后的importExcel方法如下。

public static <T> List<T> importExcel(File excelFile,Class<T> type) throws InvalidFormatException, IOException, InstantiationException, IllegalAccessException { XSSFWorkbook workBook = new XSSFWorkbook(excelFile); List<T> result = new ArrayList<T>(); XSSFSheet sheet = workBook.getSheetAt(0); for(int ri = sheet.getFirstRowNum() + 1 ; ri <= sheet.getLastRowNum(); ri++) { Row row = sheet.getRow(ri); T object = type.newInstance(); Field[] fields = object.getClass().getDeclaredFields(); Field.setAccessible(fields, true); for(int ci = row.getFirstCellNum(); ci < row.getLastCellNum(); ci++) { Cell cell = row.getCell(ci); Object value = getCellValue(cell,fields[ci]); fields[ci].set(object, value); } result.add(object); Field.setAccessible(fields, false); } return result; }

上述代碼忽略Excel標題行,因此是從首行+1行開始進行遍歷。

代碼中首先根據type來創建一個實例。 T object = type.newInstance(); 注意事項:這里需要注意的是對象的各個成員的類型要與Excel各列所保持一致,這樣免去尋找對象成員與Excel列單元的對應關系的麻煩,并簡化示例。

創建完實例后,獲取對象中的各個字段,并修改訪問權限,以便隨后賦值。

Field[] fields = object.getClass().getDeclaredFields();Field.setAccessible(fields, true);

接著遍歷各個列,由于對象中字段的順序與Excel列順序保持一致,因此使用同樣的列索引即可獲取Excel列單元與對象成員。

Person成員的類型由String,int,double,而在Excel中單元格數值的類型統一被描述為Cell.CELL_TYPE_NUMERIC類型,因此在導入并轉換為Java對象就需要格外注意類型處理,以避免出錯。以本文中Excel中年齡為例,獲取后單元格數值使用的是cell.getNumericCellValue()方法,該方法返回類型為Double,而Java對象中使用的是Integer。此外使用中也可能將年齡寫成字符串。因此需要對每種數據類型判斷并合理轉換,或給出相應錯誤提示。

通過定義接口TypeHandler 來處理各種類型轉換的問題。

public interface TypeHandler { public Object handle(Cell cell,Field field);}

以Integer類型為例,接著定義Integer處理器。

public class IntegerHandler implements TypeHandler{ @Override public Object handle(Cell cell, Field field) { int type = cell.getCellType(); if(type == Cell.CELL_TYPE_NUMERIC) { return (int)cell.getNumericCellValue(); } else if(type == Cell.CELL_TYPE_STRING) { try { return Integer.valueOf(cell.getStringCellValue()); }catch(NumberFormatException e) { return null; } } else { return null; } }}

當單元格類型返回double(Cell.CELL_TYPE_NUMERIC),則執行類型轉換。如果是字符串類型,則嘗試轉換為整型。如果無法轉換則返回null。對于無法轉換的類型直接返回null。

其它類型如String,Double以處理方法與此一致。

最后修改getCellValue,代碼如下。

private final static Map<Class<?>,TypeHandler> typeHandlerMap = new HashMap<>(); static { typeHandlerMap.put(Integer.class, new IntegerHandler()); typeHandlerMap.put(Double.class, new DoubleHandler()); typeHandlerMap.put(String.class, new StringHandler()); } private static Object getCellValue(Cell cell,Field field) { TypeHandler handler = typeHandlerMap.get(field.getType()); if(handler == null) { return null; } return handler.handle(cell, field); }

3 使用注解添加輔助功能

1,2中講述了基本的導入功能實現。而對字段排序,驗證等還可以結合自定義注解來完成,也就是在獲取對象Field時,拿到注解并獲取相關參數,最后完成校驗排序等功能。

4 完整代碼

private final static Map<Class<?>,TypeHandler> typeHandlerMap = new HashMap<>(); static { typeHandlerMap.put(Integer.class, new IntegerHandler()); typeHandlerMap.put(Double.class, new DoubleHandler()); typeHandlerMap.put(String.class, new StringHandler()); } public static <T> List<T> importExcel(File excelFile,Class<T> type) throws InvalidFormatException, IOException, InstantiationException, IllegalAccessException { XSSFWorkbook workBook = new XSSFWorkbook(excelFile); List<T> result = new ArrayList<T>(); XSSFSheet sheet = workBook.getSheetAt(0); for(int ri = sheet.getFirstRowNum() + 1 ; ri <= sheet.getLastRowNum(); ri++) { Row row = sheet.getRow(ri); T object = type.newInstance(); Field[] fields = object.getClass().getDeclaredFields(); Field.setAccessible(fields, true); for(int ci = row.getFirstCellNum(); ci < row.getLastCellNum(); ci++) { Cell cell = row.getCell(ci); Object value = getCellValue(cell,fields[ci]); fields[ci].set(object, value); } result.add(object); Field.setAccessible(fields, false); } return result; } private static Object getCellValue(Cell cell,Field field) { TypeHandler handler = typeHandlerMap.get(field.getType()); if(handler == null) { return null; } return handler.handle(cell, field); }public interface TypeHandler { public Object handle(Cell cell,Field field);}public class IntegerHandler implements TypeHandler{ @Override public Object handle(Cell cell, Field field) { int type = cell.getCellType(); if(type == Cell.CELL_TYPE_NUMERIC) { return (int)cell.getNumericCellValue(); } else if(type == Cell.CELL_TYPE_STRING) { try { return Integer.valueOf(cell.getStringCellValue()); }catch(NumberFormatException e) { return null; } } else { return null; } }}public class DoubleHandler implements TypeHandler{ @Override public Object handle(Cell cell, Field field) { int type = cell.getCellType(); if(type == Cell.CELL_TYPE_NUMERIC) { return cell.getNumericCellValue(); } else if(type == Cell.CELL_TYPE_STRING) { try { return Double.valueOf(cell.getNumericCellValue()); }catch(NumberFormatException e) { return null; } } else { return null; } }}public class StringHandler implements TypeHandler{ @Override public Object handle(Cell cell, Field field) { int type = cell.getCellType(); if(type != Cell.CELL_TYPE_STRING) { return ""; } else { return cell.getStringCellValue(); } }}

使用時要根據實際情況調整或新增handler即可。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线欧美在线| 国产拍精品一二三| 欧美亚洲第一页| 色哟哟网站入口亚洲精品| 欧美性理论片在线观看片免费| 亚洲黄色片网站| 亚洲欧美日韩在线一区| 欧美最猛性xxxxx(亚洲精品)| 精品国产1区2区| 欧美成人免费全部| 日本不卡免费高清视频| 日韩中文在线中文网三级| 精品视频在线播放| 欧美日韩在线影院| 亚洲xxx自由成熟| 欧亚精品中文字幕| 日韩精品视频免费专区在线播放| 亚洲伊人第一页| 91精品国产成人| 国产精品视频999| 久久久综合av| 亚洲综合色激情五月| 欧美亚洲国产视频| 91国偷自产一区二区三区的观看方式| 国内精品久久久久久久| 2019亚洲日韩新视频| 久久69精品久久久久久久电影好| 国产精品678| 亚洲一二在线观看| 2019最新中文字幕| 国产精品永久免费视频| 成人97在线观看视频| 国产精品黄色av| 久久久久久久久中文字幕| 欧美性xxxx极品hd满灌| 国产日韩在线免费| 中文字幕久热精品视频在线| 国产精品日韩在线播放| 亚洲第一精品夜夜躁人人爽| 亚洲免费福利视频| 亚洲国产天堂久久综合网| 91久久久国产精品| 日韩久久午夜影院| 国产精品黄页免费高清在线观看| 欧美精品福利视频| 亚洲精品v天堂中文字幕| 精品动漫一区二区| 日韩在线一区二区三区免费视频| 精品一区二区三区四区| 亚洲欧美制服丝袜| 97av在线影院| 久久久久久久久久亚洲| 亚洲精品xxx| 亚洲最大福利网| 91在线精品视频| 午夜精品福利在线观看| 亚洲成人在线视频播放| 在线观看日韩视频| 欧美成aaa人片免费看| 日韩女优人人人人射在线视频| 亚洲欧美日韩图片| 色综合久综合久久综合久鬼88| 国产69精品久久久久9999| 久久国产精品视频| 成人黄色免费片| 亚洲国产精品嫩草影院久久| 亚洲精品美女免费| 国产精品中文字幕在线观看| 久久天堂av综合合色| 久久视频免费在线播放| 91精品国产高清久久久久久久久| 色综合久久精品亚洲国产| 国精产品一区一区三区有限在线| www.久久撸.com| 国产精品69久久| 精品成人乱色一区二区| 日韩hd视频在线观看| 久久久久久亚洲| 92版电视剧仙鹤神针在线观看| 激情久久av一区av二区av三区| 国产成人一区二区三区| 欧美日韩国产综合视频在线观看中文| 国产成人久久久精品一区| 久久精品99久久香蕉国产色戒| 欧美专区在线观看| 一区二区三区高清国产| 欧美日韩国产综合新一区| 日韩中文字幕在线观看| 色偷偷888欧美精品久久久| 欧美极品少妇与黑人| 日韩女在线观看| 日韩小视频在线观看| 国产精品9999| 国产精品96久久久久久又黄又硬| 日本久久久久久久久久久| 日韩电影视频免费| 欧美久久精品午夜青青大伊人| 国产美女搞久久| 国产99视频精品免视看7| 97超碰色婷婷| 欧美在线视频免费| 亚洲国产黄色片| 在线视频欧美日韩精品| 91精品国产综合久久香蕉的用户体验| 欧美怡红院视频一区二区三区| 欧美在线xxx| 国产精品第2页| 裸体女人亚洲精品一区| 在线电影欧美日韩一区二区私密| 精品视频在线播放色网色视频| 国产综合久久久久| 深夜成人在线观看| 一本色道久久88精品综合| 亚洲精品第一页| 91九色在线视频| 日韩av综合中文字幕| 精品视频www| 国内精品小视频在线观看| 欧美一级大片视频| 日韩女优人人人人射在线视频| 欧美一级成年大片在线观看| 欧美性开放视频| 91夜夜揉人人捏人人添红杏| 久久影视免费观看| 欧美精品999| 欧美精品生活片| 久久成人精品视频| 国产一区二区三区视频免费| 日韩精品福利网站| 日韩高清电影免费观看完整版| 亚洲黄色片网站| 欧美乱人伦中文字幕在线| 九九热精品视频在线播放| 日韩高清中文字幕| 日韩中文字幕免费| 久久亚洲欧美日韩精品专区| 亚洲成人a**站| 亚洲综合中文字幕在线观看| 成人精品福利视频| 国产亚洲欧美另类中文| 久久成人这里只有精品| 亚洲电影在线观看| 亚洲美女免费精品视频在线观看| 在线亚洲国产精品网| 色噜噜狠狠色综合网图区| 欧日韩在线观看| 久久精品99久久香蕉国产色戒| 97国产精品视频| 中文字幕亚洲欧美一区二区三区| 欧美成人精品一区二区三区| 国产精品麻豆va在线播放| 日韩经典中文字幕在线观看| 国产精品最新在线观看| 亚洲精品久久久久久久久久久久| 国产精品一区二区三区毛片淫片| 成人动漫网站在线观看| 日韩精品久久久久| 久久久久久久久亚洲| 日韩精品视频在线观看免费| 久久久亚洲天堂| 日本精品久久久久久久| 欧美在线播放视频| 欧美性xxxx极品高清hd直播| 中文字幕亚洲一区二区三区五十路|