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

摘要:
packagecom.it.excel。卓越学习;importjava.io。文件输入流;importjava.io。IOException;importjava.io。输入流;导入java.util。阵列列表;导入java.util。HashMap;导入java.util。列表导入java.util。
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;
    }
}

免责声明:文章转载自《导入Excel——解析Excel——优化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇select2的多选下拉框上传MySQL基础下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

redis分布式共享锁模拟抢单的实现

本篇内容主要讲解的是redis分布式锁,并结合模拟抢单的场景来使用,内容节点如下: jedis的nx生成锁 如何删除锁 模拟抢单动作 1.jedis的nx生成锁 对于分布式锁的生成通常需要注意如下几个方面: 创建锁的策略:redis的普通key一般都允许覆盖,A用户set某个key后,B在set相同的key时同样能成功,如果是锁场景,那就无法知道到底...

C#正则表达式合并连续空格为单个空格

第一种方法:       使用 System.Text.RegularExpressions.Regex.Replace()方法   string result = String.Empty;   string str = "Just     Test the  Method";   result = Regex.Replace(str, "\s{2,}"...

关于springMVC

一 mvc设计模式 MVC 全名是 Model View Controller,是 模型(model)-视图(view)-控制器(controller) 的缩写, 是⼀种⽤于设计创建 Web 应⽤程序表现层的模式。 MVC 中每个部分各司其职:Model(模型):模型包含业务模型和数据模型,数据模型⽤于封装数据,业务模型⽤于处理业务。View(视图): 通...

Java框架之Struts2(一)

在学习Struts2之前,我们要知道Java为什么要有反射机制呢?反射机制可以说是填补Java不能动态访问某一个类的空白。利用反射机制,动态的创建一个对象。动态的访问类的某个属性,而且访问哪一个属性自己可能还不知道,只能通过有个变量进行访问。 一、反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能...

【Android】是时候为你的应用加上WebDav同步了

WebDav是什么? WebDAV (Web-based Distributed Authoring and Versioning) 一种基于HTTP1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可对Web Server直接读写,并支持写文件锁定(Locking)及解锁(...

Dozer 使用小结

目录   概述  安装  使用  Dozer支持的数据类型转换  Dozer的映射配置  参考 这篇文章是本人在阅读Dozer官方文档(5.5.1版本,官网已经一年多没更新了)的过程中,整理下来我认为比较基础的应用场景。 本文中提到的例子应该能覆盖JavaBean映射的大部分场景,希望对你有所帮助。 概述 Dozer是什么? Dozer是一个Jav...