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. 贪心 --- Y2K Accounting Bug

    Y2K Accounting Bug Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9691   Accepted: 483 ...

  2. 利用Travis IC实现Hexo博客自动化部署

    1.Hexo博客的利与弊 Hexo中文 我就默认为看到这篇文章的人都比较了解Hexo博客,也都能够成功手动部署吧.所以第一部分推荐两篇文章一笔带过,让我们快速进入本文的重点内容.实在不知道也不要方先看 ...

  3. 百度前端技术学院task16源代码

    欢迎访问我的github:huanshen 做这道题目的时候遇到了很多困难. 1.怎么给空对象添加数据,愣是不知道从哪里下手:遍历对象,一个个输出操作: 2.中英文的正则表达式不知道,赶紧去百度: 3 ...

  4. - Gradle 翻译 Analyzer APK文件分析 MD

    目录 目录 APK文件分析 使用 APK 分析器分析您的编译版本 查看文件和大小信息 查看 AndroidManifest.xml 查看 DEX 文件 过滤DEX文件树视图 加载 Proguard 映 ...

  5. 【mysql】mysql5.7支持的json字段查询【mybatis】

    mysql5.7支持的json字段查询 参考:https://www.cnblogs.com/ooo0/p/9309277.html 参考:https://www.cnblogs.com/pfdltu ...

  6. 【mysql】 mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件 【mybatis】count 统计+JSON查询

    mybatis实现 主从表 left join  1:n 一对多 分页查询   主表从表都有查询条件+count 需求: ======================================= ...

  7. Spring Security OAuth2.0 - AuthorizationServer和ResourceServer分离

    <Spring Security实现OAuth2.0授权服务 - 基础版>和<Spring Security实现OAuth2.0授权服务 - 进阶版>两篇文章中介绍如何搭建OA ...

  8. net start mysql 失败提示“NET HELPMSG 3534”

    lz使用的window系统8.0.16版本的mysql,以下四步解决如上问题: 1. mysqld -remove 2. mysqld --initialize 3.mysqld -install(m ...

  9. 从 Vue 的视角学 React(四)—— 组件传参

    组件化开发的时候,参数传递是非常关键的环节 哪些参数放在组件内部管理,哪些参数由父组件传入,哪些状态需要反馈给父组件,都需要在设计组件的时候想清楚 但实现这些交互的基础,是明白组件之间参数传递的方式, ...

  10. 英语rubyspinel红尖晶石rubyspinel单词

    红尖晶石(rubyspinel或Red spinel)其红色是因含铬而致^像红宝石和红色石榴子石一样,红 尖晶石也曾被叫作红玉,这就造成了红色宝石的混乱,因为世界上一些最大的著名“红宝 石”,如英国王 ...