`
cobrano1
  • 浏览: 28601 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

开博第一篇: 一个Excel转换Java集合的工具类

阅读更多
一个把普通Excel文件转换成集合的工具类, 第一次使用POI,代码有些稚嫩,已经经过了测试, 现在的版本不支持Excel的公式, 只能针对数字和字符串。

package com.tarena.crm.util;

import java.io.FileInputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;
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 com.tarena.crm.entity.ConsulterProxy;

public class ExcelToCollectionUtil {
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger
			.getLogger(ExcelToCollectionUtil.class);

	/**
	 * Excel和对象成员的映射集合.
	 */
	private Properties pro;

	/**
	 * 列数
	 */
	private int count;
	/**
	 * Excel封装对象.
	 */
	private HSSFWorkbook hb;

	/**
	 * 坏数据静态异常类.
	 */
	public static class ExcelBadRecordException extends Exception {
		private StringBuilder ms = new StringBuilder();

		private boolean flag = false;

		public void addMessage(String s) {
			flag = true;
			ms.append(s + "\n");
		}

		public ExcelBadRecordException() {
			super();
		}

		@Override
		public String getMessage() {
			return ms.toString();
		}

		public boolean hasError() {
			return flag;
		}

	}

	private ExcelBadRecordException exception = new ExcelBadRecordException();

	/**
	 * 集合中所存储的对象类型.
	 */
	private Class clazz;

	public ExcelToCollectionUtil(Properties pro, HSSFWorkbook hb, Class clazz) {
		super();
		this.pro = pro;
		this.hb = hb;
		this.clazz = clazz;
		count=pro.keySet().size();
	}

	/**
	 * 从Excel导入到Collection
	 */
	public Collection toCollection() {
		Collection table = new ArrayList(); // 保存数据的集合
		HSSFSheet sheet = hb.getSheetAt(0); // 得到第一个sheet , 应该改进成可以选择的.
		HSSFRow head = sheet.getRow(0); // 得到第一行表头
		
		for (int i = 1;; i++) {
			HSSFRow row = sheet.getRow(i); // 得到一行记录

			if (row == null) // 判断是否为最后记录, 应该判断记录是否有效.
				break;
			HSSFCell cell = row.getCell((short) 0);
			if (cell == null
					|| (cell.getCellType() == HSSFCell.CELL_TYPE_STRING
					&& cell.getRichStringCellValue().getString().trim().equals(""))
					|| cell.getCellType() == HSSFCell.CELL_TYPE_BLANK)
				break;                  //判断每一行第一个单元格是否为有效数据.

			Object object = null;
			try {
				object = this.exchangObjectFromRow(head, row); // 通过一条记录产生一个对象
			} catch (Exception e) {
				// 遇到无效的数据跳过
				e.printStackTrace();
				exception.addMessage("第" + i + "条记录格式有错误!"); // 将无效记录异常内容存在ExcelBadRecordException对象里
				continue;
			}
			table.add(object); // 将产生的对象存入集合中
		}
		return table;
	}

	/**
	 * 抛出无效数据异常.
	 * 
	 * @throws ExcelBadRecordException
	 */
	public void showException() throws ExcelBadRecordException {
		if (exception.hasError()) {
			throw exception;
		}
	}

	/**
	 * 将一个row对象数据转换成javabean对象.
	 * 
	 * @param head
	 * @param row
	 * @return
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 */
	private Object exchangObjectFromRow(HSSFRow head, HSSFRow row)
			throws Exception {
		Object object = this.newInstance(clazz);
		for (int j = 0;j<count; j++) {
			HSSFCell cell = row.getCell((short) j); // 得到一个单元格.
			if(cell==null)							//假如为空跳过.
				continue;
			String attribute = head.getCell((short) j).getRichStringCellValue()
					.getString(); // 得到Excel中该列列名.
			String property = pro.getProperty(attribute); // 从Properties中得到对应的成员名
			Object value = null; // 成员对象
			if (property == null || property.equals("") || attribute.equals("")) // 防止有没有对应的字段映射
				continue;
			switch (cell.getCellType()) { // 判断单元格的数据类型,做不同处理.
			case HSSFCell.CELL_TYPE_STRING: // 判断是字符串类型
				value = cell.getRichStringCellValue().getString(); // 得到对象的成员对象.
				break;
			case HSSFCell.CELL_TYPE_NUMERIC: // 判断是数字类型
				if (HSSFDateUtil.isCellDateFormatted(cell)) { // 判断是标准日期类型(1996-1-1)
					value = cell.getDateCellValue(); // 得到对象的成员对象.
				} else {
					value = new Double(cell.getNumericCellValue()).longValue();
				}
				break;
			case HSSFCell.CELL_TYPE_BLANK: // 判断是空白类型
				value = "";
				break;
			default:
				logger.debug("第" + j + "列为非字符串和数字的类型,类型编号为"
						+ cell.getCellType());
			}
			
			BeanUtils.setProperty(object, property, value);

		}
		if (logger.isDebugEnabled()) {
			logger.debug(BeanUtils.describe(object));
		}
		return object;
	}

	/**
	 * 创建对象.
	 * 
	 * @param clazz
	 * @return
	 */
	private Object newInstance(Class clazz) {
		try {
			return clazz.newInstance();
		} catch (Exception e) {
			logger.error(e.getMessage());
		}
		return null;
	}

	public static void main(String[] args) throws Exception {
		// URL url=new URL("http://localhost:8080/crm/temp/text.xls");
		// InputStream is=url.openStream();
		FileInputStream is = new FileInputStream("e:\\project\\ConsulterTemplate.xls");

		HSSFWorkbook book = new HSSFWorkbook(is);
		Properties pro = new Properties();
		pro.load(ExcelToCollectionUtil.class.getClassLoader()
				.getResourceAsStream("ConsulterProxy.properties"));
		ExcelToCollectionUtil util = new ExcelToCollectionUtil(pro, book,
				ConsulterProxy.class);
		Collection col = util.toCollection();
		Iterator it = col.iterator();
		while (it.hasNext()) {
			ConsulterProxy p=(ConsulterProxy)it.next();
			//System.out.println(p.getProvinceString());
		}

		util.showException();
		

	}

}
5
1
分享到:
评论
1 楼 lyunzhd 2008-01-17  
down下来研究下下 thx

相关推荐

    java中,list集合数据导出到excel表格通用工具类

    本实例提供了一个通用工具类,能够处理多种不同类型的对象集合,实现了最大化的通用性,使得开发者可以灵活地将各种业务数据转化为易于查看和分析的Excel格式。 首先,我们需要了解Java中处理Excel文件的库,如...

    Java poi导入导出EXCEL工具类(兼容各版本)

    概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...

    java上传并读取excel工具类

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

    Java Excel转为PDF(aspose)工具类 复造轮子

    接下来,我们将创建一个工具类,实现Excel到PDF的转换。以下是一个简单的示例: ```java import com.aspose.cells.*; public class ExcelToPdfConverter { public static void convertExcelToPdf(String ...

    Java aspose Excel转为 pdf工具类

    本篇文章将详细讲解如何使用Aspose库在Java中实现Excel到PDF的转换,并提供一个简洁的工具类示例。 首先,要使用Aspose库,你需要在项目中引入相应的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:...

    java实现Excel转换工具

    Java 实现 Excel 转换工具是一个非常实用的技能,特别是在数据处理和分析领域。Apache POI 是一个广泛使用的开源库,它允许开发者使用 Java 语言来读取、写入和修改 Microsoft Office 格式的文件,包括 Excel。下面...

    Java中Excel转图片工具包(纯java)

    "Java中Excel转图片工具包(纯java)"就是这样一个解决方案,它实现了将Excel文件通过PDF中间格式转化为图片的功能。 首先,让我们了解一下这个工具包的工作原理。Excel文件本身并不直接支持转换为图片格式,但可以...

    Java将2个List集合合并到一个List里面并排序工具类

    1、Java编程资源,定义了一个名为`ListMerger`的工具类,主要包含一个名为`mergeAndSortLists`的静态方法。此方法用于将两个已经根据时间顺序排列的List合并成一个新的单一List,并进行排序。 2、该类设计有泛型,...

    java XML 和json 转换工具类

    java XML 和json 转换工具类 java XML 和json 转换工具类java XML 和json 转换工具类 java XML 和json 转换工具类java XML 和json 转换工具类 java XML 和json 转换工具类java XML 和json 转换工具类 java XML 和...

    Java Excel,Work 操作工具类

    Easypoi是一个基于Apache POI的Java Excel处理工具,它通过提供一系列注解和简化API,使得开发者能够在极短的代码量下完成复杂的Excel操作。例如,利用Easypoi,只需5行代码就能实现Excel的导出,这在传统的POI使用...

    java 进制转换工具类 java 进制转换工具类

    java 进制转换工具类 java 进制转换工具类java 进制转换工具类 java 进制转换工具类java 进制转换工具类 java 进制转换工具类java 进制转换工具类 java 进制转换工具类java 进制转换工具类 java 进制转换工具类java ...

    java的xml和json相互转换工具类,亲测直接用

    本篇文章将详细介绍Java中如何实现XML和JSON的相互转换,并提供一个名为`XmlToJson.java`的工具类作为参考。 首先,XML是一种结构化的数据表示方式,它以树形结构存储数据,易于人类阅读和编写,同时也易于机器解析...

    【强2】30个java工具类

    [工具类] 一个压缩工具类.java.txt [工具类] 用java编写简单UDP网络通信程序 .java.txt [工具类] 中文验证.jsp.txt [工具类] 日期DateUtil.java [工具类] 文件FileUtil.java [工具类] 通信客户端simpleClient.java ...

    java将excel转html

    首先,Apache POI是Java的一个开源库,专门用于处理Microsoft Office格式的文件,如Excel(.xls和.xlsx)。它提供了一组API,使开发人员能够创建、修改和读取Excel文件。在“java将excel转html”的场景中,我们需要...

    Excel Java工具类

    Excel工具类,支持生成自定义Excel,支持浏览器下载Excel

    基于POI的Excel多Sheet页导出导入工具类

    "基于POI的Excel多Sheet页导出导入工具类"是一个实用的Java类库,专为处理Excel文件中的多个工作表(Sheet)而设计,提供了一种高效且灵活的方式来操作Excel数据。 该工具类的核心功能包括: 1. **多Sheet页操作**...

    Excel导出工具类

    本篇文章将深入探讨如何利用Java的Apache POI库创建一个能够处理`List&lt;Object&gt;`数据的Excel工具类。 Apache POI是一个流行的开源库,它允许程序员创建、修改和显示Microsoft Office格式的文件,包括Excel(.xls和....

    java导出Excel工具类和支持包

    本资源包含一个名为`ExportExcelUtil.java`的Java工具类,专门用于处理这种任务,以及`poi3.7.zip`,这是一个Apache POI库的压缩包,它是Java操作Microsoft Office格式文件(如Excel)的重要支持库。 Apache POI是...

    C++转换JAVA工具

    1. **项目迁移**:当一个组织从C++项目迁移到Java平台,或者反之,工具可以帮助快速地完成代码库的转换。 2. **混合编程**:如果一个项目需要C++的高性能部分和Java的跨平台优势,转换工具可以用来创建接口,使两者...

    java生成excel工具类和demo

    本示例涉及的“java生成excel工具类和demo”是关于如何在Java环境中使用Apache POI库来创建和导出Excel文件的一个实践案例。Apache POI是一个流行的开源库,它允许开发者读写Microsoft Office格式的文件,包括Excel...

Global site tag (gtag.js) - Google Analytics