zoukankan      html  css  js  c++  java
  • java解析获取Excel中的数据--同时兼容2003及2007

    首先大家先了解一下以下内容:引用 http://feitian0127.iteye.com/blog/1152524

        java解析Excel(兼容2003及2007)


    刚开始从网上找了个例子使用new HSSFWorkbook(new FileInputStream(excelFile))来读取Workbook,
    对Excel2003以前(包括2003)的版本没有问题,但读取Excel2007时发生如下异常:
    org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

            该错误意思是说,文件中的数据是用Office2007+XML保存的,而现在却调用OLE2 Office文档处理,应该使用POI不同的部分来处理这些数据,比如使用XSSF来代替HSSF。

            于是按提示使用XSSF代替HSSF,用new XSSFWorkbook(excelFile)来读取Workbook,对Excel2007没有问题了,可是在读取Excel2003以前(包括2003)的版本时却发生了如下新异常:
    org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: '*.xls'
            该错误是说,操作无效,不能打开指定的xls文件。

            到网上查了下,原来是XSSF不能读取Excel2003以前(包括2003)的版本,这样的话,就需要在读取前判断文件是2003前的版本还是2007的版本,然后对应调用HSSF或XSSF来读取。
            这种做法比较麻烦,看了下API,发现XSSF和HSSF虽然在不同的包里,但却引用了同一接口Workbook,于是想到了这样的读取方法:
            Workbook book = null;
            try {
                book = new XSSFWorkbook(excelFile);
            } catch (Exception ex) {
                book = new HSSFWorkbook(new FileInputStream(excelFile));
            }
            
    本认为程序应该没错了吧,但一运行还是报错(当时用得是poi3.6的zip包):

    java.lang.ClassNotFoundException: org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet

    网上搜了下,是少poi-ooxml-schemas-xxx.jar包,根据提示在Apache网站上(http://labs.renren.com/apache-mirror//poi/release/bin/)下载了3.7的zip文件(poi-bin-3.7-20101029.zip),解压后将poi相关的包和xml相关的包都放上去。

    在各版本的Excel中测试,没有发生异常,问题解决。

    下面是POI的API网址,不过是英文的:
    POI API Documentation
    http://poi.apache.org/apidocs/index.html

       转入正题:以下是代码,代码也是从别人的代码拿过来的,其中修改了部分

    package com.execl;
     
    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.8-beta3-20110606.jar
     * 
     *               poi-ooxml-3.8-beta3-20110606.jar
     * 
     *               poi-examples-3.8-beta3-20110606.jar
     * 
     *               poi-excelant-3.8-beta3-20110606.jar
     * 
     *               poi-ooxml-schemas-3.8-beta3-20110606.jar
     * 
     *               poi-scratchpad-3.8-beta3-20110606.jar
     * 
     *               xmlbeans-2.3.0.jar
     * 
     *               dom4j-1.6.1.jar
     * 
     *               jar包官网下载地址:http://poi.apache.org/download.html
     * 
     *               下载poi-bin-3.8-beta3-20110606.zipp
     * 
     * @作者:建宁
     * 
     * @时间:2012-08-29 下午16:27:15
     */
     
    public class ImportExecl
    {
     
        /** 总行数 */
     
        private int totalRows = 0;
     
        /** 总列数 */
     
        private int totalCells = 0;
     
        /** 错误信息 */
     
        private String errorInfo;
     
        /** 构造方法 */
     
        public ImportExecl()
        {
     
        }
     
        /**
         * 
         * @描述:得到总行数
         * 
         * @作者:建宁
         * 
         * @时间:2012-08-29 下午16:27:15
         * 
         * @参数:@return
         * 
         * @返回值:int
         */
     
        public int getTotalRows()
        {
     
            return totalRows;
     
        }
     
        /**
         * 
         * @描述:得到总列数
         * 
         * @作者:建宁
         * 
         * @时间:2012-08-29 下午16:27:15
         * 
         * @参数:@return
         * 
         * @返回值:int
         */
     
        public int getTotalCells()
        {
     
            return totalCells;
     
        }
     
        /**
         * 
         * @描述:得到错误信息
         * 
         * @作者:建宁
         * 
         * @时间:2012-08-29 下午16:27:15
         * 
         * @参数:@return
         * 
         * @返回值:String
         */
     
        public String getErrorInfo()
        {
     
            return errorInfo;
     
        }
     
        /**
         * 
         * @描述:验证excel文件
         * 
         * @作者:建宁
         * 
         * @时间:2012-08-29 下午16:27:15
         * 
         * @参数:@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文件
         * 
         * @作者:建宁
         * 
         * @时间:2012-08-29 下午16:27:15
         * 
         * @参数:@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文件
         * 
         * @作者:建宁
         * 
         * @时间:2012-08-29 下午16:40:15
         * 
         * @参数:@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;
     
        }
     
        /**
         * 
         * @描述:读取数据
         * 
         * @作者:建宁
         * 
         * @时间:2012-08-29 下午16:50:15
         * 
         * @参数:@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测试方法
         * 
         * @作者:建宁
         * 
         * @时间:2012-08-29 下午17:12:15
         * 
         * @参数:@param args
         * 
         * @参数:@throws Exception
         * 
         * @返回值:void
         */
     
        public static void main(String[] args) throws Exception
        {
     
            ImportExecl poi = new ImportExecl();
     
            // List<List<String>> list = poi.read("d:/aaa.xls");
     
            List<List<String>> list = poi.read("c:/book.xlsx");
     
            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();
     
                }
     
            }
     
        }
     
    }
     
    /**
     * 
     * @描述:工具类
     * 
     * @作者:建宁
     * 
     * @时间:2012-08-29 下午16:30:40
     */
     
    class WDWUtil
    {
     
        /**
         * 
         * @描述:是否是2003的excel,返回true是2003
         * 
         * @作者:建宁
         * 
         * @时间:2012-08-29 下午16:29:11
         * 
         * @参数:@param filePath 文件完整路径
         * 
         * @参数:@return
         * 
         * @返回值:boolean
         */
     
        public static boolean isExcel2003(String filePath)
        {
     
            return filePath.matches("^.+\.(?i)(xls)$");
     
        }
     
        /**
         * 
         * @描述:是否是2007的excel,返回true是2007
         * 
         * @作者:建宁
         * 
         * @时间:2012-08-29 下午16:28:20
         * 
         * @参数:@param filePath 文件完整路径
         * 
         * @参数:@return
         * 
         * @返回值:boolean
         */
     
        public static boolean isExcel2007(String filePath)
        {
     
            return filePath.matches("^.+\.(?i)(xlsx)$");
     
        }
     
    }

     算吧!  我把我的源码也放上—— 哈哈

                http://download.csdn.net/detail/mmm333zzz/4560058

  • 相关阅读:
    uva 147 Dollars
    hdu 2069 Coin Change(完全背包)
    hdu 1708 Fibonacci String
    hdu 1568 Fibonacci
    hdu 1316 How Many Fibs?
    poj 1958 Strange Towers of Hanoi
    poj 3601Tower of Hanoi
    poj 3572 Hanoi Tower
    poj 1920 Towers of Hanoi
    筛选法——素数打表
  • 原文地址:https://www.cnblogs.com/panchanggui/p/14202322.html
Copyright © 2011-2022 走看看