91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

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

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

5jek_harmonyos ? 來源:CSDN博客 ? 作者:_JenKin ? 2021-08-20 09:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

日常在做后臺(tái)系統(tǒng)的時(shí)候會(huì)很頻繁的遇到Excel導(dǎo)入導(dǎo)出的問題,正好這次在做一個(gè)后臺(tái)系統(tǒng),就想著寫一個(gè)公用工具來進(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)過程:

首先需要?jiǎng)?chuàng)建三個(gè)注解

一個(gè)是EnableExport ,必須有這個(gè)注解才能導(dǎo)出

/**

* 設(shè)置允許導(dǎo)出

*/

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface EnableExport {

String fileName();

}

然后就是EnableExportField,有這個(gè)注解的字段才會(huì)導(dǎo)出到Excel里面,并且可以設(shè)置列寬

/**

* 設(shè)置該字段允許導(dǎo)出

* 并且可以設(shè)置寬度

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface EnableExportField {

int colWidth() default 100;

String colName();

}

再就是ImportIndex,導(dǎo)入的時(shí)候設(shè)置Excel中的列對(duì)應(yīng)的序號(hào)

/**

* 導(dǎo)入時(shí)索引

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface ImportIndex {

int index() ;

}

注解使用示例

069646f0-013d-11ec-9bcf-12bb97331649.png

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

首先,導(dǎo)入方法。在后臺(tái)接收到前端上傳的Excel文件之后,使用poi來讀取Excel文件

我們根據(jù)傳入的類型上面的字段注解的順序來分別為不同的字段賦值,然后存入集合中,再返回

代碼如下:

/**

* 將Excel轉(zhuǎn)換為對(duì)象集合

* @param excel Excel 文件

* @param clazz pojo類型

* @return

*/

