导入Excel——解析Excel——优化
- 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——优化的更多相关文章
- oracle xmltype导入并解析Excel数据--前言
通常,很多的时候,我们需要导入Excel数据到系统中,但是Excel数据需要我们去各种校验,比如身份证校验,手机号码校验等等. 校验失败的数据,提供Excel导出错误原因,提示给用户. 如此,如果校验 ...
- 导入Excel——解析Excel
读取Excel 思路:先读取整个Excel,即工作簿,再依次读取其中的每个工作表Sheet,最后读取工作表内的表格. 一.读取工作簿利用流读取指定目录中的工作簿,并写入内存. /** * Constr ...
- oracle xmltype导入并解析Excel数据 (四)特别说明
1.Excel导出,此处没有给出 2.错误原因在中间表,T_EXCEL_IMPORT_GENERATION,其中errormsg不为空的数据 3,中间表入库过程: 需要自己实现,为一个存储过程,存储过 ...
- oracle xmltype导入并解析Excel数据 (一)创建表与序
表说明: T_EXCEL_IMPORT_DATASRC: Excel数据存储表,(使用了xmltype存储Excel数据) 部分字段说明: BUSINESSTYPE: Excel模板类型,一个Exce ...
- 利用 js-xlsx 实现 Excel 文件导入并解析Excel数据成json格式的数据并且获取其中某列数据
演示效果参考如下:XML转JSON 另一个搭配SQL实现:http://sheetjs.com/sexql/index.html 详细介绍: 1.首先需要导入js <script src=&qu ...
- oracle xmltype导入并解析Excel数据 (三)解析Excel数据
包声明 create or replace package PKG_EXCEL_UTILS is -- Author: zkongbai-- Create at: 2016-07-06-- Actio ...
- oracle xmltype导入并解析Excel数据 (二)规则说明
规则表字段说明如下: 其中RULE_FUNC_CUSTOMIZE表示,用户自己写函数,去判断数据是否合法,存储的是函数的名字 此函数的参数只有一个,该列的值,字段类型是Varchar2, 校验失败的话 ...
- oracle xmltype导入并解析Excel数据 (五)中间表数据入库
此处给出例子,具体根据业务需求 create or replace procedure P_CART_Sheet1(p_id in NUMBER) is--车辆管理功能v_str varchar2(4 ...
- Excel解析与导入导出
第三次结对编程作业 结对成员: 031302610黄志鹏 031302603 陈波 功能分析 1.将初始排课表excel导入系统数据库 2.将系统数据库的排课数据显示在web界面 实现思路 一.实现将 ...
随机推荐
- 宏offsetof分析
1.前言 在C语言的结构体中,由于字节对齐的问题,所以成员的地址并不能直接根据数据类型的大小进行计算,使用宏offsetof可以获得结构体成员相对于结构体首地址的字节偏移量. 2.offsetof宏实 ...
- Git命令之tag差异比较
比较两个tag的区别有以下几种方式: 例如两个tag分别为v1.0. v2.0 1. git log v2.0 ^v1.0 查看v2.0上有,而v1.0上没有的部分: 2. git log v1.0. ...
- K8S学习笔记之Grafana App for Kubernetes的配置
Grafana有一套针对Kubernetes监控的APP,和Grafana-Zabbix App类似,但是配置咋一看比较麻烦,主要参数都是来自K8S. 这款APP的详细介绍请参考Grafana App ...
- dotnet core系列之Background tasks with hosted services (后台任务)
这篇简单讲asp.net core 中的后台任务 用到的包: Microsoft.AspNetCore.App metapackage 或者加入 Microsoft.Extensions.Hostin ...
- css 平行四边形
平行四边形 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 根父类:Object 类
一.Object类 Java中规定: 如果一个类没有显式声明它的父类(即没有写extends xx),那么默认这个类的父类就是java.lang.Object. 类 Object 是类层次结构的根类. ...
- Socket-网络服务提供的一种机制
网络编程 网络通信的要素 Ip,端口,协议(tcp/udp) 127.0.0.1 本机地址 默认主机名:localhost 端口号:用于标识进程的逻辑地址. 有效端口:0-65535 其中 ...
- Android 中自定义仪表盘
如图: 自定义属性 values文件下添加 attrs.xml文件 <?xml version="1.0" encoding="utf-8"?> & ...
- maven引入oracle驱动
下载驱动: https://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html 例如我这边是1 ...
- 快速了解MongoDB
简介 MongoDB是一款为广泛的现代应用程序设计的高性能.可扩展.分布式数据库系统.MongoDB可用于不同规模大小的组织,为那些对系统低延迟.高吞吐量以及可持续性有很高要求的应用提供稳定关键的服务 ...