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——优化的更多相关文章

  1. oracle xmltype导入并解析Excel数据--前言

    通常,很多的时候,我们需要导入Excel数据到系统中,但是Excel数据需要我们去各种校验,比如身份证校验,手机号码校验等等. 校验失败的数据,提供Excel导出错误原因,提示给用户. 如此,如果校验 ...

  2. 导入Excel——解析Excel

    读取Excel 思路:先读取整个Excel,即工作簿,再依次读取其中的每个工作表Sheet,最后读取工作表内的表格. 一.读取工作簿利用流读取指定目录中的工作簿,并写入内存. /** * Constr ...

  3. oracle xmltype导入并解析Excel数据 (四)特别说明

    1.Excel导出,此处没有给出 2.错误原因在中间表,T_EXCEL_IMPORT_GENERATION,其中errormsg不为空的数据 3,中间表入库过程: 需要自己实现,为一个存储过程,存储过 ...

  4. oracle xmltype导入并解析Excel数据 (一)创建表与序

    表说明: T_EXCEL_IMPORT_DATASRC: Excel数据存储表,(使用了xmltype存储Excel数据) 部分字段说明: BUSINESSTYPE: Excel模板类型,一个Exce ...

  5. 利用 js-xlsx 实现 Excel 文件导入并解析Excel数据成json格式的数据并且获取其中某列数据

    演示效果参考如下:XML转JSON 另一个搭配SQL实现:http://sheetjs.com/sexql/index.html 详细介绍: 1.首先需要导入js <script src=&qu ...

  6. oracle xmltype导入并解析Excel数据 (三)解析Excel数据

    包声明 create or replace package PKG_EXCEL_UTILS is -- Author: zkongbai-- Create at: 2016-07-06-- Actio ...

  7. oracle xmltype导入并解析Excel数据 (二)规则说明

    规则表字段说明如下: 其中RULE_FUNC_CUSTOMIZE表示,用户自己写函数,去判断数据是否合法,存储的是函数的名字 此函数的参数只有一个,该列的值,字段类型是Varchar2, 校验失败的话 ...

  8. oracle xmltype导入并解析Excel数据 (五)中间表数据入库

    此处给出例子,具体根据业务需求 create or replace procedure P_CART_Sheet1(p_id in NUMBER) is--车辆管理功能v_str varchar2(4 ...

  9. Excel解析与导入导出

    第三次结对编程作业 结对成员: 031302610黄志鹏 031302603 陈波 功能分析 1.将初始排课表excel导入系统数据库 2.将系统数据库的排课数据显示在web界面 实现思路 一.实现将 ...

随机推荐

  1. hadoop学习之HDFS原理

    HDFS原理 HDFS包括三个组件: NameNode.DataNode.SecondaryNameNode NameNode的作用是存储元数据(文件名.创建时间.大小.权限.与block块映射关系等 ...

  2. AngularJS 的全选、反选实现

    目录 AngularJS 的全选.反选实现 一.需求 二.思路 三.实现 AngularJS 的全选.反选实现 一.需求 要使用 AngularJS 实现 checkbox 的全选.反选. 其中所有项 ...

  3. MarkDown的常规用法

    MarkDown的常规用法 标题 # 一级标题 ## 二级标题 ... ###### 六级标题 列表 第二级 - 和 空格 + 和 空额 * 和 空格 第三级 代码块 多行代码块 3个` 回车 单行代 ...

  4. Ubuntu Docker搭建GitLab以及常规配置使用

    安装启动实例 1.首先创建一个目录用于存放配置 sudo docker pull docker.io/gitlab/gitlab-ce sudo mkdir -p /root/docker/gitla ...

  5. Docker-Compose通过文件声明默认的环境变量

    写文目的 在写本文之前,我在做一个docker-compose项目,这里需要在docker-compose.yml配置中引用到宿主机的ip,然而docker-compose并没有命令行一个输入的选项, ...

  6. 另一个角度的redis--redis 可以看做是c/s架构的软件

    Redis 通信协议简单研究 redis 可以看做是c/s架构的软件,再打开一个终端输入下面的指令 https://www.cnblogs.com/nele/p/8908298.html redis ...

  7. spring cloud应用

    1.什么是注册中心 (1)就是首先有一个eureka server,服务的注册与发现的中心(2)你如果写好了一个服务,就可以将其注册到eureka server上去(3)然后别人的服务如果要调用你的服 ...

  8. InstantiationAwareBeanPostProcessor 分析

    Cglib之Enhancer创建动态代理https://blog.csdn.net/yaomingyang/article/details/82762697 https://blog.csdn.net ...

  9. MVC伪静态路由简单搭配

      public static void RegisterRoutes(RouteCollection routes)         {             routes.IgnoreRoute ...

  10. 象棋中“车”的攻击范围_Java

    代码如下: String[][] a = new String[8][8]; int h, l; Scanner scan = new Scanner(System.in); System.out.p ...