日常在做后臺系統(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)入
實現(xiàn)過程:
首先需要創(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了
首先,導(dǎo)入方法。在后臺接收到前端上傳的Excel文件之后,使用poi來讀取Excel文件。擴展:接私活 我們根據(jù)傳入的類型上面的字段注解的順序來分別為不同的字段賦值,然后存入集合中,再返回 代碼如下:
/** *將Excel轉(zhuǎn)換為對象集合 *@paramexcelExcel文件 *@paramclazzpojo類型 *@return */ publicstaticList
- 建立一張sheet表
- 設(shè)置標的行高和列寬
- 繪制標題和表頭
這兩個方法是自定義方法,代碼會貼在后面
- 寫入數(shù)據(jù)到Excel
- 創(chuàng)建下拉列表
- 寫入文件到response
到這里導(dǎo)出工作就完成了
colNames){ //插入標題行 hssfRow=hssfsheet.createRow(1); for(inti=0;ireturn */ publicstaticvoidcreateDataValidation(Sheetsheet,MapselectListMap){ 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); } } ); } }
下面是一些自定義方法的代碼
/** *獲取一個基本的帶邊框的單元格 *@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);//設(shè)置背景色 hssfcellstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); returnhssfcellstyle; } /** *創(chuàng)建一個跨列的標題行 *@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è)置表頭標題欄以及表格高度 *@paramworkbook *@paramhssfRow *@paramhssfcell *@paramhssfsheet *@paramcolNames */ privatestaticvoidcreateHeadRow(HSSFWorkbookworkbook,HSSFRowhssfRow,HSSFCellhssfcell,HSSFSheethssfsheet,List
使用實例
導(dǎo)出數(shù)據(jù)
導(dǎo)入數(shù)據(jù)(返回對象List)
源碼地址:
https://github.com/xyz0101/excelutils
審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
Excel
+關(guān)注
關(guān)注
4文章
221瀏覽量
55558 -
代碼
+關(guān)注
關(guān)注
30文章
4813瀏覽量
68833
原文標題:注解+反射優(yōu)雅的實現(xiàn)Excel導(dǎo)入導(dǎo)出(通用版),飄了!
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
Chart FX——圖表導(dǎo)出
Web格式的圖片(如 PNG 或 JPEG)。 Chart FX 中還有其他文件類型,稱為 “圖表模板”,允許您將圖表的外觀(顏色、圖表類型和樣式、可視工具等)保存在一個文件中,以便以后將其應(yīng)用到另
適用于Oracle的SSIS數(shù)據(jù)流組件:提供快速導(dǎo)入及導(dǎo)出功能
使用SSIS 數(shù)據(jù)流組件,通過與關(guān)鍵數(shù)據(jù)庫和云服務(wù)的 Oracle 數(shù)據(jù)集成來改進您的 ETL 流程,這些組件提供快捷和可靠的數(shù)據(jù)導(dǎo)入和導(dǎo)出功能。 ? Oracle SSIS 數(shù)據(jù)流組件 適用于
Devart Excel的附加組件
獲取和設(shè)置多種工具來處理不同來源的數(shù)據(jù)。您只需使用一個工具——Microsoft Excel。最重要的是,您無需熟悉它。你已經(jīng)知道
迅為RK3568開發(fā)板EMMC鏡像導(dǎo)出打包update.img
在上一個小節(jié)中已經(jīng)將 EMMC 中的全部分區(qū)鏡像進行了導(dǎo)出,而為了方便期間和統(tǒng)一燒寫,我們一般都
發(fā)表于 12-25 14:57
SOLIDWORKS高級BOM及屬性批量導(dǎo)入工具
SOLIDWORKS BOM插件-SolidKits.BOMs工具可以準確、規(guī)范、便捷的一鍵完成各種結(jié)構(gòu)BOM導(dǎo)出,匯總BOM生成,批量導(dǎo)入屬性,自動建立結(jié)構(gòu),實現(xiàn)規(guī)范化管理,并自定義
如何導(dǎo)入Altium Designer的原理圖和PCB?
其它導(dǎo)入器那樣,必須要求先把AD文件另存為ASCII的格式。 ” 導(dǎo)入原理圖 1. 首選打開KiCad, 創(chuàng)建一個新的工程,并打開原理圖。 2.點擊“文件->
Kali Linux常用工具介紹
Kali Linux 虛擬機中自帶了大量滲透測試工具,涵蓋了信息收集、漏洞利用、口令破解、漏洞掃描等多個方面。 以下是按分類簡要介紹一部分常用工具的使用方法: 使用方法只能當做參考,**詳細
dubbo3.0 服務(wù)導(dǎo)入導(dǎo)出原理
不管是服務(wù)導(dǎo)出還是服務(wù)引入,都發(fā)生在應(yīng)用啟動過程中,比如:在啟動類上加上 @EnableDubbo 時,該注解上有一個 @DubboComponentScan 注解
立創(chuàng)商城導(dǎo)出來的CAE和PCB封裝用PADS導(dǎo)入遇到的問題
能導(dǎo)入的低版本DXP格式
如果采用第一種方法導(dǎo)入,就出現(xiàn)了分配CAE封裝的時候,管腳不能自動識別的問題,請問這個問題有解嗎?只不過不想自己畫CAE封裝而已,在pads里面,想直接導(dǎo)入立
發(fā)表于 09-21 17:17
DTU加密流程分享
一:通過串口線連接DTU設(shè)備;
二:打開配電證書管理工具(此處使用測試USBkey來進行識別)
三:終端身份認證以及終端信息的采集操作
四:
發(fā)表于 07-24 08:24
使用cmsis-dap燒錄器對芯片cy8c4148azi-s455進行燒錄,一直失敗的原因?
我使用的燒錄器是通用型的cmsis-dap燒錄器,可以對6系芯片進行燒寫,但是這個芯片為什么一直出錯,是工具必須專用工具么?
發(fā)表于 07-24 06:07
數(shù)據(jù)分析的工具有哪些
數(shù)據(jù)分析是一個涉及收集、處理、分析和解釋數(shù)據(jù)以得出有意義見解的過程。在這個過程中,使用正確的工具至關(guān)重要。以下是一些主要的數(shù)據(jù)分析工具,以及
怎么用fatfs寫excel?
開始新建一個文件,寫了幾個漢字,存盤后用UE打開,全是亂碼,漢字不見了。
但是,公司的讀卡器插上U盤就能把考勤表都出來啊,EXCEL的。
然后,把考勤表文件拿到,用UE打開,XML的格式,雖然不懂
發(fā)表于 05-11 07:59
LabVIEW模板匹配位置信息導(dǎo)出
大家好,我在利用ni vision assistant生成的模板匹配界面時,想要將每一個匹配物體的位置信息導(dǎo)出到word或者Excel,但是他這個匹配個數(shù)不確定,怎么樣把匹配到的所有物體信息導(dǎo)
發(fā)表于 03-11 20:22
求助,如何在Micrium uc探針中導(dǎo)出REF_BGT60LTR11AIP_M0雷達原始數(shù)據(jù)?
我剛剛從 REF BGT60LTR11AIP M0 開始。那么官方的數(shù)據(jù)包只有一個基于 Micrium 的 GUI 界面,而這個 GUI 界面只有數(shù)據(jù)圖表,沒有導(dǎo)出數(shù)據(jù)開關(guān)。
右邊的exce
發(fā)表于 01-26 06:11
評論