POI读取Excel(xls、xlsx均可以)——(四)
maven构建的项目-->pom.xml文件
- eclipse提供Dependencies直接添加依赖jar包的工具:直接搜索poi以及poi-ooxml即可,maven会自动依赖需要的jar包:
- poi提供microsoft office旧版本支持,eg .xls Excel (2003-2007的版本)
- 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内容:
读取结果:
【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】