91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

寫一個(gè)公用工具來(lái)進(jìn)行Excel的導(dǎo)入導(dǎo)出

Android編程精選 ? 來(lái)源:CSDN ? 作者:CSDN ? 2022-06-01 10:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

日常在做后臺(tái)系統(tǒng)的時(shí)候會(huì)很頻繁的遇到Excel導(dǎo)入導(dǎo)出的問(wèn)題,正好這次在做一個(gè)后臺(tái)系統(tǒng),就想著寫一個(gè)公用工具來(lái)進(jìn)行Excel的導(dǎo)入導(dǎo)出。 一般我們?cè)趯?dǎo)出的時(shí)候都是導(dǎo)出的前端表格,而前端表格同時(shí)也會(huì)對(duì)應(yīng)的在后臺(tái)有一個(gè)映射類。 所以在寫這個(gè)工具時(shí)我們先理一下需要實(shí)現(xiàn)的效果:
  • 導(dǎo)出方法接收一個(gè)list集合,和一個(gè)Class類型,和HttpServletResponse 對(duì)象
  • 導(dǎo)出是可能會(huì)有下拉列表,所以需要一個(gè)map存儲(chǔ)下拉列表數(shù)據(jù)源,傳入?yún)?shù)后只需一行代碼即可導(dǎo)出
  • 導(dǎo)入方法需要傳入file文件,以及一個(gè)Class類型,導(dǎo)入之后將會(huì)返回一個(gè)list集合,里面的對(duì)象就是傳入類型的對(duì)象,傳入?yún)?shù)后只需一行代碼即可導(dǎo)入

