使用POI读取excel文件内容
1.前言
项目中要求读取excel文件内容,并将其转化为xml格式。常见读取excel文档一般使用POI和JExcelAPI这两个工具。这里我们介绍使用POI实现读取excel文档。
2.代码实例:
package edu.sjtu.erplab.poi; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * 操作Excel表格的功能类 */ public class ExcelReader { private POIFSFileSystem fs; private HSSFWorkbook wb; private HSSFSheet sheet; private HSSFRow row; /** * 读取Excel表格表头的内容 * @param InputStream * @return String 表头内容的数组 */ public String[] readExcelTitle(InputStream is) { try { fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); } catch (IOException e) { e.printStackTrace(); } sheet = wb.getSheetAt(0); row = sheet.getRow(0); // 标题总列数 int colNum = row.getPhysicalNumberOfCells(); System.out.println("colNum:" + colNum); String[] title = new String[colNum]; for (int i = 0; i < colNum; i++) { //title[i] = getStringCellValue(row.getCell((short) i)); title[i] = getCellFormatValue(row.getCell((short) i)); } return title; } /** * 读取Excel数据内容 * @param InputStream * @return Map 包含单元格数据内容的Map对象 */ public Map<Integer, String> readExcelContent(InputStream is) { Map<Integer, String> content = new HashMap<Integer, String>(); String str = ""; try { fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); } catch (IOException e) { e.printStackTrace(); } 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() + // "-"; str += getCellFormatValue(row.getCell((short) j)).trim() + " "; j++; } content.put(i, str); str = ""; } return content; } /** * 获取单元格数据内容为字符串类型的数据 * * @param cell Excel单元格 * @return String 单元格数据内容 */ private String getStringCellValue(HSSFCell cell) { String strCell = ""; switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: strCell = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: strCell = String.valueOf(cell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_BOOLEAN: strCell = String.valueOf(cell.getBooleanCellValue()); break; case HSSFCell.CELL_TYPE_BLANK: strCell = ""; break; default: strCell = ""; break; } if (strCell.equals("") || strCell == null) { return ""; } if (cell == null) { return ""; } return strCell; } /** * 获取单元格数据内容为日期类型的数据 * * @param cell * Excel单元格 * @return String 单元格数据内容 */ private String getDateCellValue(HSSFCell cell) { String result = ""; try { int cellType = cell.getCellType(); if (cellType == HSSFCell.CELL_TYPE_NUMERIC) { Date date = cell.getDateCellValue(); result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1) + "-" + date.getDate(); } else if (cellType == HSSFCell.CELL_TYPE_STRING) { String date = getStringCellValue(cell); result = date.replaceAll("[年月]", "-").replace("日", "").trim(); } else if (cellType == HSSFCell.CELL_TYPE_BLANK) { result = ""; } } catch (Exception e) { System.out.println("日期格式不正确!"); e.printStackTrace(); } return result; } /** * 根据HSSFCell类型设置数据 * @param cell * @return */ private String getCellFormatValue(HSSFCell cell) { String cellvalue = ""; if (cell != null) { // 判断当前Cell的Type switch (cell.getCellType()) { // 如果当前Cell的Type为NUMERIC case HSSFCell.CELL_TYPE_NUMERIC: case HSSFCell.CELL_TYPE_FORMULA: { // 判断当前的cell是否为Date if (HSSFDateUtil.isCellDateFormatted(cell)) { // 如果是Date类型则,转化为Data格式 //方法1:这样子的data格式是带时分秒的:2011-10-12 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(cell.getNumericCellValue()); } break; } // 如果当前Cell的Type为STRIN case HSSFCell.CELL_TYPE_STRING: // 取得当前的Cell字符串 cellvalue = cell.getRichStringCellValue().getString(); break; // 默认的Cell值 default: cellvalue = " "; } } else { cellvalue = ""; } return cellvalue; } public static void main(String[] args) { try { // 对读取Excel表格标题测试 InputStream is = new FileInputStream("d:\\test2.xls"); ExcelReader excelReader = new ExcelReader(); String[] title = excelReader.readExcelTitle(is); System.out.println("获得Excel表格的标题:"); for (String s : title) { System.out.print(s + " "); } // 对读取Excel表格内容测试 InputStream is2 = new FileInputStream("d:\\test2.xls"); Map<Integer, String> map = excelReader.readExcelContent(is2); System.out.println("获得Excel表格的内容:"); for (int i = 1; i <= map.size(); i++) { System.out.println(map.get(i)); } } catch (FileNotFoundException e) { System.out.println("未找到指定路径的文件!"); e.printStackTrace(); } } }
3.总结
因为excel单元格中的内容往往都有一定的格式,比如日期型,数字型,字符串型,因此在读取的时候要进行格式判断,不然会出现错误。常见的就是不能正常读取日期。在代码实例中有一个方法:
getCellFormatValue(HSSFCell cell)
往这个方法中传入excel单元格就能识别单元格格式,并转化为正确的格式。
ps:2012-2-23
代码实例中有一段代码:
int colNum = row.getPhysicalNumberOfCells();
其中的HSSFRow.getPhysicalNumberOfCells();这个方法是用于获取一行中存在的单元格数,POI的官方API中有给出getPhysicalNumberOfCells方法的解释
getPhysicalNumberOfCells
public int getPhysicalNumberOfCells()
getPhysicalNumberOfCells
in interface Row
相关推荐
Java开发案例-springboot-52-POI导出Excel-源代码+文档.rar Java开发案例-springboot-52-POI导出Excel-源代码+文档.rar Java开发案例-springboot-52-POI导出Excel-源代码+文档.rar Java开发案例-springboot-52-POI...
`jxls-poi`是`jxls`的一个分支,专门针对Apache POI进行优化,支持使用POI API处理Excel文件。Apache POI是一个开源项目,提供了对Microsoft Office格式的读写支持,包括Excel。 首先,让我们了解`jxls`的工作原理...
【Easy-POI:Excel导入导出的轻量级开源组件】 Easy-POI是针对Java开发者设计的一款轻量级的开源组件,专门用于处理Excel的导入与导出任务。在现代企业应用中,Excel表格常常被用作数据交换、报表生成以及临时存储...
4. **poi-ooxml**: 这个模块专注于处理OOXML格式的文档,如新的Excel(.xlsx)、Word(.docx)和PowerPoint(.pptx)文件。它利用了ooxml-schemas中的定义,提供了一套API来操作这些基于XML的文件。 5. **poi-ooxml...
在使用display-export-poi-1.1.jar进行数据导出时,DisplayTag会利用Apache POI库将表格数据转换成Excel格式,并提供下载链接给用户。这个过程通常涉及设置导出的样式、格式和过滤条件,以便生成符合预期的Excel文件...
1. poi-3.15.jar:这是Apache POI的基础库,提供了对Microsoft Office格式文件的支持。 2. easypoi-base-3.0.3.jar:Easy-Poi的核心库,包含了基础的Excel操作功能。 3. easypoi-web-3.0.3.jar:主要用于Web环境下的...
java-poi-excel-导出20万条记录
在这个场景中,我们关注的是"displaytag-export-poi-1.2.jar",这是一个与Apache POI库结合使用的Displaytag扩展,用于支持Excel文件的导出。 Apache POI是Apache软件基金会的一个项目,主要用来处理Microsoft ...
这个“Ease-poi-jar包.zip”文件包含了一个名为“Ease-poi框架”的子文件,这很可能是Ease-poi库的实现代码。Apache POI是开源项目,它提供API来读取、写入和修改Microsoft Office格式的文件。 Apache POI 3.7是该...
这个“Apache-POI-3.9.zip”文件包含了Apache POI 3.9版本的相关资料,其中的“Apache-POI-3.9.chm”文件很可能是一个帮助文档或API参考手册。 Apache POI 提供了Java API,使得开发者可以在Java环境中读取、写入和...
标题提到的"poi-3.9、poi-ooxml-3.9、poi-ooxml-schemas-3.9"是Apache POI的不同组件或版本,它们在生成和操作Excel文件时起着关键作用。 1. poi-3.9.jar:这是Apache POI的主要库,包含了处理老版Microsoft Office...
poi-3.17适用于jdk1.7。 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 HSSF - 提供读写Microsoft Excel格式档案的功能。 XSSF - 提供读写...
### POI Excel知识点详解 #### 一、Jakarta POI简介与Apache POI的作用 Jakarta POI 是 Apache POI 的早期项目名称,它提供了一组 API 来处理 Microsoft Office 文件格式,特别是针对 Excel(`.xls` 和 `.xlsx`)...
本项目"springboot-poi-excel.zip"显然是一个整合了Spring Boot和Apache POI的示例,用于实现从数据库中导出数据到Excel,以及解析用户上传的Excel文件执行相应的操作。 1. **Spring Boot介绍** Spring Boot是由...
这个压缩包包含了POI项目的几个核心组件的jar文件,包括基础的`poi`库,以及支持Open XML格式(OOXML)的`poi-ooxml`和`poi-ooxml-schemas`。这些jar包在Java开发中非常有用,尤其是当你需要在应用程序中读取、写入...
在Java编程领域,Apache POI库是一个非常重要的工具,它允许开发者读取、写入和修改Microsoft Office格式的文件,包括Excel工作簿。本项目"ExcelImport.zip"专注于使用Java POI库处理Excel表格的导入与导出功能,...
本示例“java-poi-excel-导出20万条记录【源代码】”展示了如何使用Apache POI库来高效地处理大数据量的Excel导出,避免内存溢出的问题。Apache POI是一个流行的开源Java API,用于读写Microsoft Office格式的文件,...
1. `poi-3.16.jar`:这是Apache POI的核心库,包含了处理Excel(HSSF和XSSF)、Word(HWPF和XWPF)以及PowerPoint(HSLF和XSLF)文档的主要功能。HSSF和HWPF分别用于处理老版本的BIFF格式(Excel 97-2007)和Word 97...
只实现了简单的excel导入导出,不支持特殊模版的定义。...1、poi-excel 基本操作(工具) 2、自定义注解的使用 3、全局异常捕获的定义 4、jkd1.8新特性:Lambda 表达式 、函数式接口 等等 5、统一出参包装类 6、lombok
<artifactId>poi-ooxml <version>4.1.2 ``` 三、创建Excel文件 使用Apache POI创建新的Excel文件,你需要创建一个Workbook对象,然后在其上添加Sheet,最后在Sheet上添加Row和Cell。例如: ```java import org....