zoukankan      html  css  js  c++  java
  • POI读取Excel(xls、xlsx均可以)——(四)

     

    maven构建的项目-->pom.xml文件

    • eclipse提供Dependencies直接添加依赖jar包的工具:直接搜索poi以及poi-ooxml即可,maven会自动依赖需要的jar包:
    1. poi提供microsoft office旧版本支持,eg .xls Excel  (2003-2007的版本)
      1. poi-ooxml提供microsoft office新版本支持,eg .xlsx Excel  (2007以后的版本)
    • 或者手动修改pom.xml,在添加jar包依赖的地方加入
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.9</version>
            </dependency>

    或者:

             <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.9</version>
            </dependency>

    注意: HSSFWorkbook是97-03版本的xls版本,XSSFWorkbook是07版本的xlsx

    • HSSFXXX读取03-07版本的xls的excel:  (注意引入的是POI的包,如果读取的是xlsx后缀的excel会报错)
    import java.io.FileInputStream;
    import java.io.IOException;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    
    @SuppressWarnings("all")
    /**
     * java读取低版本的Excel(03版本的Excel)
     * 
     * @author: qlq
     * @date : 2018年7月4日下午3:21:50
     */
    public class POIRead03VersionExcel {
    
        public static void main(String[] args) throws IOException {
            try {
                // 获取一个工作簿
                Workbook workbook = new HSSFWorkbook(new FileInputStream("G:\tmpfile\excel\user.xls"));
    
                // 获取一个工作表两种方式
                // HSSFSheet sheet = workbook.getSheet("sheet0");
                // 获取工作表的第二种方式
                HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0);
    
                int firstRow = 0;
                // 获取sheet的最后一行
                int lastRow = sheet.getLastRowNum();
                for (int i = firstRow; i <= lastRow; i++) {
                    HSSFRow row = sheet.getRow(i);
                    int lastCol = row.getLastCellNum();
                    for (int j = 0; j < lastCol; j++) {
                        HSSFCell cell = row.getCell(j);
                        cell.setCellType(Cell.CELL_TYPE_STRING);// 强制作为String处理
                        String value = cell.getStringCellValue();
                        System.out.print(value + "  ");
                    }
                    System.out.println();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }

    结果:

    • XSSFXXX读取07年以后高版本的Excel的方法:(注意需要引入的是poi-ooxml包,如果读取03版本的xls的excel会报错)

     需要的jar包:

    import java.io.IOException;
    
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    @SuppressWarnings("all")
    /**
     * java读取高版本的excel(xlsx后缀的excel)
     * 
     * @author: qlq
     * @date : 2018年7月4日下午3:21:50
     */
    public class POIRead07VersionExcel {
    
        public static void main(String[] args) throws IOException {
            try {
                // 获取一个工作簿
                // 第一种创建XSSFWorkbook的方法:
                /*
                 * File file = new
                 * File("C:/Users/liqiang/Desktop/考核/系统管理/导入excel模板/user.xlsx");
                 * XSSFWorkbook workbook = new
                 * XSSFWorkbook(FileUtils.openInputStream(file));
                 */
                // 第二种创建XSSFWorkbook的方法
                Workbook workbook = new XSSFWorkbook("G:\tmpfile\excel\user.xlsx");
    
                
                // 获取一个工作表两种方式
                // HSSFSheet sheet = workbook.getSheet("sheet0");
                // 获取工作表的第二种方式
                XSSFSheet sheet = (XSSFSheet) workbook.getSheetAt(0);
    
                int firstRow = 0;
                // 获取sheet的最后一行
                int lastRow = sheet.getLastRowNum();
                for (int i = firstRow; i <= lastRow; i++) {
                    XSSFRow row = sheet.getRow(i);
                    int lastCol = row.getLastCellNum();
                    for (int j = 0; j < lastCol; j++) {
                        XSSFCell cell = row.getCell(j);
                        cell.setCellType(Cell.CELL_TYPE_STRING);// 强制将读取的数据作为String处理,否则读取数字会报错
                        String value = cell.getStringCellValue();
                        System.out.print(value + "  ");
                    }
                    System.out.println();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }

    结果:

    • 解决上述问题,编写一个方法可以读取07或者03版本的Excel的方法:

    第一种方法:

      思路:根据文件的后缀是xls还是xlsx来判断读取调用读取03还是07版本的方法。

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.nio.file.FileAlreadyExistsException;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    @SuppressWarnings("all")
    /**
     * java读取03和07版本的excel的方法
     * 
     * @author: qlq
     * @date : 2018年7月4日下午3:21:50
     */
    public class POIRead07And03VersionExcel {
    
        public static void main(String[] args) throws IOException {
            String filePath = "G:\tmpfile\excel\user.xls";
            if ("xlsx".equals(getFileExtendsName(filePath))) {
                readXlsxExcel(filePath);
            }
            if ("xls".equals(getFileExtendsName(filePath))) {
                readXlsExcel(filePath);
            }
        }
    
        /**
         * 读取excel的拓展名
         * 
         * @param fileName
         * @return
         */
        public static String getFileExtendsName(String fileName) {
            if (fileName == null) {
                return null;
            }
            return fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
        }
    
        /**
         * 读取03-07年的Excel的方法
         * 
         * @param filePath
         *            文件名字
         */
        private static void readXlsExcel(String filePath) {
            try {
                // 获取一个工作簿
                Workbook workbook = new HSSFWorkbook(new FileInputStream(filePath));
    
                // 获取一个工作表两种方式
                // HSSFSheet sheet = workbook.getSheet("sheet0");
                // 获取工作表的第二种方式
                HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0);
    
                int firstRow = 0;
                // 获取sheet的最后一行
                int lastRow = sheet.getLastRowNum();
                for (int i = firstRow; i <= lastRow; i++) {
                    HSSFRow row = sheet.getRow(i);
                    int lastCol = row.getLastCellNum();
                    for (int j = 0; j < lastCol; j++) {
                        HSSFCell cell = row.getCell(j);
                        cell.setCellType(Cell.CELL_TYPE_STRING);// 强制作为String处理
                        String value = cell.getStringCellValue();
                        System.out.print(value + "  ");
                    }
                    System.out.println();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 读取07年以后的Excel的方法
         * 
         * @param filePath
         *            文件名字
         */
        private static void readXlsxExcel(String filePath) {
            try {
                // 获取一个工作簿
                // 第一种创建XSSFWorkbook的方法:
                /*
                 * File file = new
                 * File("C:/Users/liqiang/Desktop/考核/系统管理/导入excel模板/user.xlsx");
                 * XSSFWorkbook workbook = new
                 * XSSFWorkbook(FileUtils.openInputStream(file));
                 */
                // 第二种创建XSSFWorkbook的方法
                Workbook workbook = new XSSFWorkbook(filePath);
    
                // 获取一个工作表两种方式
                // HSSFSheet sheet = workbook.getSheet("sheet0");
                // 获取工作表的第二种方式
                XSSFSheet sheet = (XSSFSheet) workbook.getSheetAt(0);
    
                int firstRow = 0;
                // 获取sheet的最后一行
                int lastRow = sheet.getLastRowNum();
                for (int i = firstRow; i <= lastRow; i++) {
                    XSSFRow row = sheet.getRow(i);
                    int lastCol = row.getLastCellNum();
                    for (int j = 0; j < lastCol; j++) {
                        XSSFCell cell = row.getCell(j);
                        cell.setCellType(Cell.CELL_TYPE_STRING);// 强制将读取的数据作为String处理,否则读取数字会报错
                        String value = cell.getStringCellValue();
                        System.out.print(value + "  ");
                    }
                    System.out.println();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }

    第二种方法:(重要------  一般用这种)

      思路:使用其父类对象,对Workbook进行try..catch 如果创建03版本的HSSF...报错就创建07版本的XSSF...。这也是一种重要的思路,用父类接受对象的实例。

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    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;
    
    @SuppressWarnings("all")
    /**
     * 读取通用Excel的第二种方法
     * 
     * @author: qlq
     * @date : 2018年7月4日下午5:42:02
     */
    public class POIRead07And03VersionExcel2 {
    
        public static void main(String[] args) throws IOException {
            File file = new File("G:/tmpfile/excel/user.xls");
            // 1.创建WorkBook
            Workbook workbook = null;
            try {
                workbook = new XSSFWorkbook(file);
            } catch (Exception e) {
                workbook = new HSSFWorkbook(new FileInputStream(file));
            }
    
            // 获取一个工作表两种方式
            // HSSFSheet sheet = workbook.getSheet("sheet0");
            // 获取工作表的第二种方式
            Sheet sheet =  workbook.getSheetAt(0);
    
            int firstRow = 0;
            // 获取sheet的最后一行
            int lastRow = sheet.getLastRowNum();
            for (int i = firstRow; i <= lastRow; i++) {
                Row row = sheet.getRow(i);
                int lastCol = row.getLastCellNum();
                for (int j = 0; j < lastCol; j++) {
                    Cell cell = row.getCell(j);
                    cell.setCellType(Cell.CELL_TYPE_STRING);// 强制作为String处理
                    String value = cell.getStringCellValue();
                    System.out.print(value + "  ");
                }
                System.out.println();
            }
        }
    
    }

    补充:

    1.如果读取的是数字,想作为字符串处理需要强制单元格读取的时候以字符串处理:

                        cell.setCellType(Cell.CELL_TYPE_STRING);// 强制作为String处理
                        String value = cell.getStringCellValue();

    补充:读取行与列的时候也可以用迭代器遍历的方式进行读取(建议行用迭代器读取,列还用原来的方式读取)

    package cn.xm.exam.test;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Iterator;
    
    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;
    
    @SuppressWarnings("all")
    /**
     * 读取通用Excel的第二种方法
     * 
     * @author: qlq
     * @date : 2018年7月4日下午5:42:02
     */
    public class POIRead07And03VersionExcel3 {
    
        public static void main(String[] args) throws IOException {
            File file = new File("C:\Users\Administrator\Desktop\test.xlsx");
            // 1.创建WorkBook
            Workbook workbook = null;
            try {
                workbook = new XSSFWorkbook(file);
            } catch (Exception e) {
                workbook = new HSSFWorkbook(new FileInputStream(file));
            }
    
            // 获取一个工作表两种方式
            // HSSFSheet sheet = workbook.getSheet("sheet0");
            // 获取工作表的第二种方式
            Sheet sheet = workbook.getSheetAt(0);
    
            // 标记行号
            int i = 0;
            for (Iterator<Row> iterator = sheet.rowIterator(); iterator.hasNext();) {
                Row row = iterator.next();
                if (row == null) {
                    continue;
                }
    
                i++;
                if (i <= 1) {
                    System.out.println("跳过行头");
                    continue;
                }
    
                for (Iterator<Cell> cellIterator = row.cellIterator(); cellIterator.hasNext();) {
                    Cell cell = cellIterator.next();
                    cell.setCellType(Cell.CELL_TYPE_STRING);// 强制将读取的数据作为String处理,否则读取数字会报错
                    String stringCellValue = cell.getStringCellValue();
                    System.out.print(stringCellValue + "	");
                }
                System.out.println();
            }
        }
    
    }

    原来excel内容:

    读取结果:

  • 相关阅读:
    [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.5.1
    [再寄小读者之数学篇](2014-11-21 关于积和式的一个不等式)
    简单的Slony-I设置实例
    Slony-I的限制
    PPAS上运行pg_dump经过II
    PPAS上运行pg_dump经过
    PL/pgSQL学习笔记之十一
    PL/pgSQL学习笔记之十
    PL/pgSQL学习笔记之九
    PL/pgSQL学习笔记之八
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/7271634.html
Copyright © 2011-2022 走看看