實(shí)現(xiàn)過(guò)程:


								

								
											首先需要?jiǎng)?chuàng)建三個(gè)注解
											一個(gè)是EnableExport ,必須有這個(gè)注解才能導(dǎo)出

										
											/** *設(shè)置允許導(dǎo)出 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public@interfaceEnableExport{ StringfileName(); }
											然后就是EnableExportField,有這個(gè)注解的字段才會(huì)導(dǎo)出到Excel里面,并且可以設(shè)置列寬。

										
											/** *設(shè)置該字段允許導(dǎo)出 *并且可以設(shè)置寬度 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public@interfaceEnableExportField{ intcolWidth()default100; StringcolName(); }
											再就是ImportIndex,導(dǎo)入的時(shí)候設(shè)置Excel中的列對(duì)應(yīng)的序號(hào)

										
											/** *導(dǎo)入時(shí)索引 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public@interfaceImportIndex{ intindex(); }
											注解使用示例
											

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

三個(gè)注解創(chuàng)建好之后就需要開(kāi)始操作Excel了


								

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

								
									/** *將Excel轉(zhuǎn)換為對(duì)象集合 *@paramexcelExcel文件 *@paramclazzpojo類型 *@return */ publicstaticListparseExcelToList(Fileexcel,Classclazz){ Listres=newArrayList<>(); //創(chuàng)建輸入流,讀取Excel InputStreamis=null; Sheetsheet=null; try{ is=newFileInputStream(excel.getAbsolutePath()); if(is!=null){ Workbookworkbook=WorkbookFactory.create(is); //默認(rèn)只獲取第一個(gè)工作表 sheet=workbook.getSheetAt(0); if(sheet!=null){ //前兩行是標(biāo)題 inti=2; Stringvalues[]; Rowrow=sheet.getRow(i); while(row!=null){ //獲取單元格數(shù)目 intcellNum=row.getPhysicalNumberOfCells(); values=newString[cellNum]; for(intj=0;j<=?cellNum;?j++)?{ ????????????????????????Cell?cell?=???row.getCell(j); ????????????????????????if(cell!=null){ //設(shè)置單元格內(nèi)容類型 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包里面的一個(gè)類型轉(zhuǎn)換工具類 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; }
									接下來(lái)就是導(dǎo)出方法。
									導(dǎo)出分為幾個(gè)步驟:
  1. 建立一個(gè)工作簿,也就是類型新建一個(gè)Excel文件

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

  1. 建立一張sheet表

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

  1. 設(shè)置標(biāo)的行高和列寬

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

  1. 繪制標(biāo)題和表頭

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

這兩個(gè)方法是自定義方法,代碼會(huì)貼在后面
  1. 寫入數(shù)據(jù)到Excel

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

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

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

到這里導(dǎo)出工作就完成了

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


								

								

										
											/** *獲取一個(gè)基本的帶邊框的單元格 *@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)建一個(gè)跨列的標(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;ireturn */ publicstaticvoidcreateDataValidation(Sheetsheet,MapselectListMap){ if(selectListMap!=null){ selectListMap.forEach( //第幾列校驗(yàn)(0開(kāi)始)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兼容性問(wèn)題 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); } } ); } }

使用實(shí)例


								

								
									導(dǎo)出數(shù)據(jù)
									

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

導(dǎo)入數(shù)據(jù)(返回對(duì)象List)

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

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

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Excel
    +關(guān)注

    關(guān)注

    4

    文章

    231

    瀏覽量

    57721
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4971

    瀏覽量

    74038

原文標(biāo)題:注解+反射優(yōu)雅的實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出(通用版),飄了!

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    使用工業(yè)顯微鏡進(jìn)行尺寸測(cè)量的步驟

    工業(yè)顯微鏡作為精密測(cè)量工具,在機(jī)械加工、電子制造、精密模具等領(lǐng)域發(fā)揮著不可替代的作用。其高放大倍數(shù)、高分辨率的特性,使得微米級(jí)甚至納米級(jí)的尺寸測(cè)量成為可能。以下是使用工業(yè)顯微鏡進(jìn)行尺寸測(cè)量的詳細(xì)步驟,結(jié)合實(shí)際操作經(jīng)驗(yàn)與行業(yè)規(guī)范,
    的頭像 發(fā)表于 03-12 16:53 ?158次閱讀

    頁(yè)面導(dǎo)入導(dǎo)出功能怎么用?如何快速合并兩個(gè)工程,復(fù)制粘貼注意事項(xiàng)?

    頁(yè)面導(dǎo)入導(dǎo)出功能怎么用?如何快速合并兩個(gè)工程,復(fù)制粘貼注意事項(xiàng)?
    發(fā)表于 02-03 14:16

    頁(yè)面導(dǎo)入導(dǎo)出功能怎么用?如何快速合并兩個(gè)工程,復(fù)制粘貼注意事項(xiàng)?

    頁(yè)面導(dǎo)入導(dǎo)出功能怎么用?如何快速合并兩個(gè)工程,復(fù)制粘貼注意事項(xiàng)?
    發(fā)表于 01-28 15:17

    EtherCAT工具 SSC 工具 5.11版本 無(wú)法添加EtherCAT_IO模板導(dǎo)入

    板卡型號(hào)為HPM5E00EVK,對(duì)應(yīng)SSC 工具為5.11版本 想嘗試燒錄EtherCAT_IO-例程進(jìn)行測(cè)試,按照倉(cāng)庫(kù)中Readme文件進(jìn)行燒錄測(cè)試,發(fā)現(xiàn)添加配置文件后無(wú)法選中EtherCAT_IO配置文件
    發(fā)表于 12-25 22:55

    電能質(zhì)量在線監(jiān)測(cè)裝置的多維度統(tǒng)計(jì)報(bào)表支持遠(yuǎn)程訪問(wèn)導(dǎo)出嗎?

    是的,現(xiàn)代電能質(zhì)量在線監(jiān)測(cè)裝置的多維度統(tǒng)計(jì)報(bào)表全面支持遠(yuǎn)程訪問(wèn)導(dǎo)出功能 ,已成為主流產(chǎn)品標(biāo)配,可通過(guò)多種方式隨時(shí)隨地獲取分析數(shù)據(jù)。 、遠(yuǎn)程訪問(wèn)導(dǎo)出方式全景 1. Web 瀏覽器直連(最通用) 輸入
    的頭像 發(fā)表于 12-17 15:39 ?354次閱讀
    電能質(zhì)量在線監(jiān)測(cè)裝置的多維度統(tǒng)計(jì)報(bào)表支持遠(yuǎn)程訪問(wèn)<b class='flag-5'>導(dǎo)出</b>嗎?

    EXCEL導(dǎo)入—設(shè)計(jì)與思考

    EXCEL導(dǎo)入—設(shè)計(jì)與思考 、案例信息與設(shè)計(jì) 1.1、案例需求與背景 B2BTC同城二期有個(gè)Exce
    的頭像 發(fā)表于 08-20 16:56 ?663次閱讀
    <b class='flag-5'>EXCEL</b><b class='flag-5'>導(dǎo)入</b>—設(shè)計(jì)與思考

    KiCad 已支持導(dǎo)入 Altium 工程(Project)

    “ ?9.0.3 的小版本更新中增加個(gè)非常實(shí)用的功能:直接導(dǎo)入 Altium 的工程,省去了分別導(dǎo)入原理圖和 PCB 的麻煩。? ” ? Altium
    的頭像 發(fā)表于 07-21 11:15 ?3269次閱讀
    KiCad 已支持<b class='flag-5'>導(dǎo)入</b> Altium 工程(Project)

    使用Word/Excel管理需求的10個(gè)痛點(diǎn)及解決方案Perforce ALM

    還在用Word/Excel做需求管理?10個(gè)“翻車信號(hào)”,都是小伙伴們踩過(guò)的坑~來(lái)看看你踩過(guò)哪些?是不是也該升級(jí)到更專業(yè)的ALM工具了~
    的頭像 發(fā)表于 07-10 15:59 ?683次閱讀
    使用Word/<b class='flag-5'>Excel</b>管理需求的10<b class='flag-5'>個(gè)</b>痛點(diǎn)及解決方案Perforce ALM

    如何導(dǎo)出Excel文件 -- excel_hm介紹 ##三方SDK##

    前陣子在和朋友討論,記賬類的app已經(jīng)那么普遍了,如果想要做點(diǎn)不樣的還能加什么功能。從我自己的角度出發(fā),我覺(jué)得完全可以加個(gè)導(dǎo)出Excel
    發(fā)表于 06-30 17:57

    【Banana Pi BPI-RV2開(kāi)發(fā)板試用體驗(yàn)】移植lrzsz以便從串口和ssh導(dǎo)入導(dǎo)出文件

    cp src/lrz /mnt/d cp src/lsz /mnt/d 使用Winscp導(dǎo)入到開(kāi)發(fā)板 開(kāi)發(fā)板中 chmod +x lrz chmod +x lsz mv lrz rz mv lsz sz 此時(shí)就可以使用rz,sz導(dǎo)入
    發(fā)表于 06-25 16:39

    Simcenter FLOEFD EDA Bridge模塊:使用導(dǎo)入的詳細(xì)PCB設(shè)計(jì)和IC熱特性來(lái)簡(jiǎn)化熱分析

    的EDABridge模塊可將印刷電路板(PCB)詳細(xì)導(dǎo)入到您選擇的機(jī)械計(jì)算機(jī)輔助設(shè)計(jì)(MCAD)工具中,為熱分析做準(zhǔn)備。直以來(lái),訪問(wèn)PCB數(shù)據(jù)的有效方法是使用中間數(shù)
    的頭像 發(fā)表于 06-10 17:36 ?1796次閱讀
    Simcenter FLOEFD EDA Bridge模塊:使用<b class='flag-5'>導(dǎo)入</b>的詳細(xì)PCB設(shè)計(jì)和IC熱特性<b class='flag-5'>來(lái)</b>簡(jiǎn)化熱分析

    TSolidX應(yīng)用:液晶掩膜結(jié)構(gòu)GDSⅡ文件的生成和導(dǎo)出

    TX系列的布局編輯器TX Layout軟件可以支持GDSⅡ文件的導(dǎo)入導(dǎo)出,其功能如下: 1. GDS文件的導(dǎo)入 1.1創(chuàng)建個(gè)帶有GDSⅡ
    發(fā)表于 05-20 08:45

    和 Dr Peter 起學(xué) KiCad 4.9~4.10:導(dǎo)出Gerber并下單(收到成品)

    作流程的第七步。在這步中,我將導(dǎo)出制造 PCB 所需的數(shù)據(jù)的 Gerber 文件。在將 Gerber 文件上傳到制造商網(wǎng)站之前,我將使用個(gè)特殊
    的頭像 發(fā)表于 04-28 18:02 ?1609次閱讀
    和 Dr Peter <b class='flag-5'>一</b>起學(xué) KiCad 4.9~4.10:<b class='flag-5'>導(dǎo)出</b>Gerber并下單(收到成品)

    Allegro Skill封裝功能-導(dǎo)出device文件介紹與演示

    焊盤連接,Device文件會(huì)明確這種映射。Device文件僅適用于導(dǎo)入第三方網(wǎng)表的情況,PCB導(dǎo)入第三方網(wǎng)表不能直接與原理圖進(jìn)行交互式,這時(shí)候需要導(dǎo)出Device 文件,然后PCB才能
    發(fā)表于 04-19 09:44 ?2097次閱讀
    Allegro Skill封裝功能-<b class='flag-5'>導(dǎo)出</b>device文件介紹與演示

    如何將S32K312 MBDT生成的代碼導(dǎo)出到S32 Design Studio?

    → S32DS Application Project”并選擇我的卡創(chuàng)建了個(gè)新項(xiàng)目。接下來(lái),我右鍵單擊我的新項(xiàng)目,選擇導(dǎo)入選項(xiàng),然后選擇我從 Simulink 導(dǎo)出的文件。最后,我
    發(fā)表于 03-20 07:02