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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

瀏覽:144日期:2022-05-22 08:31:31
引入依賴

maven

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

Gradle

implementation group: ’org.apache.poi’, name: ’poi’, version: ’3.17’代碼展示

1、自定義注解類(lèi)

@Retention(value = RetentionPolicy.RUNTIME)@Target(value = ElementType.FIELD)public @interface Excel { String name();//列的名字 int width() default 6000;//列的寬度 int index() default -1;//決定生成的順序 boolean isMust() default true; // 是否為必須值,默認(rèn)是必須的}

2、Java的Excel對(duì)象,只展現(xiàn)了field,get與set方法就忽略了

public class GoodsExcelModel { @Excel(name = 'ID_禁止改動(dòng)', index = 0, width = 0) private Long picId;//picId @Excel(name = '產(chǎn)品ID_禁止改動(dòng)', index = 1, width = 0) private Long productId; @Excel(name = '型號(hào)', index = 3) private String productName;//產(chǎn)品型號(hào) @Excel(name = '系列', index = 2) private String seriesName;//系列名字 @Excel(name = '庫(kù)存', index = 5) private Long quantity; @Excel(name = '屬性值', index = 4) private String propValue; @Excel(name = '價(jià)格', index = 6) private Double price; @Excel(name = '商品編碼', index = 7, isMust = false) private String outerId; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long dbId; // 數(shù)據(jù)庫(kù)自增長(zhǎng)id private Date createTime; // 記錄創(chuàng)建時(shí)間 }

3、Excel表格與對(duì)象轉(zhuǎn)換的工具類(lèi),使用時(shí)指定泛型參數(shù)和泛型的class即可

public class ExcelUtil { private static final String GET = 'get'; private static final String SET = 'set'; private static Logger logger = LoggerFactory.getLogger(ExcelUtil.class); /** * 將對(duì)象轉(zhuǎn)換成Excel * * @param objList 需要轉(zhuǎn)換的對(duì)象 * @return 返回是poi中的對(duì)象 */ public static HSSFWorkbook toExcel(List objList) {if (CollectionUtils.isEmpty(objList)) throw new NullPointerException('無(wú)效的數(shù)據(jù)');Class aClass = objList.get(0).getClass();Field[] fields = aClass.getDeclaredFields();HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet();for (int i = 0; i < objList.size(); i++) { HSSFRow row = sheet.createRow(i + 1);//要從第二行開(kāi)始寫(xiě) HSSFRow topRow = null; if (i == 0) topRow = sheet.createRow(0); for (Field field : fields) {Excel excel = field.getAnnotation(Excel.class);//得到字段是否使用了Excel注解if (excel == null) continue;HSSFCell cell = row.createCell(excel.index());//設(shè)置當(dāng)前值放到第幾列String startName = field.getName().substring(0, 1);String endName = field.getName().substring(1, field.getName().length());String methodName = new StringBuffer(GET).append(startName.toUpperCase()).append(endName).toString();try { Method method = aClass.getMethod(methodName);//根據(jù)方法名獲取方法,用于調(diào)用 Object invoke = method.invoke(objList.get(i)); if (invoke == null) continue; cell.setCellValue(invoke.toString());} catch (NoSuchMethodException e) { e.printStackTrace();} catch (IllegalAccessException e) { e.printStackTrace();} catch (InvocationTargetException e) { e.printStackTrace();}if (topRow == null) continue;HSSFCell topRowCell = topRow.createCell(excel.index());topRowCell.setCellValue(excel.name());sheet.setColumnWidth(excel.index(), excel.width()); }}return workbook; } /** * 將Excel文件轉(zhuǎn)換為指定對(duì)象 * * @param file 傳入的Excel * @param c 需要被指定的class * @return * @throws IOException * @throws IllegalAccessException * @throws InstantiationException */ public static <T> List<T> excelFileToObject(MultipartFile file, Class<T> c) throws IOException, IllegalAccessException, InstantiationException {//key為反射得到的下標(biāo),value為對(duì)于的set方法Map<Integer, String> methodMap = new HashMap<>();//保存第一列的值與對(duì)應(yīng)的下標(biāo),用于驗(yàn)證用戶是否刪除了該列,key為下標(biāo),value為名字Map<Integer, String> startRowNameMap = new HashMap<>();//用來(lái)記錄當(dāng)前參數(shù)是否為必須的Map<Integer, Boolean> fieldIsMustMap = new HashMap<>();//得到所有的字段Field[] fields = c.getDeclaredFields();for (Field field : fields) { Excel excel = field.getAnnotation(Excel.class); if (excel == null) continue; String startName = field.getName().substring(0, 1); String endName = field.getName().substring(1, field.getName().length()); String methodName = new StringBuffer(SET).append(startName.toUpperCase()).append(endName).toString(); methodMap.put(excel.index(), methodName); startRowNameMap.put(excel.index(), excel.name()); fieldIsMustMap.put(excel.index(), excel.isMust());}String fileName = file.getOriginalFilename();Workbook wb = fileName.endsWith('.xlsx') ? new XSSFWorkbook(file.getInputStream()) : new HSSFWorkbook(file.getInputStream());Sheet sheet = wb.getSheetAt(0);Row sheetRow = sheet.getRow(0);for (Cell cell : sheetRow) { Integer columnIndex = cell.getColumnIndex(); if (cell.getCellTypeEnum() != CellType.STRING) throw new ExcelException('excel校驗(yàn)失敗, 請(qǐng)勿刪除文件中第一行數(shù)據(jù) !!!'); String value = cell.getStringCellValue(); String name = startRowNameMap.get(columnIndex); if (name == null) throw new ExcelException('excel校驗(yàn)失敗,請(qǐng)勿移動(dòng)文件中任何列的順序!!!'); if (!name.equals(value)) throw new ExcelException('excel校驗(yàn)失敗,【' + name + '】列被刪除,請(qǐng)勿刪除文件中任何列 !!!');}sheet.removeRow(sheetRow);//第一行是不需要被反射賦值的List<T> models = new ArrayList<>();for (Row row : sheet) { if (row == null || !checkRow(row)) continue; T obj = c.newInstance();//創(chuàng)建新的實(shí)例化對(duì)象 Class excelModelClass = obj.getClass(); startRowNameMap.entrySet().forEach(x -> {Integer index = x.getKey();Cell cell = row.getCell(index);String methodName = methodMap.get(index);if (StringUtils.isEmpty(methodName)) return;List<Method> methods = Lists.newArrayList(excelModelClass.getMethods()).stream().filter(m -> m.getName().startsWith(SET)).collect(Collectors.toList());String rowName = startRowNameMap.get(index);//列的名字for (Method method : methods) { if (!method.getName().startsWith(methodName)) continue; //檢測(cè)value屬性 String value = valueCheck(cell, rowName, fieldIsMustMap.get(index)); //開(kāi)始進(jìn)行調(diào)用方法反射賦值 methodInvokeHandler(obj, method, value);} }); models.add(obj);}return models; } /** * 檢測(cè)當(dāng)前需要賦值的value * * @param cell 當(dāng)前循環(huán)行中的列對(duì)象 * @param rowName 列的名字{@link Excel}中的name * @param isMust 是否為必須的 * @return 值 */ private static String valueCheck(Cell cell, String rowName, Boolean isMust) {//有時(shí)候刪除單個(gè)數(shù)據(jù)會(huì)造成cell為空,也可能是value為空if (cell == null && isMust) { throw new ExcelException('excel校驗(yàn)失敗,【' + rowName + '】中的數(shù)據(jù)禁止單個(gè)刪除');}if (cell == null) return null;cell.setCellType(CellType.STRING);String value = cell.getStringCellValue();if ((value == null || value.trim().isEmpty()) && isMust) { throw new ExcelException('excel校驗(yàn)失敗,【' + rowName + '】中的數(shù)據(jù)禁止單個(gè)刪除');}return value; } /** * 反射賦值的處理的方法 * * @param obj 循環(huán)創(chuàng)建的需要賦值的對(duì)象 * @param method 當(dāng)前對(duì)象期中一個(gè)set方法 * @param value 要被賦值的內(nèi)容 */ private static void methodInvokeHandler(Object obj, Method method, String value) {Class<?> parameterType = method.getParameterTypes()[0];try { if (parameterType == null) {method.invoke(obj);return; } String name = parameterType.getName(); if (name.equals(String.class.getName())) {method.invoke(obj, value);return; } if (name.equals(Long.class.getName())) {method.invoke(obj, Long.valueOf(value));return; } if (name.equals(Double.class.getName())) {method.invoke(obj, Double.valueOf(value)); }} catch (IllegalAccessException e) { e.printStackTrace();} catch (InvocationTargetException e) { e.printStackTrace();} } private static boolean checkRow(Row row) {try { if (row == null) return false; short firstCellNum = row.getFirstCellNum(); short lastCellNum = row.getLastCellNum(); if (firstCellNum < 0 && lastCellNum < 0) return false; if (firstCellNum != 0) {for (short i = firstCellNum; i < lastCellNum; i++) { Cell cell = row.getCell(i); String cellValue = cell.getStringCellValue(); if (!StringUtils.isBlank(cellValue)) return true;}return false; } return true;} catch (Exception e) { return true;} }

4、導(dǎo)出Excel與導(dǎo)入Excel的示例代碼

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

使用展示

1、選擇數(shù)據(jù)

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

2、設(shè)置基本數(shù)據(jù),然后導(dǎo)出表格

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

3、導(dǎo)出表格效果,在圖片中看到A和B列沒(méi)有顯示出來(lái),這是因?yàn)槲覍⑵鋵挾扰渲脼榱?

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

4、將必須參數(shù)刪除后上傳測(cè)試,如下圖中,商品編碼我設(shè)置isMust為false所以刪除數(shù)據(jù)就不會(huì)出現(xiàn)此問(wèn)題。會(huì)提示驗(yàn)證失敗,具體錯(cuò)誤查看圖片

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

5、將列中值的順序調(diào)整測(cè)試,也會(huì)提示驗(yàn)證失敗,具體效果如下圖

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

6、正常上傳測(cè)試,具體效果下如圖

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換

到此這篇關(guān)于Java使用poi做加自定義注解實(shí)現(xiàn)對(duì)象與Excel相互轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)Java 對(duì)象與Excel相互轉(zhuǎn)換內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: excel
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲欧美日韩国产综合精品二区 | 精品久久网站| 日本午夜精品视频在线观看| 国产精品嫩草99av在线| 午夜在线一区二区| 中文一区一区三区免费在线观| 巨乳诱惑日韩免费av| 免费在线欧美视频| 亚洲欧美一级| 日本va欧美va精品发布| 国产精品探花在线观看| 日韩精品中文字幕吗一区二区| 亚洲久久一区| 欧美日一区二区三区在线观看国产免| 欧美一区91| 精品欠久久久中文字幕加勒比| 福利一区视频| 99久精品视频在线观看视频| 欧美色图一区| 亚洲欧洲一区| 日本一不卡视频| 国产精品一区二区三区美女 | 91精品国产成人观看| 精品一区欧美| 免费人成在线不卡| 国产美女撒尿一区二区| 国产精品蜜芽在线观看| 成人va天堂| 亚洲综合精品四区| 欧美日韩 国产精品| 狠狠久久伊人| 蜜臀av免费一区二区三区| 鲁大师成人一区二区三区| 日韩高清不卡一区| 国产一二在线播放| 性色一区二区| 欧美国产视频| 色爱av综合网| 亚洲资源网站| 国产精品网址| 欧美 日韩 国产精品免费观看| 亚洲一区二区免费在线观看| 国产色99精品9i| 久久久成人网| 日本欧美韩国一区三区| 日韩欧美字幕| 日韩高清成人在线| 影视先锋久久| 国产日韩欧美一区| 亚洲午夜在线| 国产精品欧美日韩一区| 激情综合激情| 国产精品jk白丝蜜臀av小说| 狠狠久久婷婷| 国产精品白丝av嫩草影院| 久久蜜桃资源一区二区老牛| 亚洲欧美专区| 亚洲不卡av不卡一区二区| 国产探花在线精品一区二区| 国产一区观看| 国产精品嫩模av在线| 亚洲午夜av| 日本中文字幕视频一区| av高清不卡| 日本亚洲不卡| 日韩精品永久网址| 亚洲日本欧美| 日韩精品电影| 国产日韩视频在线| 激情偷拍久久| 久久久国产精品网站| 免费成人性网站| 四虎4545www国产精品| 日韩三级一区| 亚洲大全视频| 精品国产亚洲一区二区三区在线| 免费看的黄色欧美网站| 美女国产一区二区三区| 六月婷婷一区| 欧美综合另类| 精品国产99| 亚洲精品无吗| 日韩精品久久久久久久电影99爱| 国产欧美日韩影院| 亚洲国产专区校园欧美| 国产精品chinese| 综合欧美亚洲| 91成人网在线观看| 波多视频一区| 免费日韩成人| 亚洲精品成人一区| 免费视频国产一区| 首页国产精品| 欧美一级二区| 香蕉久久夜色精品国产| 亚洲涩涩在线| 久久久91麻豆精品国产一区| 日韩av中文字幕一区二区| 日韩一级不卡| 97精品国产福利一区二区三区| 欧美日本二区| 亚洲精品无播放器在线播放| 亚洲激情黄色| 四虎4545www国产精品 | 免费视频国产一区| 成年男女免费视频网站不卡| 国产免费av国片精品草莓男男| 99国产精品99久久久久久粉嫩| 福利一区和二区| 久久精品人人| 欧美激情 亚洲a∨综合| 欧美亚洲综合视频| 日韩精品视频网| 蜜桃91丨九色丨蝌蚪91桃色| 欧美精品一线| 欧美va天堂在线| 精品日韩视频| 日韩国产在线| 日韩.com| 国产aⅴ精品一区二区四区| 欧美专区一区| 日韩av影院| 日韩中文欧美在线| 香蕉精品视频在线观看| 久久中文字幕二区| 日韩欧美精品综合| 日韩免费小视频| 特黄毛片在线观看| 国产不卡精品| 国产中文在线播放| 成人精品视频| 成人一区不卡| 日本不卡免费高清视频在线| 美腿丝袜在线亚洲一区| 国产精品天天看天天狠| 国产福利一区二区三区在线播放| 久久国产精品色av免费看| 日韩毛片网站| 久久精品xxxxx| 国产日韩欧美一区| 嫩草伊人久久精品少妇av杨幂| 国产精品一级| 精品中文在线| 黄色aa久久| 亚洲成人不卡| 欧美日韩国产一区二区三区不卡| 久久精品国产www456c0m| 久久久精品午夜少妇| 999国产精品| 午夜日韩福利| 亚洲精品系列| 国产精品美女久久久久久不卡| 国产精品白丝久久av网站| 国产精品久久久久av蜜臀| 精品淫伦v久久水蜜桃| 久久婷婷av| 亚洲一区日韩| 日本免费新一区视频| 国产精品久久久一区二区| 丁香婷婷久久| 国产99精品| 亚洲色图综合| 日韩av电影一区| 国产精品99久久免费观看| 久久久久久久欧美精品| 中文国产一区| 亚洲综合中文| 麻豆久久一区| 久久青草久久| 蜜桃视频在线观看一区| 日韩av二区在线播放| 精品免费在线| 亚洲男女av一区二区| 亚久久调教视频| 岛国精品一区| 久久高清一区| 国产精品久久久久久久久久齐齐| 欧美日韩免费看片| 蜜臀精品久久久久久蜜臀| 国产精品magnet| 久久婷婷久久| 亚洲欧洲美洲国产香蕉| 精品一级视频| 欧美精品一二| 91麻豆精品激情在线观看最新| 精品视频在线观看网站| 香蕉国产精品| 国产精品久久久网站| 激情综合亚洲| 久久超级碰碰| 亚洲欧美日韩高清在线| 青青草精品视频| 久久国产电影| 日本在线不卡视频一二三区| 精品少妇一区| 亚洲精品1区2区| 国产日韩欧美一区二区三区在线观看| 日韩精品欧美| 国产精品美女在线观看直播| 欧美日韩国产探花|