国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

日常在做后臺系統的時候會很頻繁的遇到Excel導入導出的問題,正好這次在做一個后臺系統,就想著寫一個公用工具來進行Excel的導入導出。

一般我們在導出的時候都是導出的前端表格,而前端表格同時也會對應的在后臺有一個映射類。

所以在寫這個工具的時候我們先理一下我們需要實現的效果:

導出方法接收一個list集合,和一個Class類型,和HttpServletResponse 對象

導出是可能會有下拉列表,所以需要一個map存儲下拉列表數據源,傳入參數后只需一行代碼即可導出

導入方法需要傳入file文件,以及一個Class類型,導入之后將會返回一個list集合,里面的對象就是傳入類型的對象,傳入參數后只需一行代碼即可導入

實現過程:

首先需要創建三個注解

一個是EnableExport ,必須有這個注解才能導出

/**

* 設置允許導出

*/

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface EnableExport {

String fileName();

}

然后就是EnableExportField,有這個注解的字段才會導出到Excel里面,并且可以設置列寬

/**

* 設置該字段允許導出

* 并且可以設置寬度

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface EnableExportField {

int colWidth() default 100;

String colName();

}

再就是ImportIndex,導入的時候設置Excel中的列對應的序號

/**

* 導入時索引

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface ImportIndex {

int index() ;

}

注解使用示例

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

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

首先,導入方法。在后臺接收到前端上傳的Excel文件之后,使用poi來讀取Excel文件

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

代碼如下:

/**

* 將Excel轉換為對象集合

* @param excel Excel 文件

* @param clazz pojo類型

* @return

*/

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

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

// 創建輸入流,讀取Excel

InputStream is = null;

Sheet sheet = null;

