POI读取Excel表格数据

* {所需相关jar下载:
* commons-collections4-4.4.jar
* commons-compress-1.19.jar
* poi-4.1.1.jar
* poi-ooxml-4.1.1.jar
* poi-ooxml-schemas-4.1.1.jar
* }
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; /**
* @author 马家立
* @version 创建时间:2019年11月15日下午5:56:37
* @Description:TODO 读取Excel相关类
* {所需相关jar:
* commons-collections4-4.4.jar
* commons-compress-1.19.jar
* poi-4.1.1.jar
* poi-ooxml-4.1.1.jar
* poi-ooxml-schemas-4.1.1.jar
* }
*/
public class ReadExcel {
/**
* @Title:getDataFromExcel
* @author:马家立
* @date:2019年11月19日 上午10:02:22
* @Description:TODO 根据Excel的地址读取Excel表格数据
* @param filePathExcel的绝对路径
* @return Map<String,Object> {end:ok或者error;msg:错误信息原因;counts:读取条数}
*/
public static Map<String, Object> getDataFromExcel(String filePath) {
// 声明结果map
Map<String, Object> resultMap = new HashMap<String, Object>();
// 判断是否为excel类型文件
if (!filePath.endsWith(".xls") && !filePath.endsWith(".xlsx")) {
System.out.println("文件不是excel类型");
resultMap.put("end", "error");
resultMap.put("msg", "文件不是excel类型");
return resultMap;
}
// 声明文本输入流
FileInputStream fis = null;
// 声明一个新的工作簿
Workbook wookbook = null;
// 声明一个新的工作表
Sheet sheet = null;
try {
// 获取一个绝对地址的流
fis = new FileInputStream(filePath);
// 2003版本的excel,用.xls结尾, 2007版本以.xlsx
if (filePath.endsWith(".xls")) {
wookbook = new HSSFWorkbook(fis);// 得到工作簿
} else {
// XSSFWorkbook
wookbook = new XSSFWorkbook(fis);// 得到工作簿
}
// 得到第一个工作表
sheet = wookbook.getSheetAt(0);
// 得到第二个工作表
// sheet = wookbook.getSheetAt(1);
// 得到第三个工作表
// sheet = wookbook.getSheetAt(2);
// 封装处理Excel工作子表的数据
resultMap = packageDataBySheet(sheet);
} catch (Exception e) {
e.printStackTrace();
}
return resultMap;
} /**
* @Title:packageDataBySheet
* @author:马家立
* @date:2019年11月19日 上午9:55:26
* @Description:TODO 封装处理Excel工作子表的数据
* @param sheetExcel工作簿中的子表
* @return Map<String,Object> {end:ok或者error;msg:错误信息原因;counts:读取条数}
*/
public static Map<String, Object> packageDataBySheet(Sheet sheet) {
// 返回结果map
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
resultMap.put("end", "ok");
// 获得表头
Row rowHead = sheet.getRow(0);
// 获取Excel的所有行数量
int rows = sheet.getLastRowNum();
// 获取Excel的所有列数量
int lines = rowHead.getPhysicalNumberOfCells();
if (0 == rows) {
System.out.println("Excel文件内没有数据!");
resultMap.put("end", "error");
resultMap.put("msg", "Excel文件内没有数据!");
return resultMap;
}
// 读取条数
int counts = 0;
// 是否跳过读取下一行
boolean isNext = false;
// 外圈循环读取所有行:获得所有行的数据
for (int i = 0; i <= rows; i++) {
// 是否跳过读取下一行:每次初始化为false
isNext = false;
counts++;
// 获得第i行对象
Row row = sheet.getRow(i);
// 获取单元格为空则直接下一行
if (isNullAndEmpty(row)) {
continue;
}
List<String> list = new ArrayList<>();
// 内圈循环读取所有列:遍历每一行的的数据,lineNum:列数
for (int j = 0; j < lines; j++) {
// 获取该单元格相应的类型的值
String str = getRightTypeCell(row.getCell(j), i, j);
// 如果第一列为空则直接读取下一行
if (isNullAndEmpty(str) && (0 == j)) {
isNext = true;
break;
}
list.add(str);
}
// 是否跳过读取下一行
if (isNext) {
continue;
}
String str1 = list.get(0); // 参数1
// String str2 = list.get(1); // 参数2
// String str3 = list.get(2); // 参数3
// and so on...
if (i == 0) {
if ("str1".endsWith(str1)) {
System.out.println("读取的排课Excel数据格式正确");
} else {
resultMap.put("end", "error");
resultMap.put("msg", "读取的排课Excel数据格式错误!");
System.err.println("读取的排课Excel数据格式错误");
break;
}
} else {
/**
* 处理数据
*/
} }
resultMap.put("counts", counts + "");
} catch (Exception e) {
e.printStackTrace();
resultMap.put("end", "error");
resultMap.put("msg", "OperationExcel的packageDataBySheet方法异常!");
}
return resultMap;
} /**
* @Title:getRightTypeCell
* @author:马家立
* @date:2019年11月18日 下午5:37:04
* @Description:TODO 返回该单元格相应的类型的值
* @param cell一个单元格的对象
* @param rowNum行数
* @param lineNum列数
* @return
* @throws Exception
* String
*/
public static String getRightTypeCell(Cell cell, int rowNum, int lineNum) throws Exception {
// 单元格内容
String value = "";
System.out.println("rowNum:" + rowNum + "\tlineNum:" + lineNum);
// 如果单元格为空或者单元格里面的数据为空则返回
if ((cell == null) || cell.equals(null) || (cell.getCellType() == CellType.BLANK)) {
value = "";
} else {
// 判断数据类型
switch (cell.getCellType()) {
case FORMULA:
value = "" + cell.getCellFormula();
break;
case NUMERIC:
value = "" + cell.getNumericCellValue();
break;
case STRING:
value = cell.getStringCellValue();
break;
default:
break;
}
}
return value;
} /**
* @Title:isNullAndEmpty
* @author:马家立
* @date:2019年11月19日 上午10:23:49
* @Description:TODO 校验对象是否为空
* @param obj校验对象
* @return boolean
*/
public static boolean isNullAndEmpty(Object obj) {
if ((null != obj) && !"".equals(obj.toString()) && !"null".equals(obj)) {
return false;
} else {
return true;
}
} public static void main(String[] args) throws Exception {
// 读取文件地址
String file_path = "D:\\123.xlsx";
// 传路径是为了方法灵活
Map<String, Object> map = getDataFromExcel(file_path);
String end = map.get("end") + "";
System.out.println("封装处理结果:" + end);
}
}

