色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

寫一個公用工具來進行Excel的導入導出

Android編程精選 ? 來源:CSDN ? 作者:CSDN ? 2022-06-01 10:48 ? 次閱讀
日常在做后臺系統的時候會很頻繁的遇到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(); }
											注解使用示例
											

36fe5bb6-e14d-11ec-ba43-dac502259ad0.png

三個注解創建好之后就需要開始操作Excel了


								

								
									首先,導入方法。在后臺接收到前端上傳的Excel文件之后,使用poi來讀取Excel文件。擴展:接私活
									我們根據傳入的類型上面的字段注解的順序來分別為不同的字段賦值,然后存入集合中,再返回
									代碼如下:

								
									/** *將Excel轉換為對象集合 *@paramexcelExcel文件 *@paramclazzpojo類型 *@return */ publicstaticListparseExcelToList(Fileexcel,Classclazz){ Listres=newArrayList<>(); //創建輸入流,讀取Excel InputStreamis=null; Sheetsheet=null; try{ is=newFileInputStream(excel.getAbsolutePath()); if(is!=null){ Workbookworkbook=WorkbookFactory.create(is); //默認只獲取第一個工作表 sheet=workbook.getSheetAt(0); if(sheet!=null){ //前兩行是標題 inti=2; Stringvalues[]; Rowrow=sheet.getRow(i); while(row!=null){ //獲取單元格數目 intcellNum=row.getPhysicalNumberOfCells(); values=newString[cellNum]; for(intj=0;j<=?cellNum;?j++)?{ ????????????????????????Cell?cell?=???row.getCell(j); ????????????????????????if(cell!=null){ //設置單元格內容類型 cell.setCellType(Cell.CELL_TYPE_STRING); //獲取單元格值 Stringvalue=cell.getStringCellValue()==null?null:cell.getStringCellValue(); values[j]=value; } } Field[]fields=clazz.getDeclaredFields(); Objectobj=clazz.newInstance(); for(Fieldf:fields){ if(f.isAnnotationPresent(ImportIndex.class)){ ImportIndexannotation=f.getDeclaredAnnotation(ImportIndex.class); intindex=annotation.index(); f.setAccessible(true); //此處使用了阿里巴巴的fastjson包里面的一個類型轉換工具類 Objectval=TypeUtils.cast(values[index],f.getType(),null); f.set(obj,val); } } res.add(obj); i++; row=sheet.getRow(i); } } } }catch(Exceptione){ e.printStackTrace(); } returnres; }
									接下來就是導出方法。
									導出分為幾個步驟:
  1. 建立一個工作簿,也就是類型新建一個Excel文件

372aba3a-e14d-11ec-ba43-dac502259ad0.png

  1. 建立一張sheet表

3743a20c-e14d-11ec-ba43-dac502259ad0.png

  1. 設置標的行高和列寬

3786a23c-e14d-11ec-ba43-dac502259ad0.png

  1. 繪制標題和表頭

37d6bb6e-e14d-11ec-ba43-dac502259ad0.png

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

37f7d628-e14d-11ec-ba43-dac502259ad0.png

  1. 創建下拉列表
38234f9c-e14d-11ec-ba43-dac502259ad0.png
  1. 寫入文件到response

383f283e-e14d-11ec-ba43-dac502259ad0.png

到這里導出工作就完成了

下面是一些自定義方法的代碼


								

								

										
											/** *獲取一個基本的帶邊框的單元格 *@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;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); } } ); } }

使用實例


								

								
									導出數據
									

385b584c-e14d-11ec-ba43-dac502259ad0.png

導入數據(返回對象List)

3894e210-e14d-11ec-ba43-dac502259ad0.png

源碼地址:
https://github.com/xyz0101/excelutils

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Excel
    +關注

    關注

    4

    文章

    218

    瀏覽量

    55518
  • 代碼
    +關注

    關注

    30

    文章

    4780

    瀏覽量

    68529

原文標題:注解+反射優雅的實現Excel導入導出(通用版),飄了!

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    SOLIDWORKS高級BOM及屬性批量導入工具

    SOLIDWORKS BOM插件-SolidKits.BOMs工具可以準確、規范、便捷的鍵完成各種結構BOM導出,匯總BOM生成,批量導入屬性,自動建立結構,實現規范化管理,并自定義
    的頭像 發表于 12-02 16:11 ?135次閱讀

    如何導入Altium Designer的原理圖和PCB?

    其它導入器那樣,必須要求先把AD文件另存為ASCII的格式。 ” 導入原理圖 1. 首選打開KiCad, 創建新的工程,并打開原理圖。 2.點擊“文件->
    的頭像 發表于 11-12 12:21 ?912次閱讀
    如何<b class='flag-5'>導入</b>Altium Designer的原理圖和PCB?

    Kali Linux常用工具介紹

    Kali Linux 虛擬機中自帶了大量滲透測試工具,涵蓋了信息收集、漏洞利用、口令破解、漏洞掃描等多個方面。 以下是按分類簡要介紹部分常用工具的使用方法: 使用方法只能當做參考,**詳細
    的頭像 發表于 11-11 09:29 ?456次閱讀

    dubbo3.0 服務導入導出原理

    不管是服務導出還是服務引入,都發生在應用啟動過程中,比如:在啟動類上加上 @EnableDubbo 時,該注解上有 @DubboComponentScan 注解
    的頭像 發表于 11-04 15:01 ?134次閱讀
    dubbo3.0 服務<b class='flag-5'>導入</b><b class='flag-5'>導出</b>原理

    立創商城導出來的CAE和PCB封裝用PADS導入遇到的問題

    導入的低版本DXP格式 如果采用第種方法導入,就出現了分配CAE封裝的時候,管腳不能自動識別的問題,請問這個問題有解嗎?只不過不想自己畫CAE封裝而已,在pads里面,想直接導入
    發表于 09-21 17:17

    DTU加密流程分享

    :通過串口線連接DTU設備; 二:打開配電證書管理工具(此處使用測試USBkey進行識別) 三:終端身份認證以及終端信息的采集操作 四:
    發表于 07-24 08:24

    使用cmsis-dap燒錄器對芯片cy8c4148azi-s455進行燒錄,直失敗的原因?

    我使用的燒錄器是通用型的cmsis-dap燒錄器,可以對6系芯片進行,但是這個芯片為什么直出錯,是工具必須專用工具么?
    發表于 07-24 06:07

    數據分析的工具有哪些

    數據分析是涉及收集、處理、分析和解釋數據以得出有意義見解的過程。在這個過程中,使用正確的工具至關重要。以下是些主要的數據分析工具,以及
    的頭像 發表于 07-05 14:54 ?848次閱讀

    HarmonyOS開發案例:【生活健康app之編寫通用工具類】(5)

    本節將介紹日志打印、時間換算等通用工具類的編寫和使用,工具類可以簡化應用代碼編寫和業務流程處理。
    的頭像 發表于 05-11 09:58 ?528次閱讀
    HarmonyOS開發案例:【生活健康app之編寫通<b class='flag-5'>用工具</b>類】(5)

    怎么用fatfsexcel

    開始新建文件,寫了幾個漢字,存盤后用UE打開,全是亂碼,漢字不見了。 但是,公司的讀卡器插上U盤就能把考勤表都出來啊,EXCEL的。 然后,把考勤表文件拿到,用UE打開,XML的格式,雖然不懂
    發表于 05-11 07:59

    LabVIEW模板匹配位置信息導出

    大家好,我在利用ni vision assistant生成的模板匹配界面時,想要將每一個匹配物體的位置信息導出到word或者Excel,但是他這個匹配個數不確定,怎么樣把匹配到的所有物體信息
    發表于 03-11 20:22

    求助,如何在Micrium uc探針中導出REF_BGT60LTR11AIP_M0雷達原始數據?

    我剛剛從 REF BGT60LTR11AIP M0 開始。那么官方的數據包只有基于 Micrium 的 GUI 界面,而這個 GUI 界面只有數據圖表,沒有導出數據開關。 右邊的exce
    發表于 01-26 06:11

    甲骨文發布VirtualBox 7.0.14版本,支持NVMe存儲導入導出

    此次升級帶來了多項重要功能,例如支持導入導出自帶NVMe存儲控制器的虛擬機;初始引入Red Hat Enterprise Linux 9.4的內置核心技術支持等等。同時,也涵蓋了多個bug修正,如
    的頭像 發表于 01-17 14:41 ?809次閱讀

    通過新的ONNX導出器簡化模型導出流程

    和深度學習模型的基本原理,并提供了通用的文件格式,因此你可以保存并與各種工具起使用,這樣你就可以在你喜歡的框架中進行開發而且不用太擔心
    的頭像 發表于 01-10 09:45 ?936次閱讀
    通過新的ONNX<b class='flag-5'>導出</b>器簡化模型<b class='flag-5'>導出</b>流程

    如何利用Excel輕松創建任意波形?

    在從零開始創建任意波形時,大多數工程師要么采用工程編程環境,比如Matlab、LabVIEW或VEE,要么采用免費或收費的定制任意波形軟件套件。這些是很好的工具,但如果你不常用的話,它們的價格就顯得比較昂貴,并且學會使用也比較耗時。多數工程師未曾想到的另
    的頭像 發表于 12-26 15:02 ?1187次閱讀
    如何利用<b class='flag-5'>Excel</b>輕松創建任意波形?
    主站蜘蛛池模板: 亚洲精品成人无码A片在线| 亚洲午夜精品AV无码少妇| 野花高清在线观看免费3中文| 中国人泡妞xxxxxxxx19| 成人国产在线看不卡| 激情内射亚洲一区二区三区| 免费毛片在线视频| 特污兔午夜影视院| 综合色就爱涩涩涩综合婷婷| 古代又黄又肉到湿的爽文| 久久久精品日本一区二区三区| 日本无码欧美激情在线视频 | 免费看片A级毛片免费看| 涩涩999| 野花日本韩国视频免费高清观看 | ccc36色小姐电影| 国产午夜AV无码无片久久96| 美女裸露100%奶头视频| 无码内射成人免费喷射| 99国产精品| 国产亚洲精品品视频在线| 欧洲xxxxx| 一本色道久久综合一区| 芳草地在线观看免费观看| 久久热最新网站获取3| 无码专区无码专区视频网网址 | 被老总按在办公桌吸奶头| 九九热在线视频| 四川老师边上网课边被啪视频| 2021国产精品视频一区| 热久久2018亚洲欧美| 夜色女人香| 国产伦精品一区二区三区免费| 欧美残忍xxxx极端| 伊人久久精品AV无码一区| 国产成人免费观看在线视频| 免费在线看视频| 一二三四在线视频社区8| 国产精品伦一区二区三级视频| 欧美丰满少妇久久无码精品| 亚洲一日韩欧美中文字幕在线|