Part1序
日常在做后臺系統的時候會很頻繁的遇到Excel導入導出的問題,正好這次在做一個后臺系統,就想著寫一個公用工具來進行Excel的導入導出。一般我們在導出的時候都是導出的前端表格,而前端表格同時也會對應的在后臺有一個映射類。所以在寫這個工具的時候我們先理一下我們需要實現的效果:
導出方法接收一個list集合,和一個Class類型,和HttpServletResponse 對象
導出是可能會有下拉列表,所以需要一個map存儲下拉列表數據源,傳入參數后只需一行代碼即可導出
導入方法需要傳入file文件,以及一個Class類型,導入之后將會返回一個list集合,里面的對象就是傳入類型的對象,傳入參數后只需一行代碼即可導入
Part2實現過程
1.首先需要創建三個注解
一個是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了
Part3操作Excel
首先,導入方法。在后臺接收到前端上傳的Excel文件之后,使用poi來讀取Excel文件我們根據傳入的類型上面的字段注解的順序來分別為不同的字段賦值,然后存入集合中,再返回
歡迎關注公眾號"Java學習之道",查看更多干貨!
代碼如下:
/** *將Excel轉換為對象集合 *@paramexcelExcel文件 *@paramclazzpojo類型 *@return */ publicstaticList
接下來就是導出方法
導出分為幾個步驟:
1 建立一個工作簿,也就是類型新建一個Excel文件

2 建立一張sheet表

3 設置標的行高和列寬

4 繪制標題和表頭
這兩個方法是自定義方法,代碼會貼在后面
5 寫入數據到Excel

6 創建下拉列表

7 寫入文件到response
到這里導出工作就完成了下面是一些自定義方法的代碼
歡迎關注公眾號"Java學習之道",查看更多干貨!
/** *獲取一個基本的帶邊框的單元格 *@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,ListcolNames){ //插入標題行 hssfRow=hssfsheet.createRow(1); for(inti=0;iselectListMap){ 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); } } ); } }
Part4使用實例
導出數據

導入數據(返回對象List)

-
Excel
+關注
關注
4文章
231瀏覽量
57698 -
代碼
+關注
關注
30文章
4967瀏覽量
73954 -
數據源
+關注
關注
1文章
66瀏覽量
10087
原文標題:利用Java注解+反射優雅的實現通用Excel導入導出
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
在LabVIEW中導入導出Excel文件程序設計
module 概述以及如何寫一個module
如何寫一個簡短的Python代碼做一個換臉程序的詳細概述
如何使用 Python 來創建一些強大的應用和實用工具
百萬數據的導入導出解決方案
如何寫一個簡單的裝飾器
如何寫一個公用工具來進行Excel的導入導出
評論