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. 递归-PrintDigit

    static void PrintDigit(double n,int len,int count=-1) { if (n <0) { n = System.Math.Abs(n); Conso ...

  2. 【VS开发】四大图像库:OpenCV/FreeImage/CImg/CxImage

    本文转载自:http://hi.baidu.com/xiaocuiman/blog/item/6e267c2bc4b1883f5243c108.html 1.对OpenCV 的印象:功能十分的强大,而 ...

  3. 在java web 工程中实现登录和安全验证

    登录验证代码 package security; import java.io.IOException; import javax.servlet.ServletException; import j ...

  4. mysql 触发器检测表数据添加,进而调用存储过程检测数据,进而调用存储过程添加数据

    触发器: beginDECLARE user_mes INT(64);SELECT user_id into user_mes FROM order_orderlist where id = new. ...

  5. Reactor系列(十)collectMap集合

    #java#reactor#collect#hashMap# 转换成Map 视频讲解: https://www.bilibili.com/video/av80048104/ FluxMonoTestC ...

  6. go 二进制数据处理

    以下是利用标准库binary来进行编解码 编码 ①使用bytes.Buffer来存储编码生成的串②使用binary.Write来编码存储在①的buf中 package main import ( &q ...

  7. 编译+远程调试spark

    一 编译  以spark2.4 hadoop2.8.4为例 1,spark 项目根pom文件修改 pom文件新增 <profile> <id>hadoop-2.8</id ...

  8. ORACLE查询进程,并杀死

    用于存放常用SQL --查询主键在哪一列 --设置页大小 --设置行大小 col COLUMN_NAME for a20 --设置字段显示长度 col TABLE_NAME for a20 col O ...

  9. c# base64及MD5工具类

    using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Lin ...

  10. 把人都送到房子里的最小花费--最小费用最大流MCMF

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=1533 相邻的容量为inf,费用为1,S到m容量为1,费用为0 ,H到T容量为1,费用为0. 建图跑-最小费 ...