try {

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

if (is != null) {

Workbook workbook = WorkbookFactory.create(is);

//默認只獲取第一個工作表

sheet = workbook.getSheetAt(0);

if (sheet != null) {

//前兩行是標題

int i = 2;

String values[] ;

Row row = sheet.getRow(i);

while (row != null) {

//獲取單元格數目

int cellNum = row.getPhysicalNumberOfCells();

values = new String[cellNum];

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

Cell cell = row.getCell(j);

if (cell != null) {

//設置單元格內容類型

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包里面的一個類型轉換工具類

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;

}

接下來就是導出方法。

導出分為幾個步驟:

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

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

2.建立一張sheet表

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

3.設置標的行高和列寬

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

4.繪制標題和表頭

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

這兩個方法是自定義方法,代碼會貼在后面

5.寫入數據到Excel

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

6.創建下拉列表

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

7.寫入文件到response

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

到這里導出工作就完成了

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

/**

* 獲取一個基本的帶邊框的單元格

* @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;

}

/**

* 獲取帶有背景色的標題單元格

* @param workbook

* @return

*/

private static HSSFCellStyle getTitleCellStyle(HSSFWorkbook workbook){

HSSFCellStyle hssfcellstyle = getBasicCellStyle(workbook);

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

hssfcellstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

return hssfcellstyle;

}

/**

* 創建一個跨列的標題行

* @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); // 上邊框

//設置表頭

hssfRow = hssfsheet.getRow(0);

hssfcell = hssfRow.getCell(0);

hssfcell.setCellStyle( getTitleCellStyle(workbook));

hssfcell.setCellType(HSSFCell.CELL_TYPE_STRING);

hssfcell.setCellValue(title);

}

/**

* 設置表頭標題欄以及表格高度

* @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){

//插入標題行

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添加下拉數據校驗

* @param sheet 哪個 sheet 頁添加校驗

* @return

*/

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

if(selectListMap!=null) {

selectListMap.forEach(

// 第幾列校驗(0開始)key 數據源數組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(“提示”, “只能選擇下拉框里面的數據”);

sheet.addValidationData(dataValidation);

}

}

);

}

}

使用實例

導出數據

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

導入數據(返回對象List)

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

責任編輯:haq

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

    關注

    4

    文章

    231

    瀏覽量

    57698
  • 數據導入
    +關注

    關注

    0

    文章

    3

    瀏覽量

    7040

原文標題:實現 Excel 導入導出

文章出處:【微信號:harmonyos_developer,微信公眾號:harmonyos_developer】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    頁面導入導出功能怎么用?如何快速合并兩工程,復制粘貼注意事項?

    頁面導入導出功能怎么用?如何快速合并兩工程,復制粘貼注意事項?
    發表于 02-03 14:16

    頁面導入導出功能怎么用?如何快速合并兩工程,復制粘貼注意事項?

    頁面導入導出功能怎么用?如何快速合并兩工程,復制粘貼注意事項?
    發表于 01-28 15:17

    EtherCAT工具 SSC 工具 5.11版本 無法添加EtherCAT_IO模板導入

    板卡型號為HPM5E00EVK,對應SSC 工具為5.11版本 想嘗試燒錄EtherCAT_IO-例程進行測試,按照倉庫中Readme文件進行燒錄測試,發現添加配置文件后無法選中EtherCAT_IO配置文件
    發表于 12-25 22:55

    電能質量在線監測裝置的多維度統計報表支持遠程訪問導出嗎?

    是的,現代電能質量在線監測裝置的多維度統計報表全面支持遠程訪問導出功能 ,已成為主流產品標配,可通過多種方式隨時隨地獲取分析數據。 、遠程訪問導出方式全景 1. Web 瀏覽器直連(最通用) 輸入
    的頭像 發表于 12-17 15:39 ?341次閱讀
    電能質量在線監測裝置的多維度統計報表支持遠程訪問<b class='flag-5'>導出</b>嗎?

    EXCEL導入—設計與思考

    EXCEL導入—設計與思考 、案例信息與設計 1.1、案例需求與背景 B2BTC同城二期有Exce
    的頭像 發表于 08-20 16:56 ?636次閱讀
    <b class='flag-5'>EXCEL</b><b class='flag-5'>導入</b>—設計與思考

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

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

    使用Word/Excel管理需求的10痛點及解決方案Perforce ALM

    還在用Word/Excel做需求管理?10“翻車信號”,都是小伙伴們踩過的坑~來看看你踩過哪些?是不是也該升級到更專業的ALM工具了~
    的頭像 發表于 07-10 15:59 ?664次閱讀
    使用Word/<b class='flag-5'>Excel</b>管理需求的10<b class='flag-5'>個</b>痛點及解決方案Perforce ALM

    如何導出Excel文件 -- excel_hm介紹 ##三方SDK##

    前陣子在和朋友討論,記賬類的app已經那么普遍了,如果想要做點不樣的還能加什么功能。從我自己的角度出發,我覺得完全可以加導出Excel
    發表于 06-30 17:57

    【Banana Pi BPI-RV2開發板試用體驗】移植lrzsz以便從串口和ssh導入導出文件

    cp src/lrz /mnt/d cp src/lsz /mnt/d 使用Winscp導入到開發板 開發板中 chmod +x lrz chmod +x lsz mv lrz rz mv lsz sz 此時就可以使用rz,sz導入
    發表于 06-25 16:39

    Simcenter FLOEFD EDA Bridge模塊:使用導入的詳細PCB設計和IC熱特性簡化熱分析

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

    TSolidX應用:液晶掩膜結構GDSⅡ文件的生成和導出

    TX系列的布局編輯器TX Layout軟件可以支持GDSⅡ文件的導入導出,其功能如下: 1. GDS文件的導入 1.1創建帶有GDSⅡ
    發表于 05-20 08:45

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

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

    Allegro Skill封裝功能-導出device文件介紹與演示

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

    如何將S32K312 MBDT生成的代碼導出到S32 Design Studio?

    → S32DS Application Project”并選擇我的卡創建了新項目。接下來,我右鍵單擊我的新項目,選擇導入選項,然后選擇我從 Simulink 導出的文件。最后,我
    發表于 03-20 07:02

    VirtualLab Fusion應用:用于參數掃描的自定義工具

    。在今天的通訊中,我們將通過兩示例展示此工具如何改進光學工程師的工作流程。在第一個示例中,我們檢查準直透鏡的特性,并自動將探測器結果導出到指定的文件路徑(例如,用于附加的后處理)。在
    發表于 03-07 08:46