问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用Apache POI读取Excel

发布网友 发布时间:2022-04-21 13:01

我来回答

1个回答

热心网友 时间:2023-07-21 16:39

  首先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 "";
 }

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
新轩逸保养一次多少钱? ...每个小长方形的周长是多少厘米?(你能想出几 铅的正常是多少合适 两个同样的长方形,长是8分米,宽4分米。把它们拼成一个长方形,它的周长... ...拼成一个大长方形拼成的长方形的周长是多少分米 ...长8分米,宽是4分米,如果把它们拼成一个长方形,这个长方形的周长是... ...如果把它们拼成长方形,这个长方形的周长是多少? ...把它们拼成一个正方形,周长是___分米;把它们拼成一个长方... 把两个边长是4分米的正方形拼成一个长方形,这个长方形的周长是___ ...长是8分米,宽是4分米.如果把它们拼成一个长方形,这个长方形的周长是... 怎么双开微信 poi读取excel 列宽 POI 如何读取EXcel表,之后如何存入List集合中。 手机微信双开怎么弄 Java POI读取Excel的时候怎么按列读取 java poi怎么获取excel单元格的内容 poi读取excel文件内容 poi怎么从excel读取数据 poi读取excel需要做哪些操作 POI 读取excel 用户名指的是什么? 华为畅享10如何开2个录音权限? 华为怎么设置通话录音权限 华为mate40pro手机录音权限怎么开 微信名称和有什么区别 一方银行卡号错误,转账的一方资金会被冻结吗? 在工行转账卡号填错了,钱多久会退回来。 转账转错卡号了怎么能追回 转账时写错卡号钱多久可以退回 转账时姓名对了卡号错了能退回来吗 poi 怎样读取Excel中的复选框的值??? 手机怎么设置双微信 如何使用POI 的“事件模型Event API”读取excel数据 微信怎么开双开 java poi 读取Excel数据,Excel表格格式不一 如何用Apache POI读取Excel 如何将word文档的身份证号码转换到excel文档 poi读取Excel时,如果单元格设置的是数字格式,如何解决整数与小数问题 word文档中身份证号码怎样复制到电子表格 Java使用poi读取excel的时候出现这种情况是怎么回事 大量身份证号码如何从word中粘贴到excel中? poi 读取excel 怎么样处理自动求和的函数 怎样把身份证号从Word粘到Excel中 怎么将word文档中的身份证号直接复制到Excel中 怎么将word中的很多身份证号码直接复制到EXCEL中去 怎样把word中的身份证号复制到excel中 如何把word文档中姓名和身份证号复制到excel表格中 怎么把身份证号码从word里批量复制到excel里? 如何将word中的身份证号码批量复制到excel中? word文档中的身份证号怎么复制到excel