public static List《Object》 parseExcelToList(File excel,Class clazz){

List《Object》 res = new ArrayList《》();

// 創(chuàng)建輸入流,讀取Excel

InputStream is = null;

Sheet sheet = null;

try {

is = new FileInputStream(excel.getAbsolutePath());

if (is != null) {

Workbook workbook = WorkbookFactory.create(is);

//默認(rèn)只獲取第一個(gè)工作表

sheet = workbook.getSheetAt(0);

if (sheet != null) {

//前兩行是標(biāo)題

int i = 2;

String values[] ;

Row row = sheet.getRow(i);

while (row != null) {

//獲取單元格數(shù)目

int cellNum = row.getPhysicalNumberOfCells();

values = new String[cellNum];

for (int j = 0; j 《= cellNum; j++) {

Cell cell = row.getCell(j);

if (cell != null) {

//設(shè)置單元格內(nè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è)類型轉(zhuǎn)換工具類

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;

}

接下來就是導(dǎo)出方法。

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

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

06e8727c-013d-11ec-9bcf-12bb97331649.png

2.建立一張sheet表

06f3fd5e-013d-11ec-9bcf-12bb97331649.png

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

06fef092-013d-11ec-9bcf-12bb97331649.png

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

070eea24-013d-11ec-9bcf-12bb97331649.png

這兩個(gè)方法是自定義方法,代碼會(huì)貼在后面

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

071d4dee-013d-11ec-9bcf-12bb97331649.png

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

072a4c4c-013d-11ec-9bcf-12bb97331649.png

7.寫入文件到response

0735cc2a-013d-11ec-9bcf-12bb97331649.png

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

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

/**

* 獲取一個(gè)基本的帶邊框的單元格

* @param workbook

* @return

*/

private static HSSFCellStyle getBasicCellStyle(HSSFWorkbook workbook){

HSSFCellStyle hssfcellstyle = 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);

return hssfcellstyle;

}

/**

* 獲取帶有背景色的標(biāo)題單元格

* @param workbook

* @return

*/

private static HSSFCellStyle getTitleCellStyle(HSSFWorkbook workbook){

HSSFCellStyle hssfcellstyle = getBasicCellStyle(workbook);

hssfcellstyle.setFillForegroundColor((short) HSSFColor.CORNFLOWER_BLUE.index); // 設(shè)置背景色

hssfcellstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

return hssfcellstyle;

}

/**

* 創(chuàng)建一個(gè)跨列的標(biāo)題行

* @param workbook

* @param hssfRow

* @param hssfcell

* @param hssfsheet

* @param allColNum

* @param title

*/

private static void createTitle(HSSFWorkbook workbook, HSSFRow hssfRow , HSSFCell hssfcell, HSSFSheet hssfsheet,int allColNum,String title){

//在sheet里增加合并單元格

CellRangeAddress cra = new CellRangeAddress(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)題欄以及表格高度

* @param workbook

* @param hssfRow

* @param hssfcell

* @param hssfsheet

* @param colNames

*/

private static void createHeadRow(HSSFWorkbook workbook,HSSFRow hssfRow , HSSFCell hssfcell,HSSFSheet hssfsheet,List《String》 colNames){

//插入標(biāo)題行

hssfRow = hssfsheet.createRow(1);

for (int i = 0; i 《 colNames.size(); i++) {

hssfcell = hssfRow.createCell(i);

hssfcell.setCellStyle(getTitleCellStyle(workbook));

hssfcell.setCellType(HSSFCell.CELL_TYPE_STRING);

hssfcell.setCellValue(colNames.get(i));

}

}

/**

* excel添加下拉數(shù)據(jù)校驗(yàn)

* @param sheet 哪個(gè) sheet 頁添加校驗(yàn)

* @return

*/

public static void createDataValidation(Sheet sheet,Map《Integer,String[]》 selectListMap) {

if(selectListMap!=null) {

selectListMap.forEach(

// 第幾列校驗(yàn)(0開始)key 數(shù)據(jù)源數(shù)組value

(key, value) -》 {

if(value.length》0) {

CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(2, 65535, key, key);

DataValidationHelper helper = sheet.getDataValidationHelper();

DataValidationConstraint constraint = helper.createExplicitListConstraint(value);

DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);

//處理Excel兼容性問題

if (dataValidation instanceof XSSFDataValidation) {

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ù)

0747a2ec-013d-11ec-9bcf-12bb97331649.png

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

07bb6d4e-013d-11ec-9bcf-12bb97331649.png

責(zé)任編輯:haq

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

    關(guān)注

    4

    文章

    227

    瀏覽量

    56647
  • 數(shù)據(jù)導(dǎo)入

    關(guān)注

    0

    文章

    3

    瀏覽量

    7008

原文標(biāo)題:實(shí)現(xiàn) Excel 導(dǎo)入導(dǎo)出

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

    還在用Word/Excel做需求管理?10個(gè)“翻車信號(hào)”,都是小伙伴們踩過的坑~來看看你踩過哪些?是不是也該升級(jí)到更專業(yè)的ALM工具了~
    的頭像 發(fā)表于 07-10 15:59 ?132次閱讀
    使用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ā),我覺得完全可以加個(gè)導(dǎo)出Excel
    發(fā)表于 06-30 17:57

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

    的EDABridge模塊可將印刷電路板(PCB)詳細(xì)導(dǎo)入到您選擇的機(jī)械計(jì)算機(jī)輔助設(shè)計(jì)(MCAD)工具中,為熱分析做準(zhǔn)備。直以來,訪問PCB數(shù)據(jù)的有效方法是使用中間數(shù)
    的頭像 發(fā)表于 06-10 17:36 ?621次閱讀
    Simcenter FLOEFD EDA Bridge模塊:使用<b class='flag-5'>導(dǎo)入</b>的詳細(xì)PCB設(shè)計(jì)和IC熱特性<b class='flag-5'>來</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 ?460次閱讀
    和 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 ?763次閱讀
    Allegro Skill封裝功能-<b class='flag-5'>導(dǎo)出</b>device文件介紹與演示

    使用插件將Excel連接到MySQL/MariaDB

    ,可以快速地將數(shù)據(jù)從 MySQL 或 MariaDB 加載到 Excel,立即從數(shù)據(jù)庫刷新 Excel 工作簿中的數(shù)據(jù),編輯這些數(shù)據(jù),并將它們保存回 MySQL。之后您能夠像使用的 Excel 工作表
    的頭像 發(fā)表于 01-20 12:38 ?622次閱讀
    使用插件將<b class='flag-5'>Excel</b>連接到MySQL/MariaDB

    適用于Oracle的SSIS數(shù)據(jù)流組件:提供快速導(dǎo)入導(dǎo)出功能

    使用SSIS 數(shù)據(jù)流組件,通過與關(guān)鍵數(shù)據(jù)庫和云服務(wù)的 Oracle 數(shù)據(jù)集成改進(jìn)您的 ETL 流程,這些組件提供快捷和可靠的數(shù)據(jù)導(dǎo)入導(dǎo)出功能。 ? Oracle SSIS 數(shù)據(jù)流組件 適用于
    的頭像 發(fā)表于 01-15 10:51 ?991次閱讀
    適用于Oracle的SSIS數(shù)據(jù)流組件:提供快速<b class='flag-5'>導(dǎo)入</b>及<b class='flag-5'>導(dǎo)出</b>功能

    Devart Excel的附加組件

    獲取和設(shè)置多種工具來處理不同來源的數(shù)據(jù)。您只需使用個(gè)工具——Microsoft Excel。最重要的是,您無需熟悉它。你已經(jīng)知道
    的頭像 發(fā)表于 01-07 11:40 ?466次閱讀

    SOLIDWORKS高級(jí)BOM及屬性批量導(dǎo)入工具

    SOLIDWORKS BOM插件-SolidKits.BOMs工具可以準(zhǔn)確、規(guī)范、便捷的鍵完成各種結(jié)構(gòu)BOM導(dǎo)出,匯總BOM生成,批量導(dǎo)入屬性,自動(dòng)建立結(jié)構(gòu),實(shí)現(xiàn)規(guī)范化管理,并自定義
    的頭像 發(fā)表于 12-02 16:11 ?908次閱讀

    Kali Linux常用工具介紹

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

    dubbo3.0 服務(wù)導(dǎo)入導(dǎo)出原理

    不管是服務(wù)導(dǎo)出還是服務(wù)引入,都發(fā)生在應(yīng)用啟動(dòng)過程中,比如:在啟動(dòng)類上加上 @EnableDubbo 時(shí),該注解上有個(gè) @DubboComponentScan 注解
    的頭像 發(fā)表于 11-04 15:01 ?455次閱讀
    dubbo3.0 服務(wù)<b class='flag-5'>導(dǎo)入</b><b class='flag-5'>導(dǎo)出</b>原理

    何用Rust編寫個(gè)ChatGPT桌面應(yīng)用(保姆級(jí)教程)

    為什么我們需要個(gè)桌面應(yīng)用 原因?qū)嵲谔啵覀冃枰憬莸?導(dǎo)出 記錄,需要在回答長(zhǎng)度超長(zhǎng)的時(shí)候自動(dòng)加上“繼續(xù)”,需要 收藏 些很酷很實(shí)用的prompt...... (首先我假設(shè)你是
    的頭像 發(fā)表于 09-25 11:19 ?660次閱讀
    如<b class='flag-5'>何用</b>Rust編寫<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>ChatGPT桌面應(yīng)用(保姆級(jí)教程)

    立創(chuàng)商城導(dǎo)出來的CAE和PCB封裝用PADS導(dǎo)入遇到的問題

    導(dǎo)入的低版本DXP格式 如果采用第種方法導(dǎo)入,就出現(xiàn)了分配CAE封裝的時(shí)候,管腳不能自動(dòng)識(shí)別的問題,請(qǐng)問這個(gè)問題有解嗎?只不過不想自己畫CAE封裝而已,在pads里面,想直接導(dǎo)入
    發(fā)表于 09-21 17:17

    DTU加密流程分享

    :通過串口線連接DTU設(shè)備; 二:打開配電證書管理工具(此處使用測(cè)試USBkey進(jìn)行識(shí)別) 三:終端身份認(rèn)證以及終端信息的采集操作 四:
    發(fā)表于 07-24 08:24
    主站蜘蛛池模板: 丝袜美腿视频一区二区三区 | 欧美一级视频免费看 | 欧美黄色成人 | 日本www免费 | 天天插日日插 | 亚洲男人天堂岛 | 日本天堂影院在线播放 | 人与牲动交xxxxbbbb高清 | 四虎国产精品永久地址51 | 黄网站观看 | 快播久久 | 日韩电影天堂网 | 永久在线免费观看 | 激情综合六月 | 日本黄色一级网站 | 日本不卡视频一区二区 | 黄色污网站在线观看 | 四虎在线最新地址公告 | 亚综合 | 国产人免费人成免费视频 | 看大片全色黄大色黄 | 我爱操| 在线免费成人 | 天天看片网站 | 黄色一级日本 | 男女视频在线观看免费 | 欧美色视频超清在线观看 | 亚洲国产成人久久精品影视 | 一本高清在线视频 | 色系视频在线观看免费观看 | 国产情侣真实露脸在线最新 | 国产香蕉精品视频在 | 成人欧美一区二区三区 | 黄色网在线 | 免费a级午夜绝情美女视频 免费jlzzjlzz在线播放视频 | 男人你懂的在线观看视频 | 欧美色图久久 | 中国成人免费视频 | 一区二区三区亚洲视频 | 欧美人与禽交 | 黄网免费 |