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. HTML基础(一)基本语法知识

    HTML 基本文档 <!DOCTYPE html> <html> <head> <title>文档标题</title> </head& ...

  2. java8新特性七-Date Time API

    Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: 非线程安全 − java.ut ...

  3. 【C++】C++中基类的析构函数为什么要用virtual虚析构函数?

    正面回答: 当基类的析构函数不是虚函数,并且基类指针指向一个派生类对象,然后通过基类指针来删除这个派生类对象时,如果基类的析构函数不是虚析构函数,那么派生类的析构函数就不会被调用,从而产生内存泄漏 # ...

  4. CentOS7-部署测试Apollo

    linux部署apollo环境要求:jdk1.8.mysql5.7 centos7安装jdk1.8跟mysql5.7可以参考我这两篇文章 https://www.cnblogs.com/reasonz ...

  5. [转帖]Linux日志文件utmp、wtmp、lastlog、messages

    Linux日志文件utmp.wtmp.lastlog.messages https://www.cnblogs.com/zhuiluoyu/p/6874255.html 1.有关当前登录用户的信息记录 ...

  6. [转帖]PostgreSQL 参数调整(性能优化)

    PostgreSQL 参数调整(性能优化) https://www.cnblogs.com/VicLiu/p/11854730.html 知道一个 shared_pool 文章写的挺好的 还没仔细看 ...

  7. Lua函数声明与调用

    lua编程中,我们经常也会遇到函数的声明定义和调用. [1]lua中函数定义与调用的方法 lua有两种函数定义和调用的方法(本质都是用属性,方式不同而已): (1)点号形式 (2)冒号形式 两种方法的 ...

  8. Sitecore 8.2 工作流程

    假设您的新Sitecore项目的所有开发都已完成.现在的下一步是在网站上填写内容并准备上线.客户通知您他们希望使用专门的网站管理员团队负责整个内容管理流程,并要求您为他们准备实例以便能够执行此操作. ...

  9. 62 网络编程(三)——UDP编程

    UDP编程标准步骤 服务器端 使用DatagramSocket创建服务端:DatagramSocket server = new DatagramSocket(port);//参数为自定义端口号 准备 ...

  10. java中什么是接口

    一.什么是接口 接口就是一个规范,类似于硬件上面的接口,在电脑主板上的PCI插槽的规范就类似于Java接口,只要是遵循PCI接口的卡,不过是什么牌子的都可以插入到PCI插槽中.所以接口就是一个规范.接 ...