Part1序
日常在做后臺系統(tǒng)的時候會很頻繁的遇到Excel導(dǎo)入導(dǎo)出的問題,正好這次在做一個后臺系統(tǒng),就想著寫一個公用工具來進行Excel的導(dǎo)入導(dǎo)出。一般我們在導(dǎo)出的時候都是導(dǎo)出的前端表格,而前端表格同時也會對應(yīng)的在后臺有一個映射類。所以在寫這個工具的時候我們先理一下我們需要實現(xiàn)的效果:
導(dǎo)出方法接收一個list集合,和一個Class類型,和HttpServletResponse 對象
導(dǎo)出是可能會有下拉列表,所以需要一個map存儲下拉列表數(shù)據(jù)源,傳入參數(shù)后只需一行代碼即可導(dǎo)出
導(dǎo)入方法需要傳入file文件,以及一個Class類型,導(dǎo)入之后將會返回一個list集合,里面的對象就是傳入類型的對象,傳入?yún)?shù)后只需一行代碼即可導(dǎo)入
Part2實現(xiàn)過程
1.首先需要創(chuàng)建三個注解
一個是EnableExport ,必須有這個注解才能導(dǎo)出
/** *設(shè)置允許導(dǎo)出 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public@interfaceEnableExport{ StringfileName(); }
然后就是EnableExportField,有這個注解的字段才會導(dǎo)出到Excel里面,并且可以設(shè)置列寬
/** *設(shè)置該字段允許導(dǎo)出 *并且可以設(shè)置寬度 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public@interfaceEnableExportField{ intcolWidth()default100; StringcolName(); }
再就是ImportIndex,導(dǎo)入的時候設(shè)置Excel中的列對應(yīng)的序號
/** *導(dǎo)入時索引 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public@interfaceImportIndex{ intindex(); }
注解使用示例
三個注解創(chuàng)建好之后就需要開始操作Excel了
Part3操作Excel
首先,導(dǎo)入方法。在后臺接收到前端上傳的Excel文件之后,使用poi來讀取Excel文件我們根據(jù)傳入的類型上面的字段注解的順序來分別為不同的字段賦值,然后存入集合中,再返回
歡迎關(guān)注公眾號"Java學(xué)習(xí)之道",查看更多干貨!
代碼如下:
/** *將Excel轉(zhuǎn)換為對象集合 *@paramexcelExcel文件 *@paramclazzpojo類型 *@return */ publicstaticList
接下來就是導(dǎo)出方法
導(dǎo)出分為幾個步驟:
1 建立一個工作簿,也就是類型新建一個Excel文件
2 建立一張sheet表
3 設(shè)置標(biāo)的行高和列寬
4 繪制標(biāo)題和表頭
這兩個方法是自定義方法,代碼會貼在后面
5 寫入數(shù)據(jù)到Excel
6 創(chuàng)建下拉列表
7 寫入文件到response
到這里導(dǎo)出工作就完成了下面是一些自定義方法的代碼
歡迎關(guān)注公眾號"Java學(xué)習(xí)之道",查看更多干貨!
/** *獲取一個基本的帶邊框的單元格 *@paramworkbook *@return */ privatestaticHSSFCellStylegetBasicCellStyle(HSSFWorkbookworkbook){ HSSFCellStylehssfcellstyle=workbook.createCellStyle(); hssfcellstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setBorderRight(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setBorderTop(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); hssfcellstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); hssfcellstyle.setWrapText(true); returnhssfcellstyle; } /** *獲取帶有背景色的標(biāo)題單元格 *@paramworkbook *@return */ privatestaticHSSFCellStylegetTitleCellStyle(HSSFWorkbookworkbook){ HSSFCellStylehssfcellstyle=getBasicCellStyle(workbook); hssfcellstyle.setFillForegroundColor((short)HSSFColor.CORNFLOWER_BLUE.index);//設(shè)置背景色 hssfcellstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); returnhssfcellstyle; } /** *創(chuàng)建一個跨列的標(biāo)題行 *@paramworkbook *@paramhssfRow *@paramhssfcell *@paramhssfsheet *@paramallColNum *@paramtitle */ privatestaticvoidcreateTitle(HSSFWorkbookworkbook,HSSFRowhssfRow,HSSFCellhssfcell,HSSFSheethssfsheet,intallColNum,Stringtitle){ //在sheet里增加合并單元格 CellRangeAddresscra=newCellRangeAddress(0,0,0,allColNum); hssfsheet.addMergedRegion(cra); //使用RegionUtil類為合并后的單元格添加邊框 RegionUtil.setBorderBottom(1,cra,hssfsheet,workbook);//下邊框 RegionUtil.setBorderLeft(1,cra,hssfsheet,workbook);//左邊框 RegionUtil.setBorderRight(1,cra,hssfsheet,workbook);//有邊框 RegionUtil.setBorderTop(1,cra,hssfsheet,workbook);//上邊框 //設(shè)置表頭 hssfRow=hssfsheet.getRow(0); hssfcell=hssfRow.getCell(0); hssfcell.setCellStyle(getTitleCellStyle(workbook)); hssfcell.setCellType(HSSFCell.CELL_TYPE_STRING); hssfcell.setCellValue(title); } /** *設(shè)置表頭標(biāo)題欄以及表格高度 *@paramworkbook *@paramhssfRow *@paramhssfcell *@paramhssfsheet *@paramcolNames */ privatestaticvoidcreateHeadRow(HSSFWorkbookworkbook,HSSFRowhssfRow,HSSFCellhssfcell,HSSFSheethssfsheet,ListcolNames){ //插入標(biāo)題行 hssfRow=hssfsheet.createRow(1); for(inti=0;iselectListMap){ if(selectListMap!=null){ selectListMap.forEach( //第幾列校驗(0開始)key數(shù)據(jù)源數(shù)組value (key,value)->{ if(value.length>0){ CellRangeAddressListcellRangeAddressList=newCellRangeAddressList(2,65535,key,key); DataValidationHelperhelper=sheet.getDataValidationHelper(); DataValidationConstraintconstraint=helper.createExplicitListConstraint(value); DataValidationdataValidation=helper.createValidation(constraint,cellRangeAddressList); //處理Excel兼容性問題 if(dataValidationinstanceofXSSFDataValidation){ dataValidation.setSuppressDropDownArrow(true); dataValidation.setShowErrorBox(true); }else{ dataValidation.setSuppressDropDownArrow(false); } dataValidation.setEmptyCellAllowed(true); dataValidation.setShowPromptBox(true); dataValidation.createPromptBox("提示","只能選擇下拉框里面的數(shù)據(jù)"); sheet.addValidationData(dataValidation); } } ); } }
Part4使用實例
導(dǎo)出數(shù)據(jù)
導(dǎo)入數(shù)據(jù)(返回對象List)
-
Excel
+關(guān)注
關(guān)注
4文章
215瀏覽量
55361 -
代碼
+關(guān)注
關(guān)注
30文章
4670瀏覽量
67764 -
數(shù)據(jù)源
+關(guān)注
關(guān)注
1文章
61瀏覽量
9639
原文標(biāo)題:利用Java注解+反射優(yōu)雅的實現(xiàn)通用Excel導(dǎo)入導(dǎo)出
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論