java讀取excel層級結構的遞迴寫法
java poi讀取excel這種層級結構的遞迴寫法,思路:同列的迴圈獲取,子級遞迴獲取,想清楚每一個單元格變化的地方,傳不同的引數。exel的單元格的值只能先讀取行,再獲取列。
包括合併單元格的獲取並不是有序的,需要根據行列的起始索引來判斷是否是合併單元格。每次都要先進行判斷。
public List<KnowledgeSystemField> readExcel(String filename, InputStream inputStream) {
Workbook workbook = null;
try {
filename = filepath;
String filetype = filename.substring(filename.lastIndexOf(".") + 1, filename.length());
File excelfile = new File(filename);
if (!excelfile.exists()) {
log.info("路徑為" + filename + "的檔案不存在!");
return null;
}
inputStream = new FileInputStream(excelfile);
workbook = getWorkBook(inputStream, filetype);
// 讀取excel中的資料
addRowKLevel(workbook);
List<KnowledgeSystemField> resultDataList = null;
// resultDataList = parseExcel(workbook);
return resultDataList;
} catch (Exception e) {
log.warn("解析Excel失敗,檔名:" + filename + " 錯誤資訊:" + StrFunc.exception2str(e));
return null;
} finally {
try {
if (null != workbook) {
workbook.close();
}
if (null != inputStream) {
inputStream.close();
}
} catch (Exception e) {
log.warn("關閉資料流出錯!錯誤資訊:" + e.getMessage());
return null;
}
}
}
public Workbook getWorkBook(InputStream in, String filetype) throws Exception {
Workbook workbook = null;
if (StrFunc.compareStr(filetype, XLS)) {
workbook = new HSSFWorkbook(in);
} else if (StrFunc.compareStr(filetype, XLSX)) {
workbook = new XSSFWorkbook(in);
}
return workbook;
}
public void addRowKLevel(Workbook workbook) {
Sheet sheet = workbook.getSheetAt(0);
if (sheet == null) {
return;
}
int startRow = STARTROW;
int endRow = sheet.getLastRowNum();
endRow = 26;
String dirId = "";
getCellValue(startRow, endRow, 1, sheet, dirId);
}
public void getCellValue(int firstRowIndex, int lastRowIndex, int column, Sheet sheet, String dirid) {
if (column > 4) {
return;
}
int lastRow = firstRowIndex;
JSONObject multiRow = isMultiRow(firstRowIndex, lastRowIndex, column, sheet);
if (multiRow.getBoolean("isMulti")) {
lastRow = multiRow.getInt("lastRow");
}
while (lastRow <= lastRowIndex) {
Cell cell = sheet.getRow(firstRowIndex).getCell(column);
String knowId = addKnowOrGroup(column, dirid, cell);
getCellValue(firstRowIndex, lastRow, column + 1, sheet, StrFunc.isNull(knowId) ? dirid : knowId);
firstRowIndex = lastRow + 1;
lastRow = firstRowIndex;
multiRow = isMultiRow(firstRowIndex, lastRowIndex, column, sheet);
if (multiRow.getBoolean("isMulti")) {
lastRow = multiRow.getInt("lastRow");
}
}
}
public JSONObject isMultiRow(int firstRowIndex, int lastRowIndex, int column, Sheet sheet) {
JSONObject obj = new JSONObject();
obj.put("isMulti", false);
List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
for (int j = 0; j < mergedRegions.size(); j++) {
CellRangeAddress cr = mergedRegions.get(j);
int firstColumn = cr.getFirstColumn();
int lastColumn = cr.getLastColumn();
int firstRow = cr.getFirstRow();
int lastRow = cr.getLastRow();
if (firstColumn == lastColumn && firstColumn == column) {
if (firstRowIndex == firstRow && lastRow <= lastRowIndex) {
obj.put("isMulti", true);
obj.put("lastRow", lastRow);
break;
}
}
}
return obj;
}
private String addKnowOrGroup(int column, String dirid, Cell cell2) {
String knowId = "";
String cellvalue = convertCellValueToString(cell2);
if (!StrFunc.isNull(cellvalue)) {
boolean ifKnowExist = ifKnowExist(cellvalue);
if (!ifKnowExist) {
if (column == 1) {// 第一級分組
knowId = addGroup(cellvalue, this.knowledgeSetId);
} else if (column == 4) {// 最後一級圖譜
knowId = addKnowWithName(cellvalue, dirid);
} else {
knowId = addGroup(cellvalue, dirid);
}
}
}
return knowId;
}
相關文章
- java讀取excel為物件並進行讀寫操作JavaExcel物件
- Java實現遞迴查詢樹結構Java遞迴
- 如何快速、且易懂編寫Java遞迴生成樹形選單結構Java遞迴
- 週而復始,往復迴圈,遞迴、尾遞迴演算法與無限極層級結構的探究和使用(Golang1.18)遞迴演算法Golang
- 通用-遞迴樹結構遞迴
- 資料結構-遞迴資料結構遞迴
- 一文讀懂連結串列反轉(迭代法和遞迴法)遞迴
- java從資料庫讀取選單,遞迴生成選單樹Java資料庫遞迴
- Java資料結構與演算法--遞迴和回溯Java資料結構演算法遞迴
- 二叉樹的非遞迴遍歷寫法二叉樹遞迴
- 資料結構5_遞迴資料結構遞迴
- Java實現多級選單(遞迴)Java遞迴
- C#讀取Excel方法總結C#Excel
- 【Java資料結構與演算法筆記(二)】樹的四種遍歷方式(遞迴&非遞迴)Java資料結構演算法筆記遞迴
- python 遞迴樹狀結構 和 排序Python遞迴排序
- 基礎資料結構之遞迴資料結構遞迴
- 解讀:什麼是Java的遞迴演算法?Java遞迴演算法
- excel-Spreadsheets:讀取Excel電子表格資料的Java原始碼ExcelJava原始碼
- 遞迴與回溯法遞迴
- Java - 13 方法的遞迴Java遞迴
- model 遞迴子級遞迴
- python對Excel的讀取PythonExcel
- 遞迴總結遞迴
- 資料結構和演算法:遞迴資料結構演算法遞迴
- 資料結構與演算法:遞迴資料結構演算法遞迴
- 資料結構:歸併排序(非遞迴)資料結構排序遞迴
- Laravel讀取ExcelLaravelExcel
- 資料結構與演算法讀書筆記 - 004 -C++遞迴資料結構演算法筆記C++遞迴
- python 讀寫 excelPythonExcel
- 使用Java通過POI讀取EXCEL中的資料JavaExcel
- 獲取介面引數我寫了七層 for 迴圈
- 遞迴和遞推總結遞迴
- 快取遞迴計算快取遞迴
- Java jdk8實現 部門樹的遞迴編寫JavaJDK遞迴
- Java 的 ArrayList 的底層資料結構Java資料結構
- Python實現連結串列反轉的方法【迭代法與遞迴法】Python遞迴
- js樹型結構資料簡易遞迴JS遞迴
- java poi 讀取模版excel寫入資料並保持原本單元格樣式JavaExcel