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

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

    文章

    218

    瀏覽量

    55518
  • 數據導入
    +關注

    關注

    0

    文章

    3

    瀏覽量

    6932

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    Kali Linux常用工具介紹

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

    dubbo3.0 服務導入導出原理

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

    何用Rust編寫ChatGPT桌面應用(保姆級教程)

    為什么我們需要桌面應用 原因實在太多,我們需要便捷地 導出 記錄,需要在回答長度超長的時候自動加上“繼續”,需要 收藏 些很酷很實用的prompt...... (首先我假設你是
    的頭像 發表于 09-25 11:19 ?343次閱讀
    如<b class='flag-5'>何用</b>Rust編寫<b class='flag-5'>一</b><b class='flag-5'>個</b>ChatGPT桌面應用(保姆級教程)

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

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

    DTU加密流程分享

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

    數據分析的工具有哪些

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

    用PSOC4芯片設計信號發生器,用什么軟件去進行仿真?

    請問下,就是我用PSOC4芯片設計信號發生器,那么我應該用什么軟件去進行
    發表于 06-03 07:31

    LabVIEW模板匹配位置信息導出

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

    TARGET3001!用法篇-如何將Altium文件導入到TARGET中

    的PCB文件導入TARGET中,這里先去到PCB頁面,點擊上方工具欄對應標志即可。 來到PCB頁面,如果我們想導入Altium的PCB文件,首先先進行
    發表于 02-21 10:11

    求助,如何在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>流程

    宏集方案 | 如何用工業樹莓派和MQTT平臺打通OT和IT?

    何用工業樹莓派和MQTT平臺打通OT和IT?
    的頭像 發表于 01-05 11:01 ?375次閱讀
    宏集方案 | 如<b class='flag-5'>何用工</b>業樹莓派和MQTT平臺打通OT和IT?

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

    在從零開始創建任意波形時,大多數工程師要么采用工程編程環境,比如Matlab、LabVIEW或VEE,要么采用免費或收費的定制任意波形軟件套件。這些是很好的工具,但如果你不常用的話,它們的價格就顯得比較昂貴,并且學會使用也比較耗時。多數工程師未曾想到的另
    的頭像 發表于 12-26 15:02 ?1186次閱讀
    如何利用<b class='flag-5'>Excel</b>輕松創建任意波形?
    主站蜘蛛池模板: 大胸美女被C得嗷嗷叫动态图| 紧缚束缚调教丨vk| 免费国产在线观看| 無码一区中文字幕少妇熟女网站| 538在线播放| 国产亚洲欧美ai在线看片| 欧式午夜理伦三级在线观看| 亚洲综合中文字幕无线码| 成片在线看一区二区草莓| 美女被打开了屁股进去的视频 | 午夜宅宅伦电影网| 被室友C哭调教双性| 美女扒开腿让男人桶个爽| 一级毛片西西人体44rt高清| 国产精品涩涩涩视频网站| 日本精品久久无码影院| 99精品免费久久久久久久久日本 | 99精品视频在线| 久久精品热只有精品| 亚洲精品久久国产高清| 国产精品久久精品| 色AV色婷婷66人妻久久久| av在线观看地址| 奶水四溅54p| 2020年国产精品午夜福利在线观看 | 亚洲精品在线看| 国产免费人成在线看视频| 日日a.v拍夜夜添久久免费| 99视频精品全部 国产| 快播dvd吧| 在线 亚洲 日韩 欧洲视频| 妓女嫖客叫床粗话对白| 亚洲欧美日韩高清中文在线| 国产无遮挡无码视频在线观看不卡| 神马电影我不卡国语版| 超碰最新网站| 日韩中文字幕欧美在线视频| 成人无码精品一区二区在线观看 | 日本午夜精品理论片A级APP发布| a免费在线观看视频| 欧美乱码伦视频免费66网|