package com.dp.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* Excel通用处理器
* @author jkxydp
*
*/
public class AllPurposeExcelProcesser {
/**
* 通过调用POI读Excel的较为通用的方式,其中约定:excel的第一行中每列的内容为字符串,并且与你定义的model中的字段相对应,你的类遵循JavaBean标准
* @param <T> 你希望读取后组装的数据结构定义
* @param excel 你要读取的文件
* @param modelType 你希望组装的数据的定义的字节码,该字节码描述中必须包含一个无参构造器
* @param sheetName 你要读取的文件中的工作表的名称
* @return 一个装载了读取后获得对象的List
* @throws FileNotFoundException
* @throws IOException
* @throws IllegalArgumentException
* @throws SecurityException
* @throws InstantiationException
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws NoSuchMethodException
*/
public static <T> List<T> read(File excel,Class<T> modelType,String sheetName) throws FileNotFoundException, IOException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
Method[] methods = modelType.getMethods();
Workbook wb = getWorkBook(excel);
if(wb == null)
return null;
List<T> models = new ArrayList<T>(); //创建容器,用于装置所有读取出来的model
Sheet sheet = wb.getSheet(sheetName); //根据提供的sheet名称拿到整张表
int rows = sheet.getPhysicalNumberOfRows();
Row zeroRow = sheet.getRow(0); //拿到第零行表格,解析列与字段之间的对应关系
Map<Integer,Method> colMark = new HashMap<Integer, Method>(); //存储方法与字段的对应关系
for(short i = 0; i < zeroRow.getLastCellNum(); i ++){
Cell tip = zeroRow.getCell(i);
if(null != tip && tip.getCellType() == Cell.CELL_TYPE_STRING) {
String curTipName = tip.getStringCellValue();
for(int j = 0; j < methods.length; j ++) {
if(("set" + curTipName.toUpperCase().charAt(0) + curTipName.substring(1)).equals(methods[j].getName())) {
colMark.put((int)i, methods[j]);
}
}
}
}
Cell curCell = null;
boolean flag = true;
for(int i = 1; i < rows; i ++) {
Row aModel = sheet.getRow(i);
if(null != aModel) {
T model = modelType.getConstructor().newInstance();
for(int col = 0; col < colMark.size(); col ++) {
curCell = aModel.getCell(col);
if(null != curCell){
switch (curCell.getCellType()) {
case Cell.CELL_TYPE_STRING:
case Cell.CELL_TYPE_FORMULA:
case Cell.CELL_TYPE_BLANK:
if(colMark.get(col).getParameterTypes()[0] == String.class) {
colMark.get(col).invoke(model, curCell.getStringCellValue());
} else {
flag = false;
}
break;
case Cell.CELL_TYPE_NUMERIC:
if(colMark.get(col).getParameterTypes()[0] == int.class || colMark.get(col).getParameterTypes()[0] == Integer.class) {
colMark.get(col).invoke(model, (int)Math.round(curCell.getNumericCellValue()));
} else if (colMark.get(col).getParameterTypes()[0] == Double.class || colMark.get(col).getParameterTypes()[0] == double.class) {
colMark.get(col).invoke(model, curCell.getNumericCellValue());
} else if(colMark.get(col).getParameterTypes()[0] == Float.class || colMark.get(col).getParameterTypes()[0] == float.class) {
colMark.get(col).invoke(model, (float)curCell.getNumericCellValue());
} else if(colMark.get(col).getParameterTypes()[0] == Long.class || colMark.get(col).getParameterTypes()[0] == long.class) {
colMark.get(col).invoke(model, Math.round(curCell.getNumericCellValue()));
} else if(colMark.get(col).getParameterTypes()[0] == Short.class || colMark.get(col).getParameterTypes()[0] == short.class) {
colMark.get(col).invoke(model, (short)Math.round(curCell.getNumericCellValue()));
} else if(colMark.get(col).getParameterTypes()[0] == Byte.class || colMark.get(col).getParameterTypes()[0] == byte.class) {
colMark.get(col).invoke(model, (byte)Math.round(curCell.getNumericCellValue()));
} else if(colMark.get(col).getParameterTypes()[0] == Date.class) {
colMark.get(col).invoke(model, curCell.getDateCellValue());
}else {
flag = false;
}
break;
case Cell.CELL_TYPE_BOOLEAN:
if(colMark.get(col).getParameterTypes()[0] == Boolean.class || colMark.get(col).getParameterTypes()[0] == boolean.class) {
colMark.get(col).invoke(model, curCell.getBooleanCellValue());
} else {
flag = false;
}
break;
default:
break;
}
if(!flag) break;
}
}
if(flag) models.add(model);
flag = true;
}
}
return models;
}
/**
* Excel处理2003与2007差异
*/
private static Workbook getWorkBook(File excel) throws FileNotFoundException, IOException {
return excel.getName().endsWith("xls") ?
new HSSFWorkbook(new BufferedInputStream(new FileInputStream(excel))) :
excel.getName().endsWith("xlsx") ?
new XSSFWorkbook(new BufferedInputStream(new FileInputStream(excel))):null;
}
}
这是今天上班的时候工作做完了,无聊时写的一个相对通用的基于POI3.6的读取Excel的类,今后还会把它完善。
今后无聊就写点工具类,试着实现一个C/S模式分布式的MVC框架,希望我的理想不是梦!
分享到:
相关推荐
java sql操作工具类 java sql操作工具类java sql操作工具类 java sql操作工具类java sql操作工具类 java sql操作工具类java sql操作工具类 java sql操作工具类java sql操作工具类 java sql操作工具类java sql操作...
java 获取地址工具类 java 获取地址工具类java 获取地址工具类 java 获取地址工具类java 获取地址工具类 java 获取地址工具类java 获取地址工具类 java 获取地址工具类java 获取地址工具类 java 获取地址工具类java ...
java 转义和反转义工具类 java 转义和反转义工具类java 转义和反转义工具类 java 转义和反转义工具类java 转义和反转义工具类 java 转义和反转义工具类java 转义和反转义工具类 java 转义和反转义工具类java 转义和...
在C++编程中,工具类是非常重要的一部分,它们提供了一系列通用功能,可以帮助开发者更高效地进行项目开发。本文将深入探讨标题"**C++工具类-常用工具类源码**"所涵盖的知识点,主要围绕文件处理、编码处理、字符串...
`RabbitmqUtil` 是一个专门为Java开发者设计的工具类,简化了与RabbitMQ交互的复杂过程,使得开发者能够更快速、更方便地发送和接收消息。 首先,我们来详细了解一下`RabbitmqUtil`工具类的主要功能: 1. **连接...
在C#编程中,工具类(Utility Class)是一种常见的设计模式,它封装了一些常用的功能,以便在项目中方便地重复使用。这些工具类通常包含静态方法,不涉及实例化,直接通过类名调用,降低了代码冗余,提高了代码复用...
Elasticsearch工具类是开发中常见的一种抽象封装,旨在简化与Elasticsearch数据库的交互,提高代码的可读性和可维护性。Elasticsearch是一种基于Lucene的分布式、RESTful搜索和分析引擎,广泛用于实时大数据分析和...
在C#编程中,工具类库是开发人员经常会用到的一种资源,它们提供了一系列预定义的方法和功能,以便简化各种常见的编程任务。标题中的"C#工具类库类库 包含所有的常用工具类"暗示了这是一个集合,包含了多种实用工具...
在Android应用开发中,工具类(Utils)是程序员经常使用的辅助模块,它们包含了一系列静态方法,用于处理各种常见的任务,从而提高代码的复用性和可维护性。本资源"Android快速开发系列 10个常用工具类 程序源码...
android自定义log日志输出工具,该工具类具有以下优点: 1 在LogUtlis方法的第一个参数中填this可以输出当前类的名称,特别是在匿名内部类使用也可以输出当前类名。 如 : LogUtils.i(this,”这是一个实用的日志...
C# Util中的Json工具类通常提供了序列化和反序列化JSON对象的方法,如将C#对象转换为JSON字符串,或者将JSON字符串解析为C#对象,这在处理API请求或保存配置文件时非常有用。 2. **Net**: 这部分可能包含网络通信...
[工具类] 获得汉字拼音首字母的java工具类 .java [工具类] 获取绝对路径 .java [工具类] 记录log日志文件的工具类 .java [工具类] 连接数据库的工具类 .java [工具类] 使用Java程序来实现HTTP文件的队列下载 ....
小程序源码 小工具类(带后台)小程序源码 小工具类(带后台)小程序源码 小工具类(带后台)小程序源码 小工具类(带后台)小程序源码 小工具类(带后台)小程序源码 小工具类(带后台)小程序源码 小工具类(带...
Class类工具 \Cookie工具类 \excel读取 工具类\Java如何生成验证码图片和点击刷新验证码\java获取当前月第一天和最后一天,上个月第一天和最后一天\java实现ftp文件的上传与下载\Json工具类 - JsonUtils.java\JS...
本资源包括常用工具类,目前收录了数组工具类、异步工具类、base64工具类、bitmap工具类、缓存工具类、时间工具类、http连接、json、IO、Map、MD5、数据库、SD卡、UbbToHtml等工具类合集
java Base64工具类 java Base64工具类java Base64工具类 java Base64工具类 java Base64工具类 java Base64工具类java Base64工具类 java Base64工具类 java Base64工具类 java Base64工具类java Base64工具类 java ...
[工具类] CookieCounter .java.txt [工具类] 验证码img .jsp.txt [工具类] Java中计算任意两个日期之间的工作天数 .java.txt [工具类] java抓取网页 .java.txt [工具类] MD5 .java.txt [工具类] MD5强化版 .java.txt...
在Android开发中,工具类(Util Classes)是程序员们经常使用的辅助代码集合,它们封装了常见的功能,使得代码更加简洁、可读性更强。这里提到的"android工具类 26个实用工具类"是一个集合,包含了多个针对Android...
该工具类提供了多种方法来发送 GET、POST、PUT、DELETE 等请求,并且支持设置超时时间、代理服务器、证书验证等功能。 关键代码分析 在 HttpUtils 工具类中,有一些关键的代码需要特别注意: 1. `init()` 方法:...
为了解决这个问题,开发了这个Java实体类字段生成工具类。 2、该工具类可以将数据库表列字段转化为对应的Java实体类字段。生成的实体类字段格式清晰易读,且符合Java命名规范。通过使用该工具类,可以大大提高开发...