在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

Android編程精選 ? 來(lái)源:Android編程精選 ? 作者:Android編程精選 ? 2022-10-09 14:19 ? 次閱讀

Part1序

日常在做后臺(tái)系統(tǒng)的時(shí)候會(huì)很頻繁的遇到Excel導(dǎo)入導(dǎo)出的問(wèn)題,正好這次在做一個(gè)后臺(tái)系統(tǒng),就想著寫(xiě)一個(gè)公用工具來(lái)進(jìn)行Excel的導(dǎo)入導(dǎo)出。一般我們?cè)趯?dǎo)出的時(shí)候都是導(dǎo)出的前端表格,而前端表格同時(shí)也會(huì)對(duì)應(yīng)的在后臺(tái)有一個(gè)映射類(lèi)。所以在寫(xiě)這個(gè)工具的時(shí)候我們先理一下我們需要實(shí)現(xiàn)的效果:

導(dǎo)出方法接收一個(gè)list集合,和一個(gè)Class類(lèi)型,和HttpServletResponse 對(duì)象

導(dǎo)出是可能會(huì)有下拉列表,所以需要一個(gè)map存儲(chǔ)下拉列表數(shù)據(jù)源,傳入?yún)?shù)后只需一行代碼即可導(dǎo)出

導(dǎo)入方法需要傳入file文件,以及一個(gè)Class類(lèi)型,導(dǎo)入之后將會(huì)返回一個(gè)list集合,里面的對(duì)象就是傳入類(lèi)型的對(duì)象,傳入?yún)?shù)后只需一行代碼即可導(dǎo)入

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

1.首先需要?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();


}

注解使用示例

3bef6c88-4574-11ed-96c9-dac502259ad0.png三個(gè)注解創(chuàng)建好之后就需要開(kāi)始操作Excel了

Part3操作Excel

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

歡迎關(guān)注公眾號(hào)"Java學(xué)習(xí)之道",查看更多干貨!

代碼如下:

