如何用Apache POI读取Excel
首先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 = firstC) { if(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 = firstC) { if(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 ""; }
基于Apache POI的Excel表格处理
通过apache 的poi方法完成excel的读写,cell数据读写等常规操作,支持xls xlsx表格格式。 需要添加依赖的jar资源,具体如下: xls格式的excel 表格需要通过HSSFWorkbook加载,而xlsx格式的excel表格需要XSSFWorkbook表格加载,获取WorkBook对象实例,这个实例对象就是表格文件的对象,具体为: 上面不同后缀的文件操作方法有所区分,分为两类,xls表格对应的HSSFWorkbook类方法,xlsx对应的XSSFWorkbook类方法,操作过程基本类似,下面以HSSFWorkbook为例进行讲述。( xls,xlsx只要获取到wb后,如果没有特别的处理操作,后续采用这两种方法的任一种都是可以进行表格数据处理,可以不做区分 ) 补充:获取wb后,wb提供的方法有很多,包括创建表格createSheet,获取表格名称getSheetName等等,具体根据自己需求使用。 正常来说,每个Excel文件都会有多个sheet表格,比如Sheet1,Sheet2,Sheet3等等,我们通过第一步获取的wb对象,就可以轻松的拿到Excel表格的实例对象,方法两种,可以根据Excel表格的index序号获取,也可以通过Excel表格的名字获取,具体如下: 补充:sheet对象同样提供了用于操作本表格的很多方法,包括行列读写,新填行列等等所有表格相关的操作内容。 上一步获取了sheet对象,我们就可以获取具体的行列数据了。 通过上述cell对象我们就可以获得具体的内容了,包括内容格式等等详细信息。 单元格读取方式根据其类型有所不同,具体如下所示。 如果想给新添加的Cell设置个字体格式及颜色啥的,也是可以的,比如把刚新建的Cell字体设为红色,具体如下: 上面步骤,只是对于表格数据的处理,但实际上并没有保存到文件,如果此时就结束,那表格文件里的数据其实是没有更改,一定要记得最后要保存到表格哦~,具体如下: 到此,基本的表格读写处理已经基本完成了,Poi的方法库其实有很多操作,这里只是简单介绍的基本的读写,如果你想修改表格字体等等,都是可以实现的哦,赶紧动手试试吧。 本程序Gitee源码地址: https://gitee.com/carmanshaw/excelpoi-master.git 开发的表格处理小工具地址: https://gitee.com/carmanshaw/ExcelProcessor.git