`

【转】apache poi 读取excel

阅读更多
摘要: 适用于Microsoft Excel xls/xlsx两种类型电子表格的读取操作。

        网上关于介绍Apache POI操作Excel的文章已经很多了,但都讲得比较复杂。poi的API 与实际使用中的Excel很类似,可以说是POI把Excel中的workbook、sheet、cell等对象化了,在实际使用中极易理解。但由于Apache POI在存在已有不短时间,至少在excel2007之前就已经出现,造成同样一套Api并不能同时读取(写入)xls和xlsx两种类型的Excel文件。但poi对excel有一个很好的抽象(ss包下的Workbook、Sheet、Cell等类),可以一定程度上忽略xls/xlsx的处理细节,针对其通用部分进行处理,但如果需要对各自有理强的支持,还是建议使用相应的API。

    Apache POI 各个包功能描述:
        HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
        XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
        HWPF - 提供读写Microsoft Word DOC格式档案的功能。
        HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
        HDGF - 提供读Microsoft Visio格式档案的功能。
        HPBF - 提供读Microsoft Publisher格式档案的功能。
        HSMF - 提供读Microsoft Outlook格式档案的功能。

下面给出一个简单的实现Demo:
    package net.yeah.likun_zhang.excel;

import static net.yeah.likun_zhang.util.Debug.printf;

import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import net.yeah.likun_zhang.util.Debug;

import org.apache.commons.lang3.StringUtils;
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.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * 读取Excel 97~2003 xls格式 /2007~ xlsx格式
 * @author		ZhangLiKun
 * @mail		likun_zhang@yeah.net
 * @date		2013-5-11
 */
public class ExcelReader {

	/**
	 * 创建工作簿对象
	 * @param filePath
	 * @return
	 * @throws IOException
	 * @date	2013-5-11
	 */
	public static final Workbook createWb(String filePath) throws IOException {
		if(StringUtils.isBlank(filePath)) {
			throw new IllegalArgumentException("参数错误!!!") ;
		}
		if(filePath.trim().toLowerCase().endsWith("xls")) {
			return new HSSFWorkbook(new FileInputStream(filePath)) ;
		} else if(filePath.trim().toLowerCase().endsWith("xlsx")) {
			return new XSSFWorkbook(new FileInputStream(filePath)) ;
		} else {
			throw new IllegalArgumentException("不支持除:xls/xlsx以外的文件格式!!!") ;
		}
	}
	
	public static final Sheet getSheet(Workbook wb ,String sheetName) {
		return wb.getSheet(sheetName) ;
	}
	
	public static final Sheet getSheet(Workbook wb ,int index) {
		return wb.getSheetAt(index) ;
	}
	
	public static final List<Object[]> listFromSheet(Sheet sheet) {
		
		int rowTotal = sheet.getPhysicalNumberOfRows() ;
		Debug.printf("{}共有{}行记录!" ,sheet.getSheetName() ,rowTotal) ;
		
		List<Object[]> list = new ArrayList<Object[]>() ;
		for(int r = sheet.getFirstRowNum() ; r <= sheet.getLastRowNum() ; r ++) {
			Row row = sheet.getRow(r) ;
			if(row == null)continue ;
			// 不能用row.getPhysicalNumberOfCells(),可能会有空cell导致索引溢出
			// 使用row.getLastCellNum()至少可以保证索引不溢出,但会有很多Null值,如果使用集合的话,就不说了
			Object[] cells = new Object[row.getLastCellNum()] ;	
			for(int c = row.getFirstCellNum() ; c <= row.getLastCellNum() ; c++) {
				Cell cell = row.getCell(c) ;
				if(cell == null)continue ;
				cells[c] = getValueFromCell(cell) ;
			}
			list.add(cells) ;
		}
		
		return list ;
	}
	
	
	/**
	 * 获取单元格内文本信息
	 * @param cell
	 * @return
	 * @date	2013-5-8
	 */
	public static final String getValueFromCell(Cell cell) {
		if(cell == null) {
			printf("Cell is null !!!") ;
			return null ;
		}
		String value = null ;
		switch(cell.getCellType()) {
			case Cell.CELL_TYPE_NUMERIC :	// 数字
				if(HSSFDateUtil.isCellDateFormatted(cell)) {		// 如果是日期类型
					value = new SimpleDateFormat(DatePattern.LOCALE_ZH_DATE.getValue()).format(cell.getDateCellValue()) ;
				} else 	value = String.valueOf(cell.getNumericCellValue()) ;
				break ;
			case Cell.CELL_TYPE_STRING:		// 字符串
				value = cell.getStringCellValue() ;
				break ;
			case Cell.CELL_TYPE_FORMULA:	// 公式
				// 用数字方式获取公式结果,根据值判断是否为日期类型
				double numericValue = cell.getNumericCellValue() ;
				if(HSSFDateUtil.isValidExcelDate(numericValue)) {	// 如果是日期类型
					value = new SimpleDateFormat(DatePattern.LOCALE_ZH_DATE.getValue()).format(cell.getDateCellValue()) ;
				} else 	value = String.valueOf(numericValue) ;
				break ;
			case Cell.CELL_TYPE_BLANK:				// 空白
				value = ExcelConstants.EMPTY_CELL_VALUE ;
				break ;
			case Cell.CELL_TYPE_BOOLEAN:			// Boolean
				value = String.valueOf(cell.getBooleanCellValue()) ;
				break ;
			case Cell.CELL_TYPE_ERROR:				// Error,返回错误码
				value = String.valueOf(cell.getErrorCellValue()) ;
				break ;
			default:value = StringUtils.EMPTY ;break ;
		}
		// 使用[]记录坐标
		return value + "["+cell.getRowIndex()+","+cell.getColumnIndex()+"]" ;
	}	
	
}








测试类[ExcelReaderTest]
package net.yeah.likun_zhang.excel;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

import net.yeah.likun_zhang.BaseTest;
import net.yeah.likun_zhang.util.Debug;
import net.yeah.likun_zhang.util.ToString;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;

/**
 * 读取
 * @author		ZhangLiKun
 * @mail		likun_zhang@yeah.net
 * @date		2013-5-8
 */
public class ExcelReaderTest extends BaseTest{

	@Test
	public void testRead() throws FileNotFoundException, IOException {
		Workbook wb = ExcelReader.createWb("src/main/resources/excels/demo-3.xlsx") ;
		
		// 获取Workbook中Sheet个数
		int sheetTotal = wb.getNumberOfSheets() ;
		Debug.printf("工作簿中的工作表个数为:{}" ,sheetTotal);
		
		// 获取Sheet
		Sheet sheet = ExcelReader.getSheet(wb, 0) ;
		
		// 遍历Sheet
		List<Object[]> list = ExcelReader.listFromSheet(sheet) ;
		Debug.printf(list, new ToString<Object[]>(){
			private int index = 1 ; 
			@Override
			public String toString(Object[] t) {
				
				if(t == null || t.length == 0)return StringUtils.EMPTY ;
				StringBuffer sb = new StringBuffer(index ++ + ":") ;
				for(int i = 0 ,len = t.length ; i < len ; i++) {
					sb.append(t[i] + ",") ;
				}
				return sb.toString();
			}
		}) ;
		
	}
	
}



测试辅助类[Debug]
package net.yeah.likun_zhang.util;

import java.util.Collection;
import java.util.Iterator;

import org.apache.commons.lang3.ArrayUtils;

/**
 * Debug函数库
 * @author		ZhangLiKun
 * @mail		likun_zhang@yeah.net
 * @date		2013-5-8
 */
public class Debug {

	/**
	 * 打印函数
	 * @param objects
	 * @date	2013-5-8
	 */
	public static final void printf(String msg ,Object ...objects) {
		if(ArrayUtils.isEmpty(objects)) {
			System.out.println(msg);
			return ;
		}
		for(int i = 0 ,len = objects.length ; i < len ; i ++) {
			Object obj = objects[i] ;
			msg = msg.replaceFirst("\\{\\}", obj == null ? "" : obj.toString()) ;
		}
		System.out.println(msg);
	}
	
	/**
	 * 打印函数
	 * @param obj
	 * @date	2013-5-8
	 */
	public static final void printf(Object obj) {
		if(obj != null){
			System.out.println(obj.toString());
		}
	}	
	
	/**
	 * 打印集合
	 * @param list
	 * @param ts
	 * @date	2013-5-8
	 */
	public static final <T> void printf(Collection<T> list ,ToString<T> ts) {
		if(list == null || list.isEmpty()) return ;
		Iterator<T> iter = list.iterator() ;
		while(iter.hasNext()) {
			T t = iter.next() ;
//			if(t == null)continue ;
			if(ts == null) {
				System.out.println(t.toString());
			} else {
				String msg = ts.toString(t) ;
//				if(msg != null) {
					System.out.println(msg);
//				}
			}
		}
	}
	
}










分享到:
评论

相关推荐

    apache POI 读取 Excel

    apache poi 读取 Excel 的 jar 包 博文链接:https://wxinpeng.iteye.com/blog/231895

    POI读取Excel带格式数据

    标题 "POI读取Excel带格式数据" 涉及到的是Apache POI库在Java中的使用,这个库允许开发者处理Microsoft Office格式的文件,包括Excel。Apache POI是一个开源项目,提供了API来读取、写入和修改Excel文档。在本场景...

    利用POI读取excel写入到word

    以上就是使用Apache POI读取Excel数据并写入Word的基本流程。在实际应用中,你可能需要处理更复杂的情况,比如合并单元格、处理公式、格式转换等,这都需要对POI API有更深入的理解。同时,为了提高性能,可以考虑...

    Java使用apache POI读取Excel2007以上代码以及所需jar包

    本文将详细介绍如何使用Apache POI库来读取Excel 2007及以上版本(即XLSX格式)的文件,并提供所需的jar包信息。 首先,要使用Apache POI读取XLSX文件,你需要确保引入了正确的依赖。Apache POI项目提供了多个组件...

    apache POI文件读写excel

    3. **读取Excel文件** - 使用`WorkbookFactory`创建`Workbook`对象,这可以是HSSFWorkbook(HSSF)或XSSFWorkbook(XSSF)。 - 通过`Workbook`获取`Sheet`对象,表示工作表。 - `Sheet`中包含多个`Row`,每个`Row...

    apache poi 读取Excel文件内容(2003,2007)

    这篇博文主要讲解如何使用Apache POI库来读取Excel文件的内容,无论是2003版的.XLS还是2007版及以后的.XLSX格式。 在Java编程中,Apache POI 提供了丰富的API,使得开发者可以方便地操作Excel文件。首先,我们需要...

    poi读取excel文件

    标题提到的"poi读取excel文件",指的是使用Apache POI库来处理Excel数据。在最新的版本中,POI引入了更高效和强大的功能,使得处理Excel文件变得更加方便。 描述中提到了"最新版poi相关的6个jar包",这些jar包是...

    POI读取excel的内容.zip

    本教程将详细讲解如何使用Apache POI库来读取Excel文件的内容。 首先,为了在Java项目中使用Apache POI,我们需要通过Maven进行依赖管理。在`pom.xml`文件中添加以下依赖: ```xml &lt;groupId&gt;org.apache.poi ...

    Apache poi 操作 excel 文件压缩包

    在Java环境中,Apache POI 提供了一套API,使得开发者能够创建、修改和读取Excel文件。这个压缩包包含了Apache POI库的多个版本及其依赖库,如ooxml-schemas、xmlbeans等,用于支持对Excel文件的OOXML(Office Open ...

    android POI 读取excel 精简jar

    在Android平台上,使用Apache POI库来读取Excel文件是一种常见的解决方案。Apache POI是一个流行的开源项目,它允许程序员创建、修改和显示Microsoft Office格式的文件,包括Excel(.xls和.xlsx)。在这个“android ...

    poi读取excel文件实例(兼容excel2007)

    在“poi读取excel文件实例”中,我们将讨论如何使用Apache POI API来读取和操作Excel 2007文件。以下是一些关键知识点: 1. **创建工作簿对象**:首先,你需要通过`WorkbookFactory`类的`create()`方法打开或创建一...

    poi读取excel并输出到jsp页面

    标题中的“poi读取excel并输出到jsp页面”是指使用Apache POI库来处理Microsoft Excel文件,并将数据在JavaServer Pages (JSP) 页面上显示的技术。Apache POI 是一个开源项目,它允许开发者创建、修改和显示MS ...

    Apache POI Excel操作

    在Java开发环境中,Apache POI 提供了丰富的API,使得开发者能够方便地在程序中创建、修改和读取Excel文件。本篇将详细介绍Apache POI在Excel操作中的应用,包括基本概念、使用步骤、关键类和方法以及实际示例。 1....

    Apache Poi Excel导出

    在Java开发中,Apache POI 提供了一种高效且灵活的方式来创建、修改和读取Excel工作簿。这篇博客“Apache Poi Excel导出”可能详细介绍了如何使用Apache POI库来生成Excel文件,特别适用于数据导出或报表生成等场景...

    Apache POI for Android

    - **读取Excel**:使用Apache POI,开发者可以打开Excel文件,访问工作簿、工作表,以及单元格中的数据。例如,通过`WorkbookFactory.create()`方法加载文件,然后遍历工作表和单元格进行数据提取。 - **写入Excel...

    apache poi解析Excel时报错,我将Excel打开后保存,就不会报错,用jar完美解决

    apache poi解析Excel时报错,我将Excel打开后保存,就不会报错,我将重写的类从新打包这样问题虽然网上有解决方案,但是需要自己打包重写对应类,我已将这些步骤做好了。

    poi读取Excel用到的jar包

    标题提到的“poi读取Excel用到的jar包”指的是在Java项目中使用POI库进行Excel操作所需引入的依赖文件。这些jar包在描述中给出,包括了以下几个: 1. poi-ooxml-schemas-3.8-beta5-20111217.jar:这个文件包含了...

    poi读取excel的jar包

    标题中的"poi读取excel的jar包"指的是Apache POI库的一个版本,它包含了读取Excel 2007文件所需的类和方法。在Java程序中,引入这个jar包后,开发者可以编写代码来处理.xlsx文件,无论是读取数据、解析工作表还是...

    POI读取EXCEL教程

    读取Excel文件使用HSSF的usermodel API非常直观。首先,你需要创建一个`InputStream`,然后实例化`HSSFWorkbook`: ```java InputStream myxls = new FileInputStream("workbook.xls"); HSSFWorkbook wb = new ...

Global site tag (gtag.js) - Google Analytics