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. Android的开机启动流程

    1.Android的开机启动流程 Android的层次框架图,如下所示: 图片清晰地展示了Android的五层架构,从上到下依次是:应用层.应用框架层.库层.运行时层以及Linux内核层.Androi ...

  2. scrapy中间件中发送邮件

    背景介绍:之前写过通过通过scrapy的扩展发送邮件,在爬虫关闭的时候发送邮件.那个时候有个问题就是MailSender对象需要return出去.这次需要在中间件中发送邮件,但是中间件中不能随便使用r ...

  3. 2、word插入目录、图/表

    一.word插入目录 依次对每个标题在“段落”中进行大纲级别选择. 光标定位于目录生成的页面,再“引用”->“目录”->选择“自动目录1/2”,则可自动生成目录.若目录有所更改,则可选择“ ...

  4. JavaSE 笔试题: 自增变量

    JavaSE 笔试题 自增变量 public class Test { public static void main(String[] args) { int i = 1; i = i++; int ...

  5. [转帖]iostat 命令详解

    iostat 命令详解 https://www.jianshu.com/p/5fed8be1b6e8 概述 iostat 主要用于输出磁盘IO 和 CPU的统计信息. iostat属于sysstat软 ...

  6. 25个强大的CSS代码,据说这些是开发者经常遇到比较棘手的代码

    这些代码是经常用到的,比方说一些特殊的效果,圆角边框,CSS透明度,梯形环绕,CSS小三角等,希望对你有用 1简单又好的 Blockquote 样式 CSS代码如下 blockquote { back ...

  7. 【转载】数字IC设计流程及开发工具

    原文链接:https://www.zhihu.com/question/28322269/answer/42048070 Design Flow &amp;lt;img src="h ...

  8. Dart面向对象编程(一)

    基本内容概述: 类与对象: 计算属性: void main(){ var rect = new Rectangle(); rect.width = 20; rect.height = 10; prin ...

  9. Python协程深入理解(转)

    原文:https://www.cnblogs.com/zhaof/p/7631851.html 从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数.yield在协程中的用法: 在协 ...

  10. Docker 运行 MySQL,使用 docker-compose

    目录结构 . │ .env │ docker-compose.yml │ └─mysql ├─config │ my.cnf │ └─data mysql 目录下的 data 为数据目录,mysql ...