• 导入Excel——解析Excel——优化


    package com.it.excel.excelLearn;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellType;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    public class ExcelUtil {
        public static List<ExcelSheetStructure> readExcel(String filePath) throws IOException {
            InputStream is = null;
            XSSFWorkbook xssfWorkbook = null;
            List<ExcelSheetStructure> sheetsDate = null;
            // 流读取Excel入内存
            is = new FileInputStream(filePath);
            xssfWorkbook = new XSSFWorkbook(is);
            sheetsDate = new ArrayList<>();
            // 遍历
            for (Sheet sheet : xssfWorkbook) {
                ExcelSheetStructure sheetStructure = new ExcelSheetStructure();
                // 获取sheet名字
                String sheetName = sheet.getSheetName();
                sheetStructure.setSheetName(sheetName);
                // 获取有效数据,开始行和结束行
                int firstRowNum = sheet.getFirstRowNum();
                int lastRowNum = sheet.getLastRowNum();
                // 读取数据
                List<Map<String, Object>> notHeaderList = new ArrayList<>();
                for (int i = firstRowNum; i <= lastRowNum; i++) {
                    Row row = sheet.getRow(i);
                    if (row == null) {
                        break;
                    }
                    // 处理表头一行数据
                    if (i == firstRowNum) {
                        Map<String, Object> headerRowMap = getHeaderRowData(row);
                        sheetStructure.setSheetTableHeaderDate(headerRowMap);
                    } else { // 非表头数据
                        Row headerRow = sheet.getRow(firstRowNum);
                        Map<String, Object> notHeaderRowMap = getNotHeaderRowData(row, headerRow);
                        notHeaderList.add(notHeaderRowMap);
                    }
                }
                sheetStructure.setSheetTableList(notHeaderList);
                // 判断当前sheet是否有数据,如果没有,就打印sheetName,否则加入Excel数据结构中
                if (!sheetStructure.getSheetTableList().isEmpty() && !sheetStructure.getSheetTableHeaderDate().isEmpty()) {
                    sheetsDate.add(sheetStructure);
                } else {
                    System.out.println(sheetStructure.getSheetName());
                }
            }
            xssfWorkbook.close();
            is.close();
            return sheetsDate;
        }
    
        private static Map<String, Object> getNotHeaderRowData(Row row, Row headerRow) {
            Map<String, Object> rowMap = new HashMap<>();
            for (Cell cell : row) {
                /**
                 * 设置单元格的类型是String,防止读取数据方法getStringCellValue()报错
                 * 如果单元格中数据格式是数字类型:Cannot get a STRING value from a NUMERIC cell
                 */
                cell.setCellType(CellType.STRING);
                String cellValue = cell.getStringCellValue();
                int columnIndex = cell.getColumnIndex();
                Cell currentHeaderCell = headerRow.getCell(columnIndex);
                // 存储:Map<"当前单元格对应的表头中文","当前单元格值">
                rowMap.put(currentHeaderCell.getRichStringCellValue().toString(), cellValue);
            }
            return rowMap;
    
        }
    
        private static Map<String, Object> getHeaderRowData(Row row) {
            Map<String, Object> headerMap = new HashMap<>();
            for (Cell cell : row) {
                cell.setCellType(CellType.STRING);
                String cellValue = cell.getStringCellValue();
                int columnIndex = cell.getColumnIndex();
                headerMap.put(String.valueOf(columnIndex), cellValue);
            }
            return headerMap;
        }
    }
  • 相关阅读:
    IOC / AOP
    Volatile
    观察者模式
    Gang Of Four的23中设计模式
    适配器模式
    享元模式
    设计模式
    B树和B+树
    Java内存模型(JMM)
    【Java的IO流之文件字符输入输出流 25】
  • 原文地址:https://www.cnblogs.com/gzhcsu/p/11123939.html
Copyright © 2020-2023  润新知