主页 > 办公自动化 > 如何用Apache POI读取Excel

如何用Apache POI读取Excel

2023-02-04 06:17来源:m.sf1369.com作者:宇宇

首先POI是开源组织Apache出品的一个开源jar包,提供了方便解析Excel的API,我们可以非常方便的使用它来读取Excel。这里介绍3.5Final版本。

所需用到的jar包如下:

说到Excel,有2003和2007,格式是不一样的,用POI解析的方法也就不一样,Excel2003主要是使用org.apache.poi.hssf.usermodel包中的类来解析,而Excel2007就是使用org.apache.poi.xssf.usermodel来解析。

解析Excel2003源码

说到Excel,有2003和2007,格式是不一样的,用POI解析的方法也就不一样,Excel2003主要是使用org.apache.poi.hssf.usermodel包中的类来解析,而Excel2007就是使用org.apache.poi.xssf.usermodel来解析。

解析Excel2003源码

StringBuffer content = new StringBuffer();

  HSSFWorkbook workbook = new HSSFWorkbook(is); // 创建对Excel工作簿文件的引用

  for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {

   if (null != workbook.getSheetAt(numSheets)) {

    HSSFSheet aSheet = workbook.getSheetAt(numSheets); // 获得一个sheet

    for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++) {

     if (null != aSheet.getRow(rowNumOfSheet)) {

      HSSFRow aRow = aSheet.getRow(rowNumOfSheet); // 获得一行

      for (int cellNumOfRow = 0; cellNumOfRow <= aRow.getLastCellNum(); cellNumOfRow++) {

       if (null != aRow.getCell(cellNumOfRow)) {

        HSSFCell aCell = aRow.getCell(cellNumOfRow); // 获得列值

        if (aCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {

         content.append(aCell.getNumericCellValue() + \t);

        } else if (aCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {

         content.append(aCell.getBooleanCellValue() + \t);

        } else if (aCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {

         content.append(aCell.getStringCellValue() + \t);

        } else if (aCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA){

         content.append(aCell.getCellFormula() + \t);

        } else {

         continue;

        }

       }

       if(cellNumOfRow == aRow.getLastCellNum()) {

        content.append(\n);

       }

      }

     }

    }

   }

  }

  return content.toString().trim();

解析Excel2007和2003基本一样,只是将HSSFSheet,HSSFCell等都改成XSSFSheet,XSSFCell即可。

另外要提醒大家的是Excel的样式都是基于一个单元格的,所以用HSSFRow.getRowStyle()拿样式会出问题的,不一定会拿到你想要的样式。处理合并单元格是POI的一个难点,只能通过判断当前单元格是否在合并单元格之中,如果是,那此单元格的值便是这个合并单元格的首位置单元格的值,只有通过这样才能来处理合并单元格。

处理合并单元格的代码:

 public static boolean isMergedRegion(HSSFSheet sheet, HSSFCell cell) {

  //得到一个sheet中有多少个合并单元格

  int sheetmergerCount = sheet.getNumMergedRegions();

  for(int i = 0; i < sheetmergerCount; i++) {

   //得出具体的合并单元格

   CellRangeAddress ca = sheet.getMergedRegion(i);

   //得到合并单元格的起始行, 结束行, 起始列, 结束列

   int firstC = ca.getFirstColumn();

   int lastC = ca.getLastColumn();

   int firstR = ca.getFirstRow();

   int lastR = ca.getLastRow();

   //判断该单元格是否在合并单元格范围之内, 如果是, 则返回 true

   if(cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) {

    if(cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {

     return true;

    }

   }

  }

  return false;

 }

 public static String getMergedRegionValue(HSSFSheet sheet, HSSFCell cell) {

  //获得一个 sheet 中合并单元格的数量

  int sheetmergerCount = sheet.getNumMergedRegions();

  //便利合并单元格

  for(int i = 0; i < sheetmergerCount; i++) {

   //获得合并单元格

   CellRangeAddress ca = sheet.getMergedRegion(i);

   //获得合并单元格的起始行, 结束行, 起始列, 结束列

   int firstC = ca.getFirstColumn();

   int lastC = ca.getLastColumn();

   int firstR = ca.getFirstRow();

   int lastR = ca.getLastRow();

   //判断该单元格是否是在合并单元格中, 如果是, 则返回所在合并单元格的首单元格的值

   if(cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) {

    if(cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {

     HSSFRow fRow = sheet.getRow(firstR);

     HSSFCell fCell = fRow.getCell(firstC);

     //除了合并单元格首单元格的值, 其余的用(*)来区分

     if (fCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC && hasBorder(cell)) {

      return String.valueOf(fCell.getNumericCellValue());

     } else if (fCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN && hasBorder(cell)) {

      return String.valueOf(fCell.getBooleanCellValue());

     } else if (fCell.getCellType() == HSSFCell.CELL_TYPE_STRING && hasBorder(cell)) {

      return fCell.getStringCellValue();

     } else if (fCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA && hasBorder(cell)){

      return String.valueOf(fCell.getCellFormula());

     }

    }

   }

  }

  return ;

 }

相关推荐

企业办公软件都有哪些?

办公自动化 2024-01-14

数控车床自动编程用什么软件?

办公自动化 2024-01-12

写字间物业管理方案

办公自动化 2023-12-09

自动化的好处和坏处

办公自动化 2023-12-05

单片机有什么特征?

办公自动化 2023-11-27

excel2007教程|excel2007教程下载

办公自动化 2023-11-22