简介

前段时间完成了一个输出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. 让WIN7桌面显示IE图标

    首先新一个文本文件,将以下代码复制到新建文档中.然后保存为IE.reg,右键以管理员权限运行.此时,注册表注册成功.LOOK,IE图标出来了 Windows Registry Editor Versi ...

  2. maven package install deploy区别

    package 命令完成了项目编译.单元测试.打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库install 命令完成了项目编译.单元测 ...

  3. Balls and Boxes---hdu5810(推公式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5810 有n个球m个盒子,随机把球放到盒子中,求每个盒子球个数的方差的期望值 E[V]; 推公式吧,或者 ...

  4. Code--POJ1850

    Description Transmitting and memorizing information is a task that requires different coding systems ...

  5. CentOS 7设置Samba共享目录

    1. 安装Samba服务 yum -y install samba # 查看yum源中Samba版本 yum list | grep samba # 查看samba的安装情况 rpm -qa | gr ...

  6. kubernetes实战(十一):k8s使用openLDAP统一认证

    1.基本概念 为了方便管理和集成jenkins,k8s.harbor.jenkins均使用openLDAP统一认证. 2.部署openLDAP 此处将openLDAP部署在k8s上,openLDAP可 ...

  7. webpack笔记二——entry

    entry是输入目录文件,有三种形式 1.对象键值对形式 entry: { main: './src/script/main.js', b: './src/script/b.js' }, 注意的是输出 ...

  8. IO流(6)获取功能

    获取功能: * public String getAbsolutePath():获取绝对路径 * public String getPath():获取相对路径 * public String getN ...

  9. 【服务器】如何在服务器发布网站?Sasa讲解

    一.网站发布过程 1.可以在淘宝.万维网上买服务器,然后客服提供一个服务器的远程ip链接,我们通过我们电脑的远程去链接这个远程服务器就可以对这个服务器进行控制了.. 2.将待发布网站的程序在本地保存, ...

  10. 开机自启:bat实现一次性打开win7中的常用软件和文件夹

    需求说明: 我们电脑(windows)办公,经常上班前一开机,就要手动打开很多文件夹和程序. 想节省时间,一键打开常用的文件夹和程序,研究了一下bat命令,于是mystart.bat产生了. myst ...