1. package com.it.excel.excelLearn;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10.  
  11. import org.apache.poi.ss.usermodel.Cell;
  12. import org.apache.poi.ss.usermodel.CellType;
  13. import org.apache.poi.ss.usermodel.Row;
  14. import org.apache.poi.ss.usermodel.Sheet;
  15. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  16.  
  17. public class ExcelUtil {
  18. public static List<ExcelSheetStructure> readExcel(String filePath) throws IOException {
  19. InputStream is = null;
  20. XSSFWorkbook xssfWorkbook = null;
  21. List<ExcelSheetStructure> sheetsDate = null;
  22. // 流读取Excel入内存
  23. is = new FileInputStream(filePath);
  24. xssfWorkbook = new XSSFWorkbook(is);
  25. sheetsDate = new ArrayList<>();
  26. // 遍历
  27. for (Sheet sheet : xssfWorkbook) {
  28. ExcelSheetStructure sheetStructure = new ExcelSheetStructure();
  29. // 获取sheet名字
  30. String sheetName = sheet.getSheetName();
  31. sheetStructure.setSheetName(sheetName);
  32. // 获取有效数据,开始行和结束行
  33. int firstRowNum = sheet.getFirstRowNum();
  34. int lastRowNum = sheet.getLastRowNum();
  35. // 读取数据
  36. List<Map<String, Object>> notHeaderList = new ArrayList<>();
  37. for (int i = firstRowNum; i <= lastRowNum; i++) {
  38. Row row = sheet.getRow(i);
  39. if (row == null) {
  40. break;
  41. }
  42. // 处理表头一行数据
  43. if (i == firstRowNum) {
  44. Map<String, Object> headerRowMap = getHeaderRowData(row);
  45. sheetStructure.setSheetTableHeaderDate(headerRowMap);
  46. } else { // 非表头数据
  47. Row headerRow = sheet.getRow(firstRowNum);
  48. Map<String, Object> notHeaderRowMap = getNotHeaderRowData(row, headerRow);
  49. notHeaderList.add(notHeaderRowMap);
  50. }
  51. }
  52. sheetStructure.setSheetTableList(notHeaderList);
  53. // 判断当前sheet是否有数据,如果没有,就打印sheetName,否则加入Excel数据结构中
  54. if (!sheetStructure.getSheetTableList().isEmpty() && !sheetStructure.getSheetTableHeaderDate().isEmpty()) {
  55. sheetsDate.add(sheetStructure);
  56. } else {
  57. System.out.println(sheetStructure.getSheetName());
  58. }
  59. }
  60. xssfWorkbook.close();
  61. is.close();
  62. return sheetsDate;
  63. }
  64.  
  65. private static Map<String, Object> getNotHeaderRowData(Row row, Row headerRow) {
  66. Map<String, Object> rowMap = new HashMap<>();
  67. for (Cell cell : row) {
  68. /**
  69. * 设置单元格的类型是String,防止读取数据方法getStringCellValue()报错
  70. * 如果单元格中数据格式是数字类型:Cannot get a STRING value from a NUMERIC cell
  71. */
  72. cell.setCellType(CellType.STRING);
  73. String cellValue = cell.getStringCellValue();
  74. int columnIndex = cell.getColumnIndex();
  75. Cell currentHeaderCell = headerRow.getCell(columnIndex);
  76. // 存储:Map<"当前单元格对应的表头中文","当前单元格值">
  77. rowMap.put(currentHeaderCell.getRichStringCellValue().toString(), cellValue);
  78. }
  79. return rowMap;
  80.  
  81. }
  82.  
  83. private static Map<String, Object> getHeaderRowData(Row row) {
  84. Map<String, Object> headerMap = new HashMap<>();
  85. for (Cell cell : row) {
  86. cell.setCellType(CellType.STRING);
  87. String cellValue = cell.getStringCellValue();
  88. int columnIndex = cell.getColumnIndex();
  89. headerMap.put(String.valueOf(columnIndex), cellValue);
  90. }
  91. return headerMap;
  92. }
  93. }

导入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. 宏offsetof分析

    1.前言 在C语言的结构体中,由于字节对齐的问题,所以成员的地址并不能直接根据数据类型的大小进行计算,使用宏offsetof可以获得结构体成员相对于结构体首地址的字节偏移量. 2.offsetof宏实 ...

  2. Git命令之tag差异比较

    比较两个tag的区别有以下几种方式: 例如两个tag分别为v1.0. v2.0 1. git log v2.0 ^v1.0 查看v2.0上有,而v1.0上没有的部分: 2. git log v1.0. ...

  3. K8S学习笔记之Grafana App for Kubernetes的配置

    Grafana有一套针对Kubernetes监控的APP,和Grafana-Zabbix App类似,但是配置咋一看比较麻烦,主要参数都是来自K8S. 这款APP的详细介绍请参考Grafana App ...

  4. dotnet core系列之Background tasks with hosted services (后台任务)

    这篇简单讲asp.net core 中的后台任务 用到的包: Microsoft.AspNetCore.App metapackage 或者加入 Microsoft.Extensions.Hostin ...

  5. css 平行四边形

    平行四边形 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  6. 根父类:Object 类

    一.Object类 Java中规定: 如果一个类没有显式声明它的父类(即没有写extends xx),那么默认这个类的父类就是java.lang.Object. 类 Object 是类层次结构的根类. ...

  7. Socket-网络服务提供的一种机制

    网络编程 网络通信的要素 Ip,端口,协议(tcp/udp) 127.0.0.1 本机地址   默认主机名:localhost   端口号:用于标识进程的逻辑地址. 有效端口:0-65535   其中 ...

  8. Android 中自定义仪表盘

    如图: 自定义属性 values文件下添加 attrs.xml文件 <?xml version="1.0" encoding="utf-8"?> & ...

  9. maven引入oracle驱动

    下载驱动: https://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html 例如我这边是1 ...

  10. 快速了解MongoDB

    简介 MongoDB是一款为广泛的现代应用程序设计的高性能.可扩展.分布式数据库系统.MongoDB可用于不同规模大小的组织,为那些对系统低延迟.高吞吐量以及可持续性有很高要求的应用提供稳定关键的服务 ...