表格读取工具类[处理2003/2007]
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; } }