package com.excel;
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.poifs.filesystem.OfficeXmlFileException;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;
public class ReadExcel {
private static final int startReadRowIndex=0; // 0从标题开始读取 1从数据开始读取
private static final int startReadSheetIndex=0; // 默认从第 0 个工作表开始读取
private static final boolean isReadSheets=true; //是否读取多个工作表 是:从 startReadSheetIndex 开始读取 否:读取 startReadSheetIndex工作表
private static String IS_EMPTY="IS_EMPTY"; //为空标识
private static String path2003="E:\\data\\Test2003.xls"; //2007
private static String path2007="E:\\data\\Test2007.xlsx"; //2007
public static void main(String[] args) {
System.out.println("***读取表格***");
ReadExcel readExcel =new ReadExcel();
Map<Integer,List<String[]>> map= readExcel.readExcel2003(path2003);
/*for(Integer n : map.keySet()){
List<String[]> list=map.get(n);
for(String[] strings : list){
System.out.println(Arrays.asList(strings));
}
}*/
}
/**
* 采用2003版本读取数据
* @param path
* @return
*/
public Map<Integer,List<String[]>> readExcel2003(String path){
Map<Integer,List<String[]>> data=new HashMap<Integer, List<String[]>>();
try {
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(path));
data=getExcelData2003(workbook);
} catch (IOException e) {
e.printStackTrace();
}catch (OfficeXmlFileException e){
data=readExcel2007(path);
}finally {
return data;
}
}
/**
* 2003 读取数据
* @param workbook
*/
public Map<Integer,List<String[]>> getExcelData2003(HSSFWorkbook workbook){
int sheetCounts =workbook.getNumberOfSheets();
Map<Integer,List<String[]>> data=new HashMap();
int sheetIndex=startReadSheetIndex;
while(sheetIndex<sheetCounts){
HSSFSheet sheet=workbook.getSheetAt(sheetIndex);
int rowNum=sheet.getLastRowNum();
int cellNum=sheet.getRow(0).getLastCellNum();
List<String[]> sheetData=new ArrayList<String[]>();
for(int i=startReadRowIndex;i<=rowNum;i++){
HSSFRow row=sheet.getRow(i);
if(row==null){
continue;
}
String[] rowData=new String[cellNum];
for(int j=0;j<cellNum;j++){
if(row.getCell(j)==null||row.getCell(j).toString().length()==0||row.getCell(j).toString().isEmpty()){
rowData[j]=IS_EMPTY;
}else{
rowData[j]=row.getCell(j).toString();
}
}
sheetData.add(rowData);
}
data.put(sheetIndex,sheetData);
if(!isReadSheets){
sheetIndex=sheetCounts;
}
System.out.println("[2003版本] 工作表: ["+sheet.getSheetName()+"] 读取完成");
sheetIndex++;
}
return data;
}
/**
* 采用2007版本读取数据
* @param path
* @return
*/
public Map<Integer,List<String[]>> readExcel2007(String path){
Map<Integer,List<String[]>> data=new HashMap<Integer, List<String[]>>();
try {
XSSFWorkbook workbook=new XSSFWorkbook(new FileInputStream(path));
data=getExcelData2007(workbook);
} catch (IOException e) {
e.printStackTrace();
}catch (OfficeXmlFileException e){
data=readExcel2003(path);
}finally {
return data;
}
}
/**
* 2007 读取数据
* @param workbook
*/
public Map<Integer,List<String[]>> getExcelData2007(XSSFWorkbook workbook){
int sheetCounts =workbook.getNumberOfSheets();
Map<Integer,List<String[]>> data=new HashMap();
int sheetIndex=startReadSheetIndex;
while(sheetIndex<sheetCounts){
XSSFSheet sheet=workbook.getSheetAt(sheetIndex);
int rowNum=sheet.getLastRowNum();
int cellNum=0;
List<String[]> sheetData=new ArrayList<String[]>();
for(int i=startReadRowIndex;i<=rowNum;i++){
cellNum=sheet.getRow(0).getLastCellNum();
XSSFRow row=sheet.getRow(i);
if(row==null){
continue;
}
String[] rowData=new String[cellNum];
for(int j=0;j<cellNum;j++){
if(row.getCell(j)==null||row.getCell(j).toString().length()==0||row.getCell(j).toString().isEmpty()){
rowData[j]=IS_EMPTY;
}else{
rowData[j]=row.getCell(j).toString();
}
}
sheetData.add(rowData);
}
data.put(sheetIndex,sheetData);
if(!isReadSheets){
sheetIndex=sheetCounts;
}
System.out.println("[2007版本] 工作表: ["+sheet.getSheetName()+"] 读取完成");
sheetIndex++;
}
return data;
}
}