如何解析读取excel数据

简介

前段时间完成了一个输出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);
            }  
时间: 2024-07-28 16:32:01

如何解析读取excel数据的相关文章

NPOI操作excel——利用反射机制,NPOI读取excel数据准确映射到数据库字段

> 其实需求很明确,就是一大堆不一样的excel,每张excel对应数据库的一张表,我们需要提供用户上传excel,我们解析数据入库的功能实现. 那么,这就涉及到一个问题:我们可以读出excel的表头,但是怎么知道每个表头具体对应数据库里面的字段呢? 博主经过一段时间的思考与构思,想到一法:现在的情况是我们有excel表A,对应数据库表B,但是A与B具体属性字段的映射关系我们不知.那我们是不是可以有一个A到B的映射文件C呢? 我想,说到这,大家就很明了了... 第一步:为每张excel创建一个与

asp.net读取Excel数据

先通过控件FileUpload获取excel文件路径 protected void btnReadExcelFromFileUpload_Click(object sender, EventArgs e) { if (fupExcel.PostedFile.ContentLength > 0) { //获取全路径 string fullFileName = fupExcel.PostedFile.FileName.ToString(); //获取文件名 string fileName = fup

猜想-未做 利用office组件读取excel数据

---未实际使用过 用SQL-Server访问Office的Access和Excel http://blog.sina.com.cn/s/blog_964237ea0101532x.html 2007 Office system 驱动程序:数据连接组件 http://www.microsoft.com/zh-CN/download/details.aspx?id=23734 2007 Office system 驱动程序:数据连接组件 详情 版本:All File Name:AccessData

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

Openxml读取Excel数据: 有些问题,如果当Cell 里面是 日期和浮点型的话,对应的Cell.DataType==Null,对应的时间会转换为一个浮点型,对于这块可以通过DateTime.FromOADate(double d)转换为时间. 可是缺点的地方就是,如果Cell.DataType ==NULL, 根本无法确认这个数据到底是 浮点型还是[被转换为了日期的浮点数].查阅了很多国外资料,的确国外博客有一部分都反映了.有关Openxml读取Excel时Cell.DataType==

java的poi技术读取Excel数据

这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx. 读取excel和MySQL相关: java的poi技术读取Excel数据到MySQL 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术 :java的jxl技术导入Excel  下面是本文的项目结构: 项目中所需要的jar文件: 所用的Excel数据(2003-2007,2010都是一

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

这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 :java的jxl技术导入Excel  项目结构: Excel中的测试数据: 数据库结构: 对应的SQL: 1 CREATE TABLE `student_info` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `no` varchar(20) DEFAU

Delphi中使用python脚本读取Excel数据

Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://seewind.blog.51cto.com/249547/46669前段时间,在正式项目中使用Python来读取Excel表格的数据.具体需求是,项目数据库中有些数据需要根据Excel表格里面的数据进行一些调整,功能应该比较简单.为了学习Pyth

使用NPOI读取Excel数据到DataTable

现在XML文件的存储格式大行其道,但是也不是适用于所有情况,很多单位的数据交换还是使用Excel的形式.这就使得我们需要读取Excel内的数据,加载到程序中进行处理.但是怎样有效率的读取,怎样使程序保持健壮,这需要很大的努力. 我们如果要写一个动态链接库会很花费时间和精力,这就使得开源项目是个很有效率的选择. 在各类关于Excel的开源项目中NPOI是中国的程序员发起的,他的一大好处是直接处理Ole文件,用户不必安装Office.现在发展到2.0还可以自动判断Excel文件版本,我们自己判断文件

python读取excel数据

excel是很常用的表格工具.不过,对程序员来说,这可不是件好事件.因为excel的数据既不像txt那样,随意一种语言.脚本,写个函数就能把数据读出来分析.也不像JSON这种开源的数据格式,有N多的开源库来读取.就算没有,知道数据格式,自己写个库也自己用不至于太难. 要想读取excel的数据,大多使用ODBC数据库驱动或者COM的方式.对于ODBC,不同的语言有不同的实现,如java的JDBC.而对于COM方式,几乎是在后台运行一个excel程序,像new Excel.Application()