Apache POI处理excel文档

但使书种多,会有岁稔时。这篇文章主要讲述Apache POI处理excel文档相关的知识,希望能为你提供帮助。
        目前比较流行处理excel文档的方式一般有两种,分别是POI和JXL。重量级POI优缺点:适合对excel文档细节有比较专业的要求,如使用公式、宏等高级功能;缺点是操作相对繁琐,非纯java编写的架包,跨平台性有待加强。轻量级JXL优缺点:Jxl是纯javaAPI,跨平台性优越,操作相对简便;缺点是对excel文档的一些高级功能不支持,但可以满足日常需求。这里我们介绍POI的基本使用。
1.首先导入相关架包,如图:

Apache POI处理excel文档

文章图片

这里还要注意你开发项目的JDK版本是什么,要根据相应JDK版本下载不同POI的版本。如图:
Apache POI处理excel文档

文章图片

2.操作ExcelReader辅助类可以处理xls和xlsx文件,readExcelTitle(InputStream is)方法读取文件标题,也就是文件首行,readExcelContent(InputStream is)方法读取文件内容:
import  java.io.IOException; import  java.io.InputStream; import  java.text.DecimalFormat; import  java.text.SimpleDateFormat; import  java.util.Date; import  java.util.LinkedHashMap; import  java.util.Map; import  org.apache.log4j.Logger; import  org.apache.poi.ss.usermodel.Cell; import  org.apache.poi.ss.usermodel.DateUtil; 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.ss.usermodel.WorkbookFactory; /**   *  操作Excel表格的功能类   */ public  class  ExcelReader  { private  static  DecimalFormat  df  =  new  DecimalFormat("0"); private  final  static  Logger  log  =  Logger.getLogger(ExcelReader.class); private  Workbook  wb=null; private  Sheet  sheet=null; private  Row  row=null; /**   *  读取Excel表格表头的内容   *  @param  InputStream   *  @return  String  表头内容的数组   *  @throws  IOException    */ public  String[]  readExcelTitle(InputStream  is)  throws  Exception  { try  { wb  =  WorkbookFactory.create(is); }  catch  (IOException  e)  { log.error("读取Excel表格表头的内容异常",  e); throw  e; } sheet  =  wb.getSheetAt(0); row  =  sheet.getRow(0); //  标题总列数 int  colNum  =  row.getPhysicalNumberOfCells(); String[]  title  =  new  String[colNum]; for  (int  i  =  0;   i  <   colNum;   i++)  { title[i]  =  getCellFormatValue(row.getCell(i)); } log.info("读取Excel表格表头的内容完毕"); return  title; } /**   *  读取Excel数据内容   *  @param  InputStream   *  @return  Map  包含单元格数据内容的Map对象   *  @throws  IOException    */ public  Map< Integer,  String>   readExcelContent(InputStream  is)  throws  Exception  { Map< Integer,  String>   content  =  new  LinkedHashMap< Integer,  String> (); String  str  =  ""; try  { wb  =  WorkbookFactory.create(is); }  catch  (IOException  e)  { log.error("读取Excel数据内容",  e); throw  e; } sheet  =  wb.getSheetAt(0); //  得到总行数 int  rowNum  =  sheet.getLastRowNum(); row  =  sheet.getRow(0); int  colNum  =  row.getPhysicalNumberOfCells(); //  正文内容应该从第二行开始,第一行为表头的标题 for  (int  i  =  1;   i  < =  rowNum;   i++)  { row  =  sheet.getRow(i); int  j  =  0; while  (j  <   colNum)  { //  每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据 //  也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean //  str  +=  getStringCellValue(row.getCell((short)  j)).trim()  + //  "-"; if  (row  !=  null)  { str  +=  getCellFormatValue(row.getCell(j)).trim()  +  ","; }  else  { str  +=  ""  +  ","; } j++; } content.put(i,  str.substring(0,  str.length()  -  1)); str  =  ""; } log.info("读取Excel数据内容完毕"); return  content; } /**   *  根据Cell类型设置数据   *  @param  cell   *  @return   */ private  String  getCellFormatValue(Cell  cell)  { String  cellvalue  =  ""; if  (cell  !=  null)  { //  判断当前Cell的Type switch  (cell.getCellType())  { //  如果当前Cell的Type为NUMERIC case  Cell.CELL_TYPE_NUMERIC: case  Cell.CELL_TYPE_FORMULA:  { //  判断当前的cell是否为Date if  (DateUtil.isCellDateFormatted(cell))  { //  如果是Date类型则,转化为Data格式//方法1:这样子的data格式是带时分秒的:2015-12-18  0:00:00 //cellvalue  =  cell.getDateCellValue().toLocaleString(); //方法2:这样子的data格式是不带带时分秒的:2011-10-12 Date  date  =  cell.getDateCellValue(); SimpleDateFormat  sdf  =  new  SimpleDateFormat("yyyy-MM-dd"); cellvalue  =  sdf.format(date); } //  如果是纯数字 else  { //  取得当前Cell的数值 cellvalue  =  String.valueOf(df.format(cell.getNumericCellValue())); } break; } //  如果当前Cell的Type为STRIN case  Cell.CELL_TYPE_STRING: //  取得当前的Cell字符串 cellvalue  =  cell.getRichStringCellValue().getString(); break; //  默认的Cell值 default: cellvalue  =  "  "; } }  else  { cellvalue  =  ""; } return  cellvalue; } }

简单实例代码,实际使用中应该加上异常处理机制:
          FileInputStream  is  =  new  FileInputStream(file);           ExcelReader  excelReader  =  new  ExcelReader();           String[]  title  =  excelReader.readExcelTitle(is); //读取文件标题(非文件名,而是文件第一行)           for  (String  str  :  title)  {   System.out.println(str);           }           is.close();           is  =  new  FileInputStream(file);           Map< Integer,  String>   map  =  excelReader.readExcelContent(is); //读取文件内容           for  (int  i  =  1;   i  < =  map.size();   i++)  {                   System.out.println(map.get(i));           }           is.close();


相关截图:
Apache POI处理excel文档

文章图片

Apache POI处理excel文档

文章图片

【Apache POI处理excel文档】


    推荐阅读