日常在做后臺系統的時候會很頻繁的遇到Excel導入導出的問題,正好這次在做一個后臺系統,就想著寫一個公用工具來進行Excel的導入導出。
一般我們在導出的時候都是導出的前端表格,而前端表格同時也會對應的在后臺有一個映射類。
所以在寫這個工具時我們先理一下需要實現的效果:
- 導出方法接收一個list集合,和一個Class類型,和HttpServletResponse 對象
- 導出是可能會有下拉列表,所以需要一個map存儲下拉列表數據源,傳入參數后只需一行代碼即可導出
- 導入方法需要傳入file文件,以及一個Class類型,導入之后將會返回一個list集合,里面的對象就是傳入類型的對象,傳入參數后只需一行代碼即可導入
實現過程:
首先需要創建三個注解 一個是EnableExport ,必須有這個注解才能導出
/** *設置允許導出 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public@interfaceEnableExport{ StringfileName(); } 然后就是EnableExportField,有這個注解的字段才會導出到Excel里面,并且可以設置列寬。
/** *設置該字段允許導出 *并且可以設置寬度 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public@interfaceEnableExportField{ intcolWidth()default100; StringcolName(); } 再就是ImportIndex,導入的時候設置Excel中的列對應的序號
/** *導入時索引 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public@interfaceImportIndex{ intindex(); } 注解使用示例

三個注解創建好之后就需要開始操作Excel了
首先,導入方法。在后臺接收到前端上傳的Excel文件之后,使用poi來讀取Excel文件。擴展:接私活 我們根據傳入的類型上面的字段注解的順序來分別為不同的字段賦值,然后存入集合中,再返回 代碼如下:
/** *將Excel轉換為對象集合 *@paramexcelExcel文件 *@paramclazzpojo類型 *@return */ publicstaticList

- 建立一張sheet表

- 設置標的行高和列寬

- 繪制標題和表頭

這兩個方法是自定義方法,代碼會貼在后面
- 寫入數據到Excel

- 創建下拉列表

- 寫入文件到response

