日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

本文介紹了解析EXCEL文件的通用方法的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

我需要解析EXCEL文件并從中創(chuàng)建對(duì)象列表。為了做同樣的事情,我們正在使用There Aresorg.apache.poi讀取EXCEL文件,我們能夠獲得所需的詳細(xì)信息,目前我們正在根據(jù)索引獲取單元格值,并將其設(shè)置為對(duì)象字段。但我們認(rèn)為這不是基于索引獲取值的好方法,我們應(yīng)該找到一種通用的方法來(lái)成功解析EXCEL文件,以防添加或刪除一些列,這樣我們就不必在代碼上做太多工作。我遇到了this article,它幾乎滿(mǎn)足了要求,但使用了我們不允許使用的反射方法。有沒(méi)有可能在不使用單元格索引的情況下解析EXCEL文件,這樣如果EXCEL文件的格式發(fā)生更改,我們就不需要花費(fèi)太多精力?

public List<DTO> jsonConverter(Workbook workbook, Sheet sheet, String filename)
      throws ParseException {
    List<DTO> listOfDTOs = new ArrayList<>();
    Row row;
    for (int index = 1; index <= sheet.getLastRowNum(); index++) {
      row = sheet.getRow(index);
      if (row != null) {
        DTO dto = new DTO();
        dto.setFieldX(
            getCellValueAsStringBasedOnCellType(
                workbook, row.getCell(0, MissingCellPolicy.CREATE_NULL_AS_BLANK)));
        dto.setFieldY(
            getCellValueAsStringBasedOnCellType(
                workbook, row.getCell(1, MissingCellPolicy.CREATE_NULL_AS_BLANK)));
        listOfDTOs.add(dto);
      }
    }
    return listOfDTOs;
  }

public String getCellValueAsStringBasedOnCellType(Workbook workbook, Cell cell) {
    DataFormatter formatter = new DataFormatter();
    if (cell != null && cell.getCellType() == CellType.FORMULA) {
      FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
      return formatter.formatCellValue(cell, evaluator);
    }
    return formatter.formatCellValue(cell);
  }

推薦答案

當(dāng)然。很簡(jiǎn)單:

安裝

讀取Excel文件中的第一行,將其視為列,并將每個(gè)單元格視為字符串。

將這些存儲(chǔ)在數(shù)組中。

現(xiàn)在,您只需使用表達(dá)式headers[idx]即可將任何索引轉(zhuǎn)換為列名。

因此,對(duì)于任何給定的單元格,您都知道標(biāo)題名稱(chēng)。現(xiàn)在,您需要將這些知識(shí)轉(zhuǎn)化為正確的預(yù)測(cè)。假設(shè)您在列E(i == 4)中,頭文件的值是header[4],也就是Address,然后您希望獲取字符串("Address")并將其轉(zhuǎn)換為正確的調(diào)用。您最終需要調(diào)用:

String cellValue = getCellValueAsStringBasedOnCellType(workbook, row.getCell(1, MissingCellPolicy.CREATE_NULL_AS_BLANK)));

dto.setFieldAddress(cellValue);

該代碼片段中的所有內(nèi)容對(duì)于該字符串的任何值都是相同的,setFieldAddress名稱(chēng)除外。

因此,我們需要將字符串"Address"轉(zhuǎn)換為調(diào)用setFieldAddress的操作。

解決方案

java.util.function和用于救援的哈希圖!

這是一種將獲取dto實(shí)例并設(shè)置地址字段的概念存儲(chǔ)在變量中的方法:

BiConsumer<DTO, String> setAddress = (dto, value) -> dto.setFieldAddress(value);

甚至更簡(jiǎn)單:

BiConsumer<DTO, String> setAddress = DTO::setFieldAddress;

這些代碼片段做的是相同的事情:它們不設(shè)置地址;它們是如何設(shè)置地址的秘訣,并且您將在DTO上設(shè)置地址的概念存儲(chǔ)在一個(gè)變量中,以便您可以在以后運(yùn)行它,并且可以想運(yùn)行多少次就運(yùn)行多少次。這通常稱(chēng)為”閉包”或”lambda”。

我們可以將這些內(nèi)容存儲(chǔ)在地圖中:

Map<String, BiConsumer<DTO, String>> dtoSetters = new HashMap<>();
dtoSetters.put("Address", DTO::setFieldAddress);

然后我們就可以搞清楚了:

int colIdx = ...;
String headerName = header[colIdx];
var setter = dtoSetters.get(headerName);
if (setter == null) throw new IllegalStateException("Unexpected column header in excel sheet: " + headerName);

String cellValue = getCellValueAsStringBasedOnCellType(workbook, row.getCell(1, MissingCellPolicy.CREATE_NULL_AS_BLANK)));

setter.apply(dto, cellValue);

因此,創(chuàng)建該映射(一旦,在系統(tǒng)引導(dǎo)時(shí),例如使用靜態(tài)初始值設(shè)定項(xiàng)),用上面的代碼替換您的dto.setFieldX代碼,就可以了。

這篇關(guān)于解析EXCEL文件的通用方法的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,

分享到:
標(biāo)簽:EXCEL 文件 方法 解析 通用
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定