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 + "\t");
            }
            System.out.println();
        }
    }

}

 

原来excel内容:

 

读取结果:

 

posted @ 2017-08-01 23:51  QiaoZhi  阅读(3449)  评论(1编辑  收藏  举报