`
qq_24665727
  • 浏览: 120993 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java使用poi读取Excel文件例子

阅读更多
需要导入的包和 该例子读取的excel文件 在下面上传了,需要请下载:
package excel;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.List;

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.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
 * 读取excel文件
 * @author Jiacheng
 *Poi解析2003时使用的是HSSFCell,而2007的则是 
	XSSFCell,是完全不同的两套API
	必须先要判断excel的类型,不过 HSSFWorkbook 和 XSSFWorkbook 实现的接口都是一样的Workbook,直接在实例化接口的时候有点区别其他时候没有任何差异。
 */
public class ReadExcelUtil {
	public static List<List<Object>> readExcel(File file) throws IOException {
		String fileName = file.getName();
		String extension = fileName.lastIndexOf(".") == -1 ? "" : fileName
				.substring(fileName.lastIndexOf(".") + 1);
		if ("xls".equals(extension)) {
			return read2003Excel(file);
		} else if ("xlsx".equals(extension)) {
			return read2007Excel(file);
		} else {
			throw new IOException("不支持的文件类型");
		}
	}

	/**
	 * 读取 office 2003 excel
	 * 
	 * @throws IOException
	 * @throws FileNotFoundException
	 */
	private static List<List<Object>> read2003Excel(File file)
			throws IOException {
		List<List<Object>> list = new LinkedList<List<Object>>();
		HSSFWorkbook hwb = new HSSFWorkbook(new FileInputStream(file));
		HSSFSheet sheet = hwb.getSheetAt(0);
		Object value = null;
		HSSFRow row = null;
		HSSFCell cell = null;
		int counter = 0;
		for (int i = sheet.getFirstRowNum(); counter < sheet
				.getPhysicalNumberOfRows(); i++) {
//			if(i==0){
//				//跳过第一行
//				continue;
//			}
			row = sheet.getRow(i);
			List<Object> linked = new LinkedList<Object>();
			for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
				cell = row.getCell(j);
				if (cell == null) {
					value="无";//导入不能为空
					linked.add(value);
					//System.out.println(value);
					continue;
				}
				DecimalFormat df = new DecimalFormat("0");// 格式化 number String
															// 字符
				SimpleDateFormat sdf = new SimpleDateFormat(
						"yyyy-MM-dd");// 格式化日期字符串
				DecimalFormat nf = new DecimalFormat("0");// 格式化数字
				switch (cell.getCellType()) {
				case XSSFCell.CELL_TYPE_STRING:
					value = cell.getStringCellValue();
					//System.out.println(i + "行" + j + " 列 is String type" +"  "+value);
					break;
				case XSSFCell.CELL_TYPE_NUMERIC:
//					System.out.println(i + "行" + j
//							+ " 列 is Number type ; DateFormt:"
//							+ cell.getCellStyle().getDataFormatString());
					if ("@".equals(cell.getCellStyle().getDataFormatString())) {
						value = df.format(cell.getNumericCellValue());
					} else if ("General".equals(cell.getCellStyle()
							.getDataFormatString())) {
						value = nf.format(cell.getNumericCellValue());
					} else {
						value = sdf.format(HSSFDateUtil.getJavaDate(cell
								.getNumericCellValue()));
					}
					break;
				case XSSFCell.CELL_TYPE_BOOLEAN:
					value = cell.getBooleanCellValue();
					break;
				case XSSFCell.CELL_TYPE_BLANK:
					value = "";
					break;
				default:
					value = cell.toString();
				}
				if (value == null || "".equals(value)) {
					value="无";//导入不能为空
				}
				//System.out.println(value);
				linked.add(value);
			}
			list.add(linked);
		}
		return list;
	}

	/**
	 * 读取Office 2007 excel
	 * */
	private static List<List<Object>> read2007Excel(File file)
			throws IOException {
		List<List<Object>> list = new LinkedList<List<Object>>();
		// 构造 XSSFWorkbook 对象,strPath 传入文件路径
		XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));
		// 读取第一章表格内容
		XSSFSheet sheet = xwb.getSheetAt(0);
		Object value = null;
		XSSFRow row = null;
		XSSFCell cell = null;
		int counter = 0;
		for (int i = sheet.getFirstRowNum(); counter < sheet
				.getPhysicalNumberOfRows(); i++) {
			if(i==0){
				//跳过第一行
				continue;
			}
			row = sheet.getRow(i);
			if (row == null) {
			     break;
			}
			List<Object> linked = new LinkedList<Object>();
			for (int j = row.getFirstCellNum(); j <row.getLastCellNum(); j++) {
				cell = row.getCell(j);
				if (cell == null) {
					value="无";//导入不能为空
					linked.add(value);
					//System.out.println(value);
					continue;
				}
				//System.out.println(value);
				DecimalFormat df = new DecimalFormat("0");// 格式化 number String
															// 字符
				SimpleDateFormat sdf = new SimpleDateFormat(
						"yyyy-MM-dd");// 格式化日期字符串
				DecimalFormat nf = new DecimalFormat("0");// 格式化数字
				switch (cell.getCellType()) {
						case XSSFCell.CELL_TYPE_STRING:
							//System.out.println(i + "行" + j + " 列 is String type");
							value = cell.getStringCellValue();
							break;
						case XSSFCell.CELL_TYPE_NUMERIC:
						//	System.out.println(i + "行" + j
								//	+ " 列 is Number type ; DateFormt:"
								//	+ cell.getCellStyle().getDataFormatString());
							if ("@".equals(cell.getCellStyle().getDataFormatString())) {
								value = df.format(cell.getNumericCellValue());
							} else if ("General".equals(cell.getCellStyle()
									.getDataFormatString())) {
								value = nf.format(cell.getNumericCellValue());
							} else {
								value = sdf.format(HSSFDateUtil.getJavaDate(cell
										.getNumericCellValue()));
							}
							break;
						case XSSFCell.CELL_TYPE_BOOLEAN:
							value = cell.getBooleanCellValue();
							break;
						case XSSFCell.CELL_TYPE_BLANK://空格,空白
							value = "";
							break;
						default:
							value = cell.toString();
				}
				if (value == null || "".equals(value)) {
					value="无";//导入不能为空
				}
				//System.out.println(value);
				linked.add(value);
			}
			list.add(linked);
		}
		return list;
	}

	public static void main(String[] args) {
		try {
			int count=0;
			long time1=System.currentTimeMillis();
			List<List<Object>> list=readExcel(new File("D:\\test.xlsx"));
			System.out.println("读取花费时间:"+(System.currentTimeMillis()-time1)/1000.0);
			
			for(List<Object> list2 :list){
				count++;
				for(int i=0;i<list2.size();i++){
					System.out.print(list2.get(i)+"  ");
				}
				System.out.println("第"+count+"组");
			}
			System.out.println("ok!");
			// readExcel(new File("D:\\test.xls"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

  • lib.zip (9.8 MB)
  • 下载次数: 71
1
1
分享到:
评论
3 楼 尘土飞扬 2016-11-23  
cs6641468 写道
同学, 建议还是看看官方文档。

你肯定是百度找了一些抄来抄去过时的代码, POI那么nice的一个库,抽象层次那么好,却被用的面目全非。 获取一个WorkBook, 还非要还分什么excel 2007, excel 2003...., 是不是将来还要分excel 2018, excel 2020


那拿获取WorkBook来说,一句代码就够了:
try(Workbook wb = WorkbookFactory.create(excel,null,true)){
//todo
}
后面直接获取Sheet,Row接口,WorkBook自己会返回具体实现,不要再分什么HSSF,XSSF了!

WorkbookFactory在poi-ooxml-3.15.jar里,3.15是POI当前最新版本.



确实,这段代码有误导之嫌,新的poi已经不这样写了
2 楼 qq_24665727 2016-11-22  
cs6641468 写道
同学, 建议还是看看官方文档。

你肯定是百度找了一些抄来抄去过时的代码, POI那么nice的一个库,抽象层次那么好,却被用的面目全非。 获取一个WorkBook, 还非要还分什么excel 2007, excel 2003...., 是不是将来还要分excel 2018, excel 2020


那拿获取WorkBook来说,一句代码就够了:
try(Workbook wb = WorkbookFactory.create(excel,null,true)){
//todo
}
后面直接获取Sheet,Row接口,WorkBook自己会返回具体实现,不要再分什么HSSF,XSSF了!

WorkbookFactory在poi-ooxml-3.15.jar里,3.15是POI当前最新版本.


谢谢指点!!
1 楼 cs6641468 2016-11-22  
同学, 建议还是看看官方文档。

你肯定是百度找了一些抄来抄去过时的代码, POI那么nice的一个库,抽象层次那么好,却被用的面目全非。 获取一个WorkBook, 还非要还分什么excel 2007, excel 2003...., 是不是将来还要分excel 2018, excel 2020


那拿获取WorkBook来说,一句代码就够了:
try(Workbook wb = WorkbookFactory.create(excel,null,true)){
//todo
}
后面直接获取Sheet,Row接口,WorkBook自己会返回具体实现,不要再分什么HSSF,XSSF了!

WorkbookFactory在poi-ooxml-3.15.jar里,3.15是POI当前最新版本.

相关推荐

    POI读取excel的例子

    POI读取excel的例子

    JAVA_poi读取Excel.pdf

    JAVA POI 读取 Excel JAVA POI 是 Apache 的一个子项目,提供了一...本文总结了 JAVA POI 读取 Excel 的知识点,包括 POI 简介、Excel 文件的组织形式、POI 的主要对象、使用 POI 读取 Excel 和使用 POI 写入 Excel。

    Java 利用poi输出Excel文件

    在Java编程中,Apache POI库是一个非常流行的工具,它允许开发者读取、创建和修改Microsoft Office格式的文件,其中包括Excel。本篇文章将详细介绍如何利用Apache POI来生成Excel文件。 首先,Apache POI是一个开源...

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

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

    java poi操作excel小例子

    Apache POI 是一个流行的开源库,它允许开发者使用 Java 来读写 Microsoft Office 格式的文件,其中包括 Excel 工作簿(.xlsx 和 .xls 文件)。下面我们将深入探讨如何使用 Java POI 库来操作 Excel。 首先,我们...

    POI导出Excel文件

    Apache POI是一个流行的Java库,用于读取和写入Microsoft Office格式的文件,尤其是Excel(.xlsx和.xls)文件。这个实例提供了两种方法来导出Excel文件:通过Servlet和通过main方法。这两种方法都是在Java环境中操作...

    java使用poi在excel单元格添加超链接,设置字体颜色(csdn)————程序.pdf

    在Java开发中,Apache POI库是一个非常实用的工具,用于读取、写入和修改Microsoft Office格式的文件,特别是Excel。本篇文章主要探讨如何利用POI在Excel单元格中添加超链接,并设置字体颜色。 首先,为了使用...

    POI读取Excel带格式数据

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

    JAVA使用POI对Excel读取

    这就是使用Apache POI在Java中读取Excel文件的基本流程。你可以根据需要扩展此基础,例如处理公式、样式、超链接等更复杂的功能。记住, POI库提供了丰富的API,能够满足各种复杂的Excel操作需求。在实际应用中,...

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

    首先,要使用Apache POI读取XLSX文件,你需要确保引入了正确的依赖。Apache POI项目提供了多个组件,其中HSSF用于处理老版的BIFF格式(XLS),而XSSF则用于处理OOXML格式(XLSX)。因此,你需要在你的项目中包含以下...

    poi读取excel2007和2003兼容工具例子

    在这个"poi读取excel2007和2003兼容工具例子"中,我们将探讨如何使用POI来读取不同版本的Excel文件,特别是Excel 2003(.xls)和Excel 2007及更高版本(.xlsx)。 1. **Apache POI库**:Apache POI是Apache软件基金...

    java poi处理excel数据

    Java POI是Apache软件基金会下的一个开源项目,主要用于读写Microsoft Office格式的文件,特别是Excel。在Java开发中,当你需要处理Excel数据时,POI库是一个强大的工具。本压缩包包含了一些关键资源,帮助你理解和...

    poi读取excel并校验小例子

    在"poi读取excel并校验小例子"中,我们可能首先创建一个`XSSFWorkbook`实例来打开Excel文件,然后通过工作表索引获取对应的`XSSFSheet`对象。例如: ```java FileInputStream fis = new FileInputStream("example....

    java上传并读取excel工具类

    本篇文章将深入探讨如何使用Java实现Excel文件的上传和读取,重点关注`MultiFile`转换为`File`以及处理多Sheet页的技巧。 首先,我们需要了解Java中处理Excel的库。Apache POI是一个广泛使用的开源库,它提供了API...

    java 通过poi操作excel jar包

    描述中提到了"poi_3.17.jar poi_3.15.jar",这两个版本都是Apache POI库的一部分,它们提供了对Excel文件的读写支持。其中,poi_3.17.jar是较新的版本,可能包含了更多优化和错误修复。同时,还提到了"jxl.jar",这...

    java的POI操作Excel文件.pdf

    Java的Apache POI库是一个强大的工具,用于在服务器端生成、读取和修改Microsoft Office文件,特别是Excel文档。POI项目始于Apache的Jakarta子项目,其目标是处理OLE2对象,尤其是MS Excel(97-2002)文件。HSSF接口...

    java使用poi读取xls格式和xlsx格式的excel文件

    本主题将深入探讨如何使用POI读取.xls(BIFF8格式,Excel 97-2003)和.xlsx(OOXML格式,Excel 2007及以上版本)两种不同格式的Excel文件。 首先,我们需要导入必要的库。在上述的文件列表中,我们看到有poi-3.9....

    java读取excel简单例子

    jxl是一个流行的、免费的Java库,用于读取和写入Microsoft Excel格式的文件。在这个简单的例子中,我们将探讨如何使用jxl.jar来读取Excel数据,这对于初学者来说是一个很好的起点。 首先,你需要将jxl.jar添加到你...

Global site tag (gtag.js) - Google Analytics