到這里導出工作就完成了
colNames){ //插入標題行 hssfRow=hssfsheet.createRow(1); for(inti=0;ireturn */ publicstaticvoidcreateDataValidation(Sheetsheet,MapselectListMap){ if(selectListMap!=null){ selectListMap.forEach( //第幾列校驗(0開始)key數據源數組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("提示","只能選擇下拉框里面的數據"); sheet.addValidationData(dataValidation); } } ); } }
下面是一些自定義方法的代碼
/** *獲取一個基本的帶邊框的單元格 *@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; } /** *獲取帶有背景色的標題單元格 *@paramworkbook *@return */ privatestaticHSSFCellStylegetTitleCellStyle(HSSFWorkbookworkbook){ HSSFCellStylehssfcellstyle=getBasicCellStyle(workbook); hssfcellstyle.setFillForegroundColor((short)HSSFColor.CORNFLOWER_BLUE.index);//設置背景色 hssfcellstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); returnhssfcellstyle; } /** *創建一個跨列的標題行 *@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);//上邊框 //設置表頭 hssfRow=hssfsheet.getRow(0); hssfcell=hssfRow.getCell(0); hssfcell.setCellStyle(getTitleCellStyle(workbook)); hssfcell.setCellType(HSSFCell.CELL_TYPE_STRING); hssfcell.setCellValue(title); } /** *設置表頭標題欄以及表格高度 *@paramworkbook *@paramhssfRow *@paramhssfcell *@paramhssfsheet *@paramcolNames */ privatestaticvoidcreateHeadRow(HSSFWorkbookworkbook,HSSFRowhssfRow,HSSFCellhssfcell,HSSFSheethssfsheet,List
使用實例
導出數據

導入數據(返回對象List)

源碼地址:
https://github.com/xyz0101/excelutils
審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Excel
+關注
關注
4文章
231瀏覽量
57698 -
代碼
+關注
關注
30文章
4967瀏覽量
73954
原文標題:注解+反射優雅的實現Excel導入導出(通用版),飄了!
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
EtherCAT工具 SSC 工具 5.11版本 無法添加EtherCAT_IO模板導入
板卡型號為HPM5E00EVK,對應SSC 工具為5.11版本
想嘗試燒錄EtherCAT_IO-例程進行測試,按照倉庫中Readme文件進行燒錄測試,發現添加配置文件后無法選中EtherCAT_IO配置文件
發表于 12-25 22:55
電能質量在線監測裝置的多維度統計報表支持遠程訪問導出嗎?
是的,現代電能質量在線監測裝置的多維度統計報表全面支持遠程訪問導出功能 ,已成為主流產品標配,可通過多種方式隨時隨地獲取分析數據。 一、遠程訪問導出方式全景 1. Web 瀏覽器直連(最通用) 輸入
KiCad 已支持導入 Altium 工程(Project)
“ ?9.0.3 的小版本更新中增加一個非常實用的功能:直接導入 Altium 的工程,省去了分別導入原理圖和 PCB 的麻煩。? ” ? Altium
使用Word/Excel管理需求的10個痛點及解決方案Perforce ALM
還在用Word/Excel做需求管理?10個“翻車信號”,都是小伙伴們踩過的坑~來看看你踩過哪些?是不是也該升級到更專業的ALM工具了~
如何導出Excel文件 -- excel_hm介紹 ##三方SDK##
前陣子在和朋友討論,記賬類的app已經那么普遍了,如果想要做點不一樣的還能加什么功能。從我自己的角度出發,我覺得完全可以加一個導出Excel
發表于 06-30 17:57
【Banana Pi BPI-RV2開發板試用體驗】移植lrzsz以便從串口和ssh導入導出文件
cp src/lrz /mnt/d
cp src/lsz /mnt/d
使用Winscp導入到開發板
開發板中
chmod +x lrz
chmod +x lsz
mv lrz rz
mv lsz sz
此時就可以使用rz,sz導入
發表于 06-25 16:39
Simcenter FLOEFD EDA Bridge模塊:使用導入的詳細PCB設計和IC熱特性來簡化熱分析
的EDABridge模塊可將印刷電路板(PCB)詳細導入到您選擇的機械計算機輔助設計(MCAD)工具中,為熱分析做準備。一直以來,訪問PCB數據的有效方法是使用中間數
TSolidX應用:液晶掩膜結構GDSⅡ文件的生成和導出
TX系列的布局編輯器TX Layout軟件可以支持GDSⅡ文件的導入和導出,其功能如下:
1. GDS文件的導入
1.1創建一個帶有GDSⅡ
發表于 05-20 08:45
和 Dr Peter 一起學 KiCad 4.9~4.10:導出Gerber并下單(收到成品)
作流程的第七步。在這一步中,我將導出制造 PCB 所需的數據的 Gerber 文件。在將 Gerber 文件上傳到制造商網站之前,我將使用一個特殊工
Allegro Skill封裝功能-導出device文件介紹與演示
焊盤連接,Device文件會明確這種映射。Device文件僅適用于導入第三方網表的情況,PCB導入第三方網表不能直接與原理圖進行交互式,這時候需要導出Device 文件,然后PCB才能
發表于 04-19 09:44
?2053次閱讀
如何將S32K312 MBDT生成的代碼導出到S32 Design Studio?
→ S32DS Application Project”并選擇我的卡創建了一個新項目。接下來,我右鍵單擊我的新項目,選擇導入選項,然后選擇我從 Simulink 導出的文件。最后,我
發表于 03-20 07:02
使用工具套件2020.2從ncappzoo運行模型和演示OpenVINO?報錯怎么解決?
使用工具套件 2020.2 從 ncappzoo 運行模型和演示OpenVINO?報錯
發表于 03-05 10:22
寫一個公用工具來進行Excel的導入導出
評論