/**
*將Excel轉(zhuǎn)換為對(duì)象集合
*@paramexcelExcel文件
*@paramclazzpojo類(lèi)型
*@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)容類(lèi)型
????????????????????????????cell.setCellType(Cell.CELL_TYPE_STRING?);
????????????????????????????//獲取單元格值
????????????????????????????String?value?=?cell.getStringCellValue()?==?null???null?:?cell.getStringCellValue();
????????????????????????????values[j]=value;
????????????????????????}
????????????????????}
????????????????????Field[]?fields?=?clazz.getDeclaredFields();
????????????????????Object?obj?=?clazz.newInstance();
????????????????????for(Field?f?:?fields){
????????????????????????if(f.isAnnotationPresent(ImportIndex.class)){
????????????????????????????ImportIndex?annotation?=?f.getDeclaredAnnotation(ImportIndex.class);
????????????????????????????int?index?=?annotation.index();
????????????????????????????f.setAccessible(true);
????????????????????????????//此處使用了阿里巴巴的fastjson包里面的一個(gè)類(lèi)型轉(zhuǎn)換工具類(lèi)
????????????????????????????Object?val?=TypeUtils.cast(values[index],f.getType(),null);
????????????????????????????f.set(obj,val);
????????????????????????}
????????????????????}
????????????????????res.add(obj);
????????????????????i++;
????????????????????row=sheet.getRow(i);
????????????????}

????????????}
????????}
????}?catch?(Exception?e)?{
????????e.printStackTrace();
????}
????return?res;
}

接下來(lái)就是導(dǎo)出方法

導(dǎo)出分為幾個(gè)步驟:

1 建立一個(gè)工作簿,也就是類(lèi)型新建一個(gè)Excel文件

3c1fdefe-4574-11ed-96c9-dac502259ad0.png

2 建立一張sheet表

3c3801dc-4574-11ed-96c9-dac502259ad0.png

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

3c4eb008-4574-11ed-96c9-dac502259ad0.png

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

3c6b1860-4574-11ed-96c9-dac502259ad0.png這兩個(gè)方法是自定義方法,代碼會(huì)貼在后面

5 寫(xiě)入數(shù)據(jù)到Excel

3c913e5a-4574-11ed-96c9-dac502259ad0.png

6 創(chuàng)建下拉列表

3cb8b2be-4574-11ed-96c9-dac502259ad0.png

7 寫(xiě)入文件到response

3cd36c44-4574-11ed-96c9-dac502259ad0.png到這里導(dǎo)出工作就完成了下面是一些自定義方法的代碼

歡迎關(guān)注公眾號(hào)"Java學(xué)習(xí)之道",查看更多干貨!

/**
*獲取一個(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類(lèi)為合并后的單元格添加邊框
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;iselectListMap){
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);
}
}
);
}
}

Part4使用實(shí)例

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

3d06dd9a-4574-11ed-96c9-dac502259ad0.png

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

3d33a7a8-4574-11ed-96c9-dac502259ad0.png

審核編輯:彭靜

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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

    文章

    225

    瀏覽量

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

    關(guān)注

    30

    文章

    4868

    瀏覽量

    69897
  • 數(shù)據(jù)源
    +關(guān)注

    關(guān)注

    1

    文章

    64

    瀏覽量

    9835

原文標(biāo)題:利用Java注解+反射優(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)推薦

    在LabVIEW中導(dǎo)入導(dǎo)出Excel文件程序設(shè)計(jì)

    LabVIEW Report Generation工具包的基礎(chǔ)上,以示例方式描述了在LabVIEW開(kāi)發(fā)環(huán)境中利用報(bào)表生成器函數(shù),實(shí)現(xiàn)導(dǎo)入Excel文件和導(dǎo)出
    發(fā)表于 10-25 14:58

    labview如何導(dǎo)入導(dǎo)出Excel表,希望能給個(gè)示例或者模板參考!

    labview如何導(dǎo)入導(dǎo)出Excel表,希望能給個(gè)示例或者模板參考!比較急在做課設(shè)!!
    發(fā)表于 11-12 16:57

    如何寫(xiě)個(gè)簡(jiǎn)易的printf函數(shù)?

    如何寫(xiě)個(gè)簡(jiǎn)易的printf函數(shù)?
    發(fā)表于 04-28 06:47

    module 概述以及如何寫(xiě)個(gè)module

    driver,而且它也能縮短我們 driver development 的時(shí)間。在這篇文章里,我將要跟各位介紹下 module 的原理,以及如何寫(xiě)個(gè) module。 module
    發(fā)表于 11-07 11:37 ?0次下載

    如何寫(xiě)個(gè)簡(jiǎn)短的Python代碼做一個(gè)換臉程序的詳細(xì)概述

    在這篇文章中將介紹如何寫(xiě)個(gè)簡(jiǎn)短(200行)的 Python 腳本,來(lái)自動(dòng)地將幅圖片的臉替換為另幅圖片的臉。
    的頭像 發(fā)表于 07-09 10:48 ?4668次閱讀

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

    日常在做后臺(tái)系統(tǒng)的時(shí)候會(huì)很頻繁的遇到Excel導(dǎo)入導(dǎo)出的問(wèn)題,正好這次在做一個(gè)后臺(tái)系統(tǒng),就想著寫(xiě)
    的頭像 發(fā)表于 08-20 09:33 ?2832次閱讀
    如何用<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b><b class='flag-5'>公用工具</b><b class='flag-5'>來(lái)</b><b class='flag-5'>進(jìn)行</b><b class='flag-5'>Excel</b>的<b class='flag-5'>導(dǎo)入</b><b class='flag-5'>導(dǎo)出</b>

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

    導(dǎo)入方法需要傳入file文件,以及個(gè)Class類(lèi)型,導(dǎo)入之后將會(huì)返回個(gè)list集合,里面的對(duì)
    的頭像 發(fā)表于 06-01 10:48 ?1796次閱讀

    如何使用 Python 來(lái)創(chuàng)建些強(qiáng)大的應(yīng)用和實(shí)用工具

    本文將探討如何以 Zynq UltraScale 器件上的 IP 核為目標(biāo),使用 Python 來(lái)創(chuàng)建些強(qiáng)大的應(yīng)用和實(shí)用工具。此處提供了個(gè)
    發(fā)表于 09-08 10:23 ?760次閱讀

    百萬(wàn)數(shù)據(jù)的導(dǎo)入導(dǎo)出解決方案

    就是從DB中查詢(xún)數(shù)據(jù)然后使用POI寫(xiě)到Excel上。 寫(xiě)本文的背景是因?yàn)樵诠ぷ髦杏龅搅舜髷?shù)據(jù)的導(dǎo)入導(dǎo)出,問(wèn)題既然來(lái)了逃跑不如干掉它!!! 只要這次解決了,后期遇到同樣的問(wèn)題就好解決
    的頭像 發(fā)表于 10-11 17:19 ?1527次閱讀

    如何導(dǎo)入導(dǎo)出SCL源文件?

    如何導(dǎo)入導(dǎo)出SCL源文件?
    的頭像 發(fā)表于 01-16 10:41 ?2403次閱讀

    excel導(dǎo)出功能如何實(shí)現(xiàn)?

    最近我做過(guò)個(gè)MySQL`百萬(wàn)級(jí)別`數(shù)據(jù)的`excel`導(dǎo)出功能,已經(jīng)正常上線(xiàn)使用了。 這個(gè)功能挺有意思的,里面需要注意的細(xì)節(jié)還真不少,現(xiàn)在拿出來(lái)跟大家分享
    的頭像 發(fā)表于 05-11 18:17 ?1334次閱讀
    <b class='flag-5'>excel</b><b class='flag-5'>導(dǎo)出</b>功能如何實(shí)現(xiàn)?

    款解決大文件內(nèi)存溢出的 Excel 處理工具

    ? 介紹 快速開(kāi)始 引入依賴(lài) 簡(jiǎn)單導(dǎo)出 定義實(shí)體類(lèi) 復(fù)雜導(dǎo)出 簡(jiǎn)單導(dǎo)入 參考資料 介紹 EasyExcel 是個(gè)基于 Java 的、快速、
    的頭像 發(fā)表于 07-03 16:11 ?1942次閱讀
    <b class='flag-5'>一</b>款解決大文件內(nèi)存溢出的 <b class='flag-5'>Excel</b> 處理<b class='flag-5'>工具</b>

    如何寫(xiě)個(gè)簡(jiǎn)單的裝飾器

    要的是,它讓 Python 中被裝飾器裝飾后的方法長(zhǎng)得更像裝飾前的方法。 本篇文章不會(huì)過(guò)多的向你介紹裝飾器的基本知識(shí),我會(huì)默認(rèn)你知道什么是裝飾器,并且懂得如何寫(xiě)個(gè)簡(jiǎn)單的裝飾器。 不了解裝飾器的可以先去閱讀我之前
    的頭像 發(fā)表于 11-01 09:54 ?630次閱讀
    <b class='flag-5'>如何寫(xiě)</b><b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>簡(jiǎn)單的裝飾器

    如何寫(xiě)個(gè)內(nèi)存泄漏檢測(cè)工具

    如何確定有內(nèi)存泄露問(wèn)題,如何定位到內(nèi)存泄露位置,如何寫(xiě)個(gè)內(nèi)存泄漏檢測(cè)工具? 1:概述 內(nèi)存泄露本質(zhì):其實(shí)就是申請(qǐng)調(diào)用malloc/new,但是釋放調(diào)用free/delete有遺漏,或
    的頭像 發(fā)表于 11-11 16:19 ?945次閱讀

    數(shù)據(jù)庫(kù)的clob類(lèi)型如何導(dǎo)入導(dǎo)出

    導(dǎo)入導(dǎo)出操作時(shí),可以使用不同的方法和工具來(lái)實(shí)現(xiàn),具體取決于數(shù)據(jù)庫(kù)的類(lèi)型和版本。 導(dǎo)出CL
    的頭像 發(fā)表于 11-21 10:51 ?5487次閱讀
    主站蜘蛛池模板: 深夜免费在线视频 | 婷婷亚洲五月 | 午夜精品久久久久久毛片 | 男女免费观看视频 | 我想看三级特黄 | 色香视频一sxmv首页 | 一级欧美一级日韩 | 欧美日本一区 | jlzzjlzz欧美大全 | 亚洲一区二区三区高清视频 | 窝窝视频成人影院午夜在线 | 亚洲韩国欧美一区二区三区 | 国产国语videosex另类 | 性色爽爱性色爽爱网站 | 国产一级做a爱免费观看 | 男人的天堂222eee | 又黄又爽的成人免费网站 | 夜夜爽夜夜爱 | 性欧美bbbbbb动漫 | 涩涩涩丁香色婷五月网视色 | 国产最新网站 | 免费人成激情视频在线观看冫 | 超级香蕉97视频在线观看一区 | 伊人98| 国产三级国产精品国产普男人 | 国产成人午夜精品影院游乐网 | 天堂在线精品 | 天天搞天天爽 | 免费啪视频在线观看 | 色网站观看 | 美女写真mm爽爽爽 | 国产色妞妞在线观看 | 亚洲另类激情综合偷自拍 | 天堂在线bt | 亚洲vv| 乱码精品一区二区三区 | 热久久综合这里只有精品电影 | 久久精品影院永久网址 | 91精品日本久久久久久牛牛 | 很黄很色的网站 | 免费a网站|