一个把普通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();
}
}
分享到:
相关推荐
java Excel相关处理 工具类 java Excel相关处理 工具类java Excel相关处理 工具类 java Excel相关处理 工具类java Excel相关处理 工具类 java Excel相关处理 工具类java Excel相关处理 工具类 java Excel相关处理 ...
java 进制转换工具类 java 进制转换工具类java 进制转换工具类 java 进制转换工具类java 进制转换工具类 java 进制转换工具类
本篇文章将详细讲解如何使用Aspose库在Java中实现Excel到PDF的转换,并提供一个简洁的工具类示例。 首先,要使用Aspose库,你需要在项目中引入相应的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:...
Java 实现 Excel 转换工具是一个非常实用的技能,特别是在数据处理和分析领域。Apache POI 是一个广泛使用的开源库,它允许开发者使用 Java 语言来读取、写入和修改 Microsoft Office 格式的文件,包括 Excel。下面...
在Java编程中,工具类(Util Classes)是程序员日常工作中不可或缺的部分,它们提供了一系列静态方法,用于执行常见的任务,如JSON解析、日期处理、字符串操作等。以下是对标题和描述中涉及的知识点的详细说明: 1....
Easypoi是一个基于Apache POI的Java Excel处理工具,它通过提供一系列注解和简化API,使得开发者能够在极短的代码量下完成复杂的Excel操作。例如,利用Easypoi,只需5行代码就能实现Excel的导出,这在传统的POI使用...
在Java编程语言中,工具类集合是一系列实用的类,它们提供了各种通用功能,帮助开发者更高效地编写代码。这些工具类通常包含在Java的`java.util`以及其他相关的包中,如`java.text`,`javax.imageio`,`javax.xml`等...
1. **读取Excel文件**:这个工具类可能会有一个静态方法,接收Excel文件路径作为参数,然后返回一个二维数组,其中每个元素对应Excel的一个单元格值。 2. **写入Excel文件**:允许开发者传入二维数组或其他数据结构...
本篇文章将详细介绍Java中如何实现XML和JSON的相互转换,并提供一个名为`XmlToJson.java`的工具类作为参考。 首先,XML是一种结构化的数据表示方式,它以树形结构存储数据,易于人类阅读和编写,同时也易于机器解析...
标题提到的"50个左右的JAVA工具类,相对比较全"表明这是一个集合了大量常用工具方法的资源包。描述中指出,这些工具类是开发者多年工作经验的结晶,涵盖了一些常见的需求,但可能并不完美,可能存在一些遗漏,欢迎...
总结一下,`MapUtils`工具类是Java开发中的一个实用组件,它简化了`Map`数据与实体类之间的转换。通过提供便利的方法,开发者可以快速地将键值对数据转换为具有相应属性的对象,反之亦然。这种数据转换能力在处理...
本工具类就是基于Java POI实现的,旨在提供一个通用的解决方案,用于从Excel模板导入数据,同时兼容2003和2007两种版本的Excel文件。 Excel模板导入通用工具类的核心功能可能包括以下几个方面: 1. **模板解析**:...
在本压缩包"excel导入导出(poi工具类).zip"中,我们可以预见到包含了一个或多个Java工具类,这些类可能封装了使用Apache POI进行Excel文件导入和导出的功能。接下来,我们将详细探讨Apache POI库以及如何利用它来...
Java是一种广泛使用的编程语言,其丰富的库和工具类极大地提升了开发效率。在Java中,工具类通常是封装了常见操作的静态方法集合,便于开发者在不同项目中复用。本资源包含了一系列全面的Java工具类,涵盖了多个核心...
以上只是Java工具类的一部分,实际上Java API包含的工具类远不止这些,每一个都旨在解决特定的问题,让开发者能更专注于业务逻辑,而不是基础功能的实现。通过熟练掌握并运用这些工具类,可以大大提高Java开发的效率...
`JacksonUtils`通常是一个自定义的工具类,开发者为了简化使用Jackson库而封装的一系列静态方法。这些方法通常包括对单个对象或集合的序列化和反序列化,以及JSON解析等。以下是一些可能存在于`JacksonUtils`中的...
用于java,byte与各种对象的转换,Integer、short、hex、string
### EXCEL文件导入:JAVA读取...总之,Apache POI是一个功能强大且易于使用的Java库,为Java开发者提供了丰富的工具来处理Excel文件。无论是简单的数据导入导出还是复杂的数据分析和报表生成,POI都能提供有效的支持。
总之,"EXCEL版本转换工具"是一个实用的解决方案,它解决了不同Excel版本之间的兼容性问题,使得信息交流和协作更加顺畅。用户只需简单几步操作,就能轻松实现文件格式的转换,大大提升了工作效率。
`JAVA 转换字符编码工具`可能是一个用于处理字符编码转换的Java程序,旨在帮助开发者解决不同编码格式之间转换的问题。这篇博文链接(虽然没有提供具体内容)可能详细介绍了这个工具的实现原理和使用方法。 在Java...