如何解析读取excel数据
简介
前段时间完成了一个输出excel的任务,感觉挺开心的,用的就是Apache POI的jar包,Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。其中
源码
package com.excel; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; 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; /**
*
* @描述:测试excel读取
*
* 导入的jar包
*
* poi-3.17-beta1.jar
*
* poi-examples-3.17-beta1.jar
*
* poi-excelant-3.17-beta1.jar
*
* poi-ooxml-3.17-beta1.jar
*
* poi-ooxml-schemas-3.17-beta1.jar
*
* poi-scratchpad-3.17-beta1.jar
*
* jar包官网下载地址:http://poi.apache.org/download.html
*
* poi-bin-3.17-beta1-20170701.zip
*/ public class ImportExcel
{ /** 总行数 */ private int totalRows = 0; /** 总列数 */ private int totalCells = 0; /** 错误信息 */ private String errorInfo; /** 构造方法 */ public ImportExcel()
{ } /**
*
* @描述:得到总行数
*
* @参数:@return
*
* @返回值:int
*/ public int getTotalRows()
{ return totalRows; } /**
*
* @描述:得到总列数
*
* @参数:@return
*
* @返回值:int
*/ public int getTotalCells()
{ return totalCells; } /**
*
* @描述:得到错误信息
*
* @参数:@return
*
* @返回值:String
*/ public String getErrorInfo()
{ return errorInfo; } /**
*
* @描述:验证excel文件
*
* @参数:@param filePath 文件完整路径
*
* @参数:@return
*
* @返回值:boolean
*/ public boolean validateExcel(String filePath)
{ /** 检查文件名是否为空或者是否是Excel格式的文件 */ if (filePath == null || !(WDWUtil.isExcel2003(filePath) || WDWUtil.isExcel2007(filePath)))
{ errorInfo = "文件名不是excel格式"; return false; } /** 检查文件是否存在 */ File file = new File(filePath); if (file == null || !file.exists())
{ errorInfo = "文件不存在"; return false; } return true; } /**
*
* @描述:根据文件名读取excel文件
*
* @参数:@param filePath 文件完整路径
*
* @参数:@return
*
* @返回值:List
*/ public List<List<String>> read(String filePath)
{ List<List<String>> dataLst = new ArrayList<List<String>>(); InputStream is = null; try
{ /** 验证文件是否合法 */ if (!validateExcel(filePath))
{ System.out.println(errorInfo); return null; } /** 判断文件的类型,是2003还是2007 */ boolean isExcel2003 = true; if (WDWUtil.isExcel2007(filePath))
{ isExcel2003 = false; } /** 调用本类提供的根据流读取的方法 */ File file = new File(filePath); is = new FileInputStream(file); dataLst = read(is, isExcel2003); is.close(); }
catch (Exception ex)
{ ex.printStackTrace(); }
finally
{ if (is != null)
{ try
{ is.close(); }
catch (IOException e)
{ is = null; e.printStackTrace(); } } } /** 返回最后读取的结果 */ return dataLst; } /**
*
* @描述:根据流读取Excel文件
*
* @参数:@param inputStream
*
* @参数:@param isExcel2003
*
* @参数:@return
*
* @返回值:List
*/ public List<List<String>> read(InputStream inputStream, boolean isExcel2003)
{ List<List<String>> dataLst = null; try
{ /** 根据版本选择创建Workbook的方式 */ Workbook wb = null; if (isExcel2003)
{
wb = new HSSFWorkbook(inputStream);
}
else
{
wb = new XSSFWorkbook(inputStream);
}
dataLst = read(wb); }
catch (IOException e)
{ e.printStackTrace(); } return dataLst; } /**
*
* @描述:读取数据
*
* @参数:@param Workbook
*
* @参数:@return
*
* @返回值:List<List<String>>
*/ private List<List<String>> read(Workbook wb)
{ List<List<String>> dataLst = new ArrayList<List<String>>(); /** 得到第一个shell */ Sheet sheet = wb.getSheetAt(0); /** 得到Excel的行数 */ this.totalRows = sheet.getPhysicalNumberOfRows(); /** 得到Excel的列数 */ if (this.totalRows >= 1 && sheet.getRow(0) != null)
{ this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells(); } /** 循环Excel的行 */ for (int r = 0; r < this.totalRows; r++)
{ Row row = sheet.getRow(r); if (row == null)
{ continue; } List<String> rowLst = new ArrayList<String>(); /** 循环Excel的列 */ for (int c = 0; c < this.getTotalCells(); c++)
{ Cell cell = row.getCell(c); String cellValue = ""; if (null != cell)
{
// 以下是判断数据的类型
switch (cell.getCellType())
{
case HSSFCell.CELL_TYPE_NUMERIC: // 数字
cellValue = cell.getNumericCellValue() + "";
break; case HSSFCell.CELL_TYPE_STRING: // 字符串
cellValue = cell.getStringCellValue();
break; case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
cellValue = cell.getBooleanCellValue() + "";
break; case HSSFCell.CELL_TYPE_FORMULA: // 公式
cellValue = cell.getCellFormula() + "";
break; case HSSFCell.CELL_TYPE_BLANK: // 空值
cellValue = "";
break; case HSSFCell.CELL_TYPE_ERROR: // 故障
cellValue = "非法字符";
break; default:
cellValue = "未知类型";
break;
}
} rowLst.add(cellValue); } /** 保存第r行的第c列 */ dataLst.add(rowLst); } return dataLst; } /**
*
* @描述:main测试方法
*
* @参数:@param args
*
* @参数:@throws Exception
*
* @返回值:void
*/ public static void main(String[] args) throws Exception
{ ImportExcel poi = new ImportExcel(); List<List<String>> list = poi.read("D:/user.xls"); if (list != null)
{ for (int i = 0; i < list.size(); i++)
{ System.out.print("第" + (i) + "行"); List<String> cellList = list.get(i); for (int j = 0; j < cellList.size(); j++)
{ //System.out.print(" 第" + (j + 1) + "列值:"); System.out.print(" "+cellList.get(j)); } System.out.println();
} } } }
package com.excel; /**
*
* @描述:工具类
*
*/ class WDWUtil
{ /**
*
* @描述:是否是2003的excel,返回true是2003
*
* @参数:@param filePath 文件完整路径
*
* @参数:@return
*
* @返回值:boolean
*/ public static boolean isExcel2003(String filePath)
{ return filePath.matches("^.+\\.(?i)(xls)$"); } /**
*
* @描述:是否是2007的excel,返回true是2007
*
* @参数:@param filePath 文件完整路径
*
* @参数:@return
*
* @返回值:boolean
*/ public static boolean isExcel2007(String filePath)
{ return filePath.matches("^.+\\.(?i)(xlsx)$"); } }
运行结果


说明
之所以使用了HSSF,又使用了XSSF,是为了兼容性。
使用HSSF读取Excel2003以前(包括2003)的版本,使用XSSF读取Excel2007的版本。
XSSF和HSSF虽然在不同的包里,但却引用了同一接口Workbook,于是想到了这样的读取方法。
/** 根据版本选择创建Workbook的方式 */
Workbook wb = null;
if (isExcel2003)
{
wb = new HSSFWorkbook(inputStream);
}
else
{
wb = new XSSFWorkbook(inputStream);
}
如何解析读取excel数据的更多相关文章
- Java读取Excel数据
Java读取Excel数据,解析文本并格式化输出 Java读取Excel数据,解析文本并格式化输出 Java读取Excel数据,解析文本并格式化输出 下图是excel文件的路径和文件名 下图是exce ...
- poi——读取excel数据
单元格类型 读取Excel数据 package com.java.test.poi; import java.io.File; import java.io.FileInputStream; impo ...
- java的poi技术读取Excel数据到MySQL
这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...
- .NET读取Excel数据,提示错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序
解决.NET读取Excel数据时,提示错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序的操作: 1. 检查本机是否安装Office Access,如果未安装去去h ...
- oledbdataadapter 读取excel数据时,有的单元格内容不能读出
表现:excel中某列中,有的单元格左上角有绿色箭头标志,有的没有,c#编写读取程序,但是只能读取出带绿色箭头的单元格中的内容,其余不带的读取不到内容 原因:excel中单元格因为是文本格式而存储了数 ...
- Openxml入门---Openxm读取Excel数据
Openxml读取Excel数据: 有些问题,如果当Cell 里面是 日期和浮点型的话,对应的Cell.DataType==Null,对应的时间会转换为一个浮点型,对于这块可以通过DateTime.F ...
- C# 读取EXCEL数据
/// <summary> /// 读取EXCEL数据 /// </summary> /// <param name="Path">< ...
- JAVA反射机制示例,读取excel数据映射到JAVA对象中
import java.beans.PropertyDescriptor; import java.io.File; import java.io.FileInputStream; import ja ...
- Python读取Excel数据并根据列名取值
一直想将自己接触到的东西梳理一遍,可就是迈不出第一步,希望从这篇总结开始不要再做行动的矮人了. 最近测试过程中需要用到python读取excel用例数据,于是去了解和学习了下xlrd库,这里只记录使用 ...
随机推荐
- iOS服务器证书不受信任的解决版本
参考文章链接: https://www.cnblogs.com/v-jing/p/6008964.html http://www.cocoachina.com/ios/20151021/13722.h ...
- deque Comparison of Queue and Deque methods Comparison of Stack and Deque methods
1. 队列queue和双端队列deque的转换 Queue Method Equivalent Deque Methodadd(e) addLast(e)offer(e) offerLast(e)re ...
- Cache replacement policies 缓存实现算法
Cache replacement policies - Wikipedia https://en.wikipedia.org/wiki/Cache_replacement_policies Cach ...
- Metasploit services
漏洞挖掘/漏洞分析-- Cve.mitre.org www.corelan.be----geek of pentesters http://wrox.cn/article/100048133/ ...
- pandas3
转自:http://python.jobbole.com/81212/ 介绍 也许大多数人都有在Excel中使用数据透视表的经历,其实Pandas也提供了一个类似的功能,名为 pivot_table. ...
- webview与js交互(转)
原文:http://www.cnblogs.com/vanezkw/archive/2012/07/02/2572799.html 对于android初学者应该都了解webView这个组件.之前我也是 ...
- 解决SQL Server管理器无法连接远程数据库的问题(转)
add by zhj: 本文最后那个数据库别名没搞明白,在我的测试中没有建别名,是可以的.远程登陆时,服务器名称: 服务器IP,端口号 (如223.42.155.248,52134 如果是默认端口号1 ...
- java获取屏幕密度
方法1: float xdpi = getResources().getDisplayMetrics().widthPixels;float ydpi = getResources().getDisp ...
- matlab常用方法
1:matlab进行符号的虚数运算 直接使用符号 a+b*j运算,结果是一个角度值,不是复数. 可以使用 a+b*(1j) 进行运算. 如下 position(index,)=radius; ...
- latex 转word
1:下载pandoc软件,支持多种文件格式互转. http://www.pandoc.org/installing.html#windows 2:下载zip包,解压,并将含有pandoc.exe的目录 ...