zoukankan      html  css  js  c++  java
  • 如何解析读取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);  
                }  
     
     
  • 相关阅读:
    10 种保护 Spring Boot 应用的绝佳方法
    Redis 如何分析慢查询操作?
    Spring Boot 主类及目录结构介绍
    Redis 再牛逼,也得设置密码!!
    Spring Data Redis 详解及实战一文搞定
    Spring Boot Redis Cluster 实战干货
    超详细的 Redis Cluster 官方集群搭建指南
    Redis Linux 安装运行实战全记录
    hdu 4790 Just Random (思路+分类计算+数学)
    poj 1328 Radar Installation(贪心)
  • 原文地址:https://www.cnblogs.com/wuguanglin/p/readExcel.html
Copyright © 2011-2022 走看看