简介

前段时间完成了一个输出excel的任务,感觉挺开心的,用的就是Apache POI的jar包,Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。其中

HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft  Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft  Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft  Visio格式档案的功能。
有兴趣的可以查看官方API http://poi.apache.org/apidocs/index.html
今天,又学会了如何从excel中读取想要的数据,觉得代码以后可以复用,故贴上来留着以后用,话不多说,上源码:

源码

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数据的更多相关文章

  1. Java读取Excel数据

    Java读取Excel数据,解析文本并格式化输出 Java读取Excel数据,解析文本并格式化输出 Java读取Excel数据,解析文本并格式化输出 下图是excel文件的路径和文件名 下图是exce ...

  2. poi——读取excel数据

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

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

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

  4. .NET读取Excel数据,提示错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序

    解决.NET读取Excel数据时,提示错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序的操作: 1. 检查本机是否安装Office Access,如果未安装去去h ...

  5. oledbdataadapter 读取excel数据时,有的单元格内容不能读出

    表现:excel中某列中,有的单元格左上角有绿色箭头标志,有的没有,c#编写读取程序,但是只能读取出带绿色箭头的单元格中的内容,其余不带的读取不到内容 原因:excel中单元格因为是文本格式而存储了数 ...

  6. Openxml入门---Openxm读取Excel数据

    Openxml读取Excel数据: 有些问题,如果当Cell 里面是 日期和浮点型的话,对应的Cell.DataType==Null,对应的时间会转换为一个浮点型,对于这块可以通过DateTime.F ...

  7. C# 读取EXCEL数据

       /// <summary> /// 读取EXCEL数据 /// </summary> /// <param name="Path">< ...

  8. JAVA反射机制示例,读取excel数据映射到JAVA对象中

    import java.beans.PropertyDescriptor; import java.io.File; import java.io.FileInputStream; import ja ...

  9. Python读取Excel数据并根据列名取值

    一直想将自己接触到的东西梳理一遍,可就是迈不出第一步,希望从这篇总结开始不要再做行动的矮人了. 最近测试过程中需要用到python读取excel用例数据,于是去了解和学习了下xlrd库,这里只记录使用 ...

随机推荐

  1. iOS-CoreLocation简单介绍(转载)

    一.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 (1)导航:去任意陌生的地方 (2)周边:找餐馆.找酒店.找银行.找电影院 2.在上述应用中,都用到了地图和定位功能,在iOS ...

  2. HTML标签_增加css样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 完美解决onchange不能实时的监听

    我们大家都知道onchange有时候很不好用,因为onchange事件是离开焦点后才会被触发,而不是实时去监听! 那么oninput()事件和onpropertychange()完美的解决了问题:(o ...

  4. FS Shell命令手册

    1.       FS Shell 1.1     简介 调用文件系统(FS)Shell命令应使用 bin/hadoop fs <args>的形式. 所有的的FS shell命令使用URI ...

  5. (3.2)mysql基础深入——mysql源码阅读工具安装与应用

    (3.2)mysql基础深入——mysql源码阅读工具安装与应用 关键字:mysql源码阅读工具 工具列举:一般多用[1][2][3]吧 [1]source insight [2]写字板/记事本 UE ...

  6. js-jquery-对象与JSON字符串互相转换

    1:jQuery插件支持的转换方式 代码如下: String→Object$.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转 ...

  7. vue学习五之VueCLi

    概念 通俗的说,Vue CLI是我们创建大型项目时的脚手架,所谓脚手架,就是帮助我们建设好了建造大厦的所需模板,建设者只需往模板里面填入实质内容,即可完成大厦的建设,对于程序开发来说,脚手架使程序员只 ...

  8. vue学习之node.js

    Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.本文详细介绍了No ...

  9. vertx 从Tcp服务端和客户端开始翻译

    写TCP 服务器和客户端 vert.x能够使你很容易写出非阻塞的TCP客户端和服务器 创建一个TCP服务 最简单的创建TCP服务的方法是使用默认的配置:如下 NetServer server = ve ...

  10. HDU5012:Dice(bfs模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=5012 Problem Description There are 2 special dices on the ...