POI读取Excel数据的更多相关文章

  1. 使用poi读取excel数据示例

    使用poi读取excel数据示例 分两种情况: 一种读取指定单元格的值 另一种是读取整行的值 依赖包: <dependency> <groupId>org.apache.poi ...

  2. Java POI读取Excel数据,将数据写入到Excel表格

    1.准备 首先需要导入poi相应的jar包,包括: 下载地址:http://pan.baidu.com/s/1bpoxdz5 所需要的包的所在位置包括: 2.读取Excel数据代码 package S ...

  3. poi——读取excel数据

    单元格类型 读取Excel数据 package com.java.test.poi; import java.io.File; import java.io.FileInputStream; impo ...

  4. POI读取Excel数据保存到数据库,并反馈给用户处理信息(导入带模板的数据)

    今天遇到这么一个需求,将课程信息以Excel的形式导入数据库,并且课程编号再数据库中不能重复,也就是我们需要先读取Excel提取信息之后保存到数据库,并将处理的信息反馈给用户.于是想到了POI读取文件 ...

  5. java 使用POI读取excel数据

    原文:http://doc.okbase.net/0201zcr/archive/161440.html 一.定义 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Ja ...

  6. Java POI 读取Excel数据转换为XML格式

    1.首先要下载poi相关的包:http://poi.apache.org/  ,以下是所需的jar包 2.贴上详细的代码 public class ExcelToXml { /** * 将excel的 ...

  7. POI 读取Excel数据

    private List<LeagueGroup> read() throws IOException{ List<LeagueGroup> leagueGroups=new ...

  8. java的poi技术读取Excel数据到MySQL

    这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...

  9. jxl读写excel, poi读写excel,word, 读取Excel数据到MySQL

    这篇blog是介绍: 1. java中的poi技术读取Excel数据,然后保存到MySQL数据中. 2. jxl读写excel 你也可以在 : java的poi技术读取和导入Excel了解到写入Exc ...

随机推荐

  1. 当微信小程序遇到AR(三)

    当微信小程序遇到AR,会擦出怎么样的火花?期待与激动...... 通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习. 本课程需要一定的基础:微信开发者工具,JavaS ...

  2. 《精通并发与Netty》学习笔记(14 - 解决TCP粘包拆包(二)Netty自定义协议解决粘包拆包)

    一.Netty粘包和拆包解决方案 Netty提供了多个解码器,可以进行分包的操作,分别是: * LineBasedFrameDecoder (换行)   LineBasedFrameDecoder是回 ...

  3. 学习笔记:CentOS7学习之十九:Linux网络管理技术

    目录 学习笔记:CentOS7学习之十九:Linux网络管理技术 本文用于记录学习体会.心得,兼做笔记使用,方便以后复习总结.内容基本完全参考学神教育教材,图片大多取材自学神教育资料,在此非常感谢MK ...

  4. Java没有引用传递机制,C#有。

    Java没有引用传递机制,C#有: public class Obj { private Integer myValue; public Integer getMyValue() { return m ...

  5. c# 金钱大写转小写工具类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. Scala当中什么是Transformation和 Action,以及它们俩的区别是什么?

    [学习笔记] 一个完整的RDD任务由两部分组成:Transformation和 Action.Transformation用于对RDD的创建,还可以把老的RDD通过Transformation来生成新 ...

  7. (十一)springMvc 异常处理

    文章目录 思路 自定义异常处理类 全局异常处理器 配置全局异常处理器 思路 在 springMvc 中,异常一层一层的往上抛,最后抛给 前端控制器,前端控制器内部会去找 全局异常处理器(一个系统只会有 ...

  8. 剑指offer16:输入两个单调递增的链表,合成后的链表满足单调不减规则。

    1 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 2 思路与方法 迭代法:两个链表中较小的头结点作为合并后头结点,之后依次合并两个链表中较小的 ...

  9. linux下mysql启动 Starting MySQL. ERROR! The server quit without updating PID file(xxx/x.pid)

    service mysql start 报错: Starting MySQL. ERROR! The server quit without updating PID file(xxx/x.pid) ...

  10. 阿里云Centos7 配置二级域名

    之前在自己的服务器上安装了laravel,现在给它个二级域名!结果发现了个小坑= =.不说了,上步骤 首先你要有个自己的域名,可以在万网上买一个,我的还是蛮便宜的... 进入你的阿里云管理台 选择云解 ...