用poi3.6 读取excel

阅读更多

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/** *//**
*


    *
  • Title:[POI基础上的Excel数据读取工具]

  • *
  • Description: [支持Excell2003,Excell2007,自动格式化数值型数据,自动格式化日期型数据]

  • *
  • Copyright 2009 RoadWay Co., Ltd.

  • *
  • All right reserved.

  • *
  • Created by [惠万鹏] [Jan 20, 2010]

  • *
  • Midified by [modifier] [modified time]

  • *
    *
  • 所需Jar包列表

  • *
  • poi-3.6-20091214.jar

  • *
  • poi-contrib-3.6-20091214.jar

  • *
  • poi-examples-3.6-20091214.jar

  • *
  • poi-ooxml-3.6-20091214.jar

  • *
  • poi-ooxml-schemas-3.6-20091214.jar

  • *
  • poi-scratchpad-3.6-20091214.jar

  • *
  • xmlbeans-2.3.0.jar

  • *

      *
      * @version 1.0
      */
      public class POIExcelUtil
      {
      /** *//** 总行数 */
      private int totalRows = 0;

      /** *//** 总列数 */
      private int totalCells = 0;

      /** *//** 构造方法 */
      public POIExcelUtil()
      {}

      /** *//**
      *

        *
      • Description:[根据文件名读取excel文件]

      • *
      • Created by [Huyvanpull] [Jan 20, 2010]

      • *
      • Midified by [modifier] [modified time]

      • *

          *
          * @param fileName
          * @return
          * @throws Exception
          */
          public List> read(String fileName)
          {
          List> dataLst = new ArrayList>();

          /** *//** 检查文件名是否为空或者是否是Excel格式的文件 */
          if (fileName == null || !fileName.matches("^.+\\.(?i)((xls)|(xlsx))$"))
          {
          return dataLst;
          }

          boolean isExcel2003 = true;
          /** *//** 对文件的合法性进行验证 */
          if (fileName.matches("^.+\\.(?i)(xlsx)$"))
          {
          isExcel2003 = false;
          }

          /** *//** 检查文件是否存在 */
          File file = new File(fileName);
          if (file == null || !file.exists())
          {
          return dataLst;
          }

          try
          {
          /** *//** 调用本类提供的根据流读取的方法 */
          dataLst = read(new FileInputStream(file), isExcel2003);
          }
          catch (Exception ex)
          {
          ex.printStackTrace();
          }

          /** *//** 返回最后读取的结果 */
          return dataLst;
          }

          /** *//**
          *

            *
          • Description:[根据流读取Excel文件]

          • *
          • Created by [Huyvanpull] [Jan 20, 2010]

          • *
          • Midified by [modifier] [modified time]

          • *

              *
              * @param inputStream
              * @param isExcel2003
              * @return
              */
              public List> read(InputStream inputStream,
              boolean isExcel2003)
              {
              List> dataLst = null;
              try
              {
              /** *//** 根据版本选择创建Workbook的方式 */
              Workbook wb = isExcel2003 ? new HSSFWorkbook(inputStream)
              : new XSSFWorkbook(inputStream);
              dataLst = read(wb);
              }
              catch (IOException e)
              {
              e.printStackTrace();
              }
              return dataLst;
              }

              /** *//**
              *

                *
              • Description:[得到总行数]

              • *
              • Created by [Huyvanpull] [Jan 20, 2010]

              • *
              • Midified by [modifier] [modified time]

              • *

                  *
                  * @return
                  */
                  public int getTotalRows()
                  {
                  return totalRows;
                  }

                  /** *//**
                  *

                    *
                  • Description:[得到总列数]

                  • *
                  • Created by [Huyvanpull] [Jan 20, 2010]

                  • *
                  • Midified by [modifier] [modified time]

                  • *

                      *
                      * @return
                      */
                      public int getTotalCells()
                      {
                      return totalCells;
                      }

                      /** *//**
                      *

                        *
                      • Description:[读取数据]

                      • *
                      • Created by [Huyvanpull] [Jan 20, 2010]

                      • *
                      • Midified by [modifier] [modified time]

                      • *

                          *
                          * @param wb
                          * @return
                          */
                          private List> read(Workbook wb)
                          {
                          List> dataLst = new ArrayList>();

                          /** *//** 得到第一个shell */
                          Sheet sheet = wb.getSheetAt(0);
                          this.totalRows = sheet.getPhysicalNumberOfRows();
                          if (this.totalRows >= 1 && sheet.getRow(0) != null)
                          {
                          this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
                          }

                          /** *//** 循环Excel的行 */
                          for (int r = 0; r < this.totalRows; r++)
                          {
                          Row row = sheet.getRow(r);
                          if (row == null)
                          {
                          continue;
                          }

                          ArrayList rowLst = new ArrayList();
                          int cells = row.getPhysicalNumberOfCells();
                          /** *//** 循环Excel的列 */
                          for (short c = 0; c < cells; c++)
                          {
                          Cell cell = row.getCell(c);
                          String cellValue = "";
                          if (cell == null)
                          {
                          rowLst.add(cellValue);
                          continue;
                          }

                          /** *//** 处理数字型的,自动去零 */
                          if (Cell.CELL_TYPE_NUMERIC == cell.getCellType())
                          {
                          /** *//** 在excel里,日期也是数字,在此要进行判断 */
                          if (HSSFDateUtil.isCellDateFormatted(cell))
                          {
                          cellValue = getRightStr(cell.getDateCellValue() + "");
                          }
                          else
                          {
                          cellValue = getRightStr(cell.getNumericCellValue() + "");
                          }
                          }
                          /** *//** 处理字符串型 */
                          else if (Cell.CELL_TYPE_STRING == cell.getCellType())
                          {
                          cellValue = cell.getStringCellValue();
                          }
                          /** *//** 处理布尔型 */
                          else if (Cell.CELL_TYPE_BOOLEAN == cell.getCellType())
                          {
                          cellValue = cell.getBooleanCellValue() + "";
                          }
                          /** *//** 其它的,非以上几种数据类型 */
                          else
                          {
                          cellValue = cell.getBooleanCellValue() + "";
                          }

                          rowLst.add(cellValue);
                          }
                          dataLst.add(rowLst);
                          }
                          return dataLst;
                          }

                          /** *//**
                          *

                            *
                          • Description:[正确地处理整数后自动加零的情况]

                          • *
                          • Created by [Huyvanpull] [Jan 20, 2010]

                          • *
                          • Midified by [modifier] [modified time]

                          • *

                              *
                              * @param sNum
                              * @return
                              */
                              private String getRightStr(String sNum)
                              {
                              DecimalFormat decimalFormat = new DecimalFormat("#.000000");
                              String resultStr = decimalFormat.format(new Double(sNum));
                              if (resultStr.matches("^[-+]?\\d+\\.[0]+$"))
                              {
                              resultStr = resultStr.substring(0, resultStr.indexOf("."));
                              }
                              return resultStr;
                              }

                              /** *//**
                              *

                                *
                              • Description:[测试main方法]

                              • *
                              • Created by [Huyvanpull] [Jan 20, 2010]

                              • *
                              • Midified by [modifier] [modified time]

                              • *

                                  *
                                  * @param args
                                  * @throws Exception
                                  */
                                  /* public static void main(String[] args) throws Exception
                                  {
                                  List> dataLst = new POIExcelUtil()
                                  .read("E:\\ysdata.xlsx");
                                  for (ArrayList innerLst : dataLst)
                                  {
                                  StringBuffer rowData = new StringBuffer();
                                  for (String dataStr : innerLst)
                                  {
                                  rowData.append(",").append(dataStr);
                                  }
                                  if (rowData.length() > 0)
                                  {
                                  System.out.println(rowData.deleteCharAt(0).toString());
                                  }
                                  }
                                  }*/
                                  ====================================================================================================================== public static void main(String[] args) throws Exception {
                                  InputStream is = new FileInputStream(new File("E:\\我参与的项目\\北京cpi\\HTA081218TJJGCJ\\1-系统开发实施\\(1)需求\\5需求分析\\导入导出\\3.2.1PDA后台数据导入\\ysdata.xlsx"));
                                  //根据输入流创建Workbook对象
                                  Workbook wb = WorkbookFactory.create(is);
                                  //get到Sheet对象
                                  Sheet sheet = wb.getSheetAt(0);
                                  //这个必须用接口
                                  for(Row row : sheet){
                                  for(Cell cell : row){
                                  //cell.getCellType是获得cell里面保存的值的type
                                  //如Cell.CELL_TYPE_STRING
                                  switch(cell.getCellType()){
                                  case Cell.CELL_TYPE_BOOLEAN:
                                  //得到Boolean对象的方法
                                  System.out.print(cell.getBooleanCellValue()+" ");
                                  break;
                                  case Cell.CELL_TYPE_NUMERIC:
                                  //先看是否是日期格式
                                  if(DateUtil.isCellDateFormatted(cell)){
                                  //读取日期格式
                                  System.out.print(cell.getDateCellValue()+" ");
                                  }else{
                                  //读取数字
                                  System.out.print(cell.getNumericCellValue()+" ");
                                  }

                                  注意:该类,会把,Excel中的,日期,也当成数字,所以在读取时,一定要判断是否是日期格式,如果是,则格式化成日期。我在项目中就碰到如此的,问题,几天都没有弄明白,很恼火,


                                  break;
                                  case Cell.CELL_TYPE_FORMULA:
                                  //读取公式
                                  System.out.print(cell.getCellFormula()+" ");
                                  break;
                                  case Cell.CELL_TYPE_STRING:
                                  //读取String
                                  System.out.print(cell.getRichStringCellValue().toString()+" ");
                                  break;
                                  }
                                  }
                                  System.out.println("");
                                  }
                                  }

你可能感兴趣的:(Excel,Apache,C,C++,C#)