Maven 引入POI

        <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.13</version>
</dependency> <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.13</version>
</dependency> <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.13</version>
</dependency>

excel 工具类

package com.iris.controller.hello;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map; /**
* @author
* @date Created in 2018/5/2
* @see
*/
public class PoiExcelUtil { private static DataFormatter formatter = new DataFormatter(); /**
* 合并单元格值
*
* @param sheet
* @param cell
* @param excelMap
*/
public static void getMergedRegionValue(Sheet sheet, Cell cell, Map<String, Object> excelMap) {
// 获得一个 sheet 中合并单元格的数量
int sheetmergerCount = sheet.getNumMergedRegions();
// 便利合并单元格
for (int i = 0; i < sheetmergerCount; i++) {
// 获得合并单元格
CellRangeAddress ca = sheet.getMergedRegion(i);
// 获得合并单元格的起始行, 结束行, 起始列, 结束列
int firstC = ca.getFirstColumn();
int firstR = ca.getFirstRow(); if (cell.getColumnIndex() == firstC && cell.getRowIndex() == firstR) {
System.out.println("第" + (cell.getRowIndex() + 1) + "行 第" + (cell.getColumnIndex() + 1) + "列 的内容是: "
+ getCellValue(cell));
excelMap.put((cell.getRowIndex() + 1) + "-" + (cell.getColumnIndex() + 1), getCellValue(cell));
} }
} /**
* 判断是否在合并单元格
*
* @param sheet
* @param cell
* @return
*/
public static boolean isMergedRegion(Sheet sheet, Cell cell) {
// 得到一个sheet中有多少个合并单元格
int sheetMergerCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergerCount; i++) {
// 具体的合并单元格
CellRangeAddress ca = sheet.getMergedRegion(i);
// 合并单元格的起始列, 结束列;起始行, 结束行。
int firstC = ca.getFirstColumn();
int lastC = ca.getLastColumn();
int firstR = ca.getFirstRow();
int lastR = ca.getLastRow();
// 判断该单元格是否在合并单元格范围之内, 如果是, 则返回 true
if ((cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) && (cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR)) {
return true;
}
}
return false;
} /**
* @param filePath 文件路径
* @param sheetIndex sheet
* @param startRowIndex 开始行(不包含)
* @return
*/
private static Map<String, Object> getExcelValue(String filePath, int sheetIndex, int startRowIndex) {
//保存解析的值 key: 行-列
Map<String, Object> excelMap = new LinkedHashMap<>();
try {
// 创建对Excel工作簿文件
Workbook book = null;
try {
//.xlsx 2007版本+
book = new XSSFWorkbook(new FileInputStream(filePath));
} catch (Exception ex) {
//.xls 2003版本
book = new HSSFWorkbook(new FileInputStream(filePath));
}
//读取sheet页
Sheet sheet = book.getSheetAt(sheetIndex);
// 获取到Excel文件中的所有行数
int rows = sheet.getPhysicalNumberOfRows();
for (int i = startRowIndex; i < rows; i++) {
// 读取单元格
Row row = sheet.getRow(i);
if (row != null) {
// 获取到Excel文件中的所有的列
int cells = row.getPhysicalNumberOfCells();
for (int j = 0; j < cells; j++) {
// 获取到列的值
Cell cell = row.getCell(j);
if (cell != null) {
if (isMergedRegion(sheet, cell)) {
getMergedRegionValue(sheet, cell, excelMap);
} else {
System.out.println("第" + (i + 1) + "行 第" + (j + 1) + "列 的内容是: " + getCellValue(cell));
excelMap.put((i + 1) + "-" + (j + 1), getCellValue(cell));
} }
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return excelMap;
} /**
* 获取 cell 值
*
* @param cell
* @return
*/
private static String getCellValue(Cell cell) {
return formatter.formatCellValue(cell);
} public static void main(String[] args) throws Exception {
String file = "E://excel.xlsx";
Map<String, Object> excelValue = getExcelValue(file, 0, 0);
for (Map.Entry<String, Object> entry : excelValue.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
}

输出结果

第1行 第1列 的内容是: 品牌
第1行 第2列 的内容是: 车系
第1行 第3列 的内容是: 车型
第1行 第4列 的内容是: 车款
第1行 第5列 的内容是: 价格(万元)
第1行 第6列 的内容是: 首付比例
第2行 第1列 的内容是: 路虎
第2行 第2列 的内容是: 星脉
第2行 第3列 的内容是: L560 2.0P
第2行 第4列 的内容是: 2.0P AWD SWB S
第2行 第5列 的内容是: 399
第2行 第6列 的内容是: 20%
第3行 第1列 的内容是: 路虎
第3行 第2列 的内容是: 进EV
第3行 第3列 的内容是: Range Rover Evoque
第3行 第4列 的内容是: 敞篷版 2.0L P Convertible 4WD HSE Dynamic 2017款
第3行 第5列 的内容是: 599
第3行 第6列 的内容是: 25%
1-1:品牌
1-2:车系
1-3:车型
1-4:车款
1-5:价格(万元)
1-6:首付比例
2-1:路虎
2-2:星脉
2-3:L560 2.0P
2-4:2.0P AWD SWB S
2-5:399
2-6:20%
3-1:路虎
3-2:进EV
3-3:Range Rover Evoque
3-4:敞篷版 2.0L P Convertible 4WD HSE Dynamic 2017款
3-5:599
3-6:25%

POI Excel解析的更多相关文章

  1. Apache Poi实现excel解析

    一.说明 1.本文通过使用 poi 工具解析 excel 表格数据,实现导入导出 2.excel目前有两种格式 2003版本的 excel.xls 与 2007版本的 excel.xlsx ,注意两种 ...

  2. Excel解析easyexcel工具类

    Excel解析easyexcel工具类 easyexcel解决POI解析Excel出现OOM <!-- https://mvnrepository.com/artifact/com.alibab ...

  3. Excel解析工具easyexcel全面探索

    1. Excel解析工具easyexcel全面探索 1.1. 简介 之前我们想到Excel解析一般是使用POI,但POI存在一个严重的问题,就是非常消耗内存.所以阿里人员对它进行了重写从而诞生了eas ...

  4. Android EXCEL 解析 xls 和 xlsx,方法其实很简单

    前言 Excel 解析,一般来说是在服务端进行的,但是如果移动端要实现解析Excel的功能,那也是有实现的方法的. 不过由于Android 原生用Java/Kotlin实现,所以也可以参考服务端解析E ...

  5. [C#] NPOI Excel解析

    通过NPOI解析Excel,将数据保存到DataTable中. #region excel解析 public DataTable ImportExcelFile(string filePath) { ...

  6. Java将Excel解析为数组集合

    Java将Excel解析为数组集合 相关 jar 包: jxl-2.6.jar jar 包下载:http://files.cnblogs.com/files/liaolongjun/excel-jar ...

  7. poi 升级至4.x 的问题总结(POI Excel 单元格内容类型判断并取值)

    POI Excel 单元格内容类型判断并取值 以前用 cell.getCachedFormulaResultType() 得到 type 升级到4后获取不到了 换为:cell.getCellType( ...

  8. POI Excel 合并数据相同的行

    import java.io.Serializable; /** * POI Excel报表导出,列合并实体<br> * * @author WQ * */ public class Po ...

  9. 导入Excel——解析Excel

    读取Excel 思路:先读取整个Excel,即工作簿,再依次读取其中的每个工作表Sheet,最后读取工作表内的表格. 一.读取工作簿利用流读取指定目录中的工作簿,并写入内存. /** * Constr ...

随机推荐

  1. PHP选项和运行

    PHP运行模式 五大运行模式 1.cgi 通用网关接口 2.fast-cgi cgi升级 3.cli (Command Line Interface) 4.isapi 微软提供的面向Internet服 ...

  2. vue 路由导航白话全解析

    这里先放上官网的教程和说明:点击这里,vue导航守卫官方文档 路由守卫 路由守卫说白了就是路由拦截,在地址栏跳转之前 之后 跳转的瞬间 干什么事 全局守卫 全局守卫顾名思义,就是全局的,整个项目所有路 ...

  3. 使用Lazy对构造进行重构后比较

    用于测试在是否使用Lazy 的情况下,服务器负载,及服务提供情况对比.     服务器环境:   在此机器上安装了1 Hyper-V ,分配走1G内存,同时在本地上安装 SQLServer ,   在 ...

  4. perl中一些模块的ubuntu中依赖包

    GD 先更新系统中的依赖包: sudo apt-get update sudo apt-get upgrade 进入 cpan> install GD 会提示没有安装libgd模块. 所以,先需 ...

  5. rest-assured的JsonPath使用方法总结

    JsonPath对于解析Json格式的数据来说非常简单,比如有下面这样的Json数据: {"lotto":{ "lottoId":5, "winnin ...

  6. D. Magic Gems(矩阵快速幂 || 无敌杜教)

    https://codeforces.com/contest/1117/problem/D 题解:有一些魔法宝石,魔法宝石可以分成m个普通宝石,每个宝石(包括魔法宝石)占用1个空间,让你求占用n个空间 ...

  7. 1149 Dangerous Goods Packaging (25 分)

    When shipping goods with containers, we have to be careful not to pack some incompatible goods into ...

  8. PIE SDK地图放大镜

    放大镜,在地图的浏览过程中在主地图和次地图中起到很好的辅助作用, 要实现放大镜功能主要就是通过两个mapControl控件,主地图控件是mapControlMain,放大镜控件是UserControl ...

  9. BENZ Prognosis System C5 SD Be connected & Panasonic Xentry-Tab

    Brand-new released!! Recently, we all autonumen website gives a brand-new Superstar prognosis bundle ...

  10. UI设计师与VI设计师的区别

    企业视觉形象(CorporateVisualImage)与企业视觉形象识别(VI)并不是一个概念.前者是企业与生俱来的客观存在要素,也就是说一个企业无论是否制定了它的VI,也无论其所制定的VI是否成功 ...