闲来无事,做了一个通用的excel导入导出类。
可以在数据库查询过滤的基础上导出数据(只需传入过滤后的List即可),
也可根据编辑的excel对数据库进行导入。引用了apache的poi,测试5000条数据的导入导出均在300毫秒左右
package com.love;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 作者:王云权;QQ:1371392495,email:wangyunquan@live.com
* 欢迎转载;转载时请著名出处
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcelAnnotation {
// excel导出时标题显示的名字,如果没有设置Annotation属性,将不会被导出和导入
public String exportName();
}
导出类
package com.love;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* 作者:王云权;QQ:1371392495,email:wangyunquan@live.com
* 欢迎转载;转载时请著名出处
*
*/
public class ExcelExport<T> {
/**
*
* @param title 标题
* @param dataset 集合
* @param out 输出流
*/
public void exportExcel(String title, Collection<T> dataset,
OutputStream out) {
// 声明一个工作薄
try {
//首先检查数据看是否是正确的
Iterator<T> its = dataset.iterator();
if(dataset==null||!its.hasNext()||title==null||out==null)
{
throw new Exception("传入的数据不对!");
}
T ts = (T) its.next();
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth(15);
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置标题样式
style = ExcelStyle.setHeadStyle(workbook, style);
// 生成并设置主体样式
HSSFCellStyle style2 = workbook.createCellStyle();
style2 = ExcelStyle.setbodyStyle(workbook, style2);
// 得到所有字段
Field filed[] = ts.getClass().getDeclaredFields();
// 标题
List<String> exportfieldtile = new ArrayList<String>();
// 导出的字段
List<String> fiedName = new ArrayList<String>();
// 遍历整个filed
for (int i = 0; i < filed.length; i++) {
Field f = filed[i];
ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);
// 如果设置了annottion
if (exa != null) {
String exprot = exa.exportName();
// 添加到标题
exportfieldtile.add(exprot);
// 添加到需要导出的字段
fiedName.add(f.getName());
}
}
// 产生表格标题行
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < exportfieldtile.size(); i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(
exportfieldtile.get(i));
cell.setCellValue(text);
}
Iterator<T> it = dataset.iterator();
int index = 0;
// 循环整个集合
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
T t = (T) it.next();
for (int k = 0; k < fiedName.size(); k++) {
HSSFCell cell = row.createCell(k);
String fieldname = fiedName.get(k);
String getMethodName = "get"
+ fieldname.substring(0, 1).toUpperCase()
+ fieldname.substring(1);
Class tCls = t.getClass();
Method getMethod = tCls.getMethod(getMethodName,
new Class[] {});
Object value = getMethod.invoke(t, new Object[] {});
String textValue = getValue(value);
HSSFRichTextString richString = new HSSFRichTextString(
textValue);
cell.setCellValue(richString);
}
}
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
}
}
public String getValue(Object value) {
String textValue = "";
if (value == null)
return textValue;
if (value instanceof Boolean) {
boolean bValue = (Boolean) value;
textValue = "是";
if (!bValue) {
textValue = "否";
}
} else if (value instanceof Date) {
Date date = (Date) value;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
textValue = sdf.format(date);
} else
textValue = value.toString();
return textValue;
}
public static void main(String[] args) throws Exception {
List list = new ArrayList();
for (int i = 0; i < 5000; i++) {
Loginfo log = new Loginfo();
log.setLogInfo("测试一下");
log.setUserip("127.0.1.1");
log.setUsername("测试");
list.add(log);
}
OutputStream out = new FileOutputStream("D:\\testOne.xls");
Long l = System.currentTimeMillis();
ExcelExport<Loginfo> ex = new ExcelExport<Loginfo>();
ex.exportExcel("测试", list, out);
out.close();
Long s = System.currentTimeMillis();
System.out.println("总共耗时:" + (s - l));
}
}
导入类:
package com.love;
import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
/**
* 作者:王云权;QQ:1371392495,email:wangyunquan@live.com
* 欢迎转载;转载时请著名出处
*
*/
public class ImportExcel<T> {
Class<T> clazz;
public ImportExcel(Class<T> clazz) {
this.clazz = clazz;
}
public Collection<T> importExcel(File file ,String... pattern) {
Collection<T> dist = new ArrayList();
try {
/**
* 类反射得到调用方法
*/
// 得到目标目标类的所有的字段列表
Field filed[] = clazz.getDeclaredFields();
// 将所有标有Annotation的字段,也就是允许导入数据的字段,放入到一个map中
Map fieldmap = new HashMap();
// 循环读取所有字段
for (int i = 0; i < filed.length; i++) {
Field f = filed[i];
// 得到单个字段上的Annotation
ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);
// 如果标识了Annotationd的话
if (exa != null) {
// 构造设置了Annotation的字段的Setter方法
String fieldname = f.getName();
String setMethodName = "set"
+ fieldname.substring(0, 1).toUpperCase()
+ fieldname.substring(1);
// 构造调用的method,
Method setMethod = clazz.getMethod(setMethodName,
new Class[] { f.getType() });
// 将这个method以Annotaion的名字为key来存入。
fieldmap.put(exa.exportName(), setMethod);
}
}
/**
* excel的解析开始
*/
// 将传入的File构造为FileInputStream;
FileInputStream in = new FileInputStream(file);
// // 得到工作表
HSSFWorkbook book = new HSSFWorkbook(in);
// // 得到第一页
HSSFSheet sheet = book.getSheetAt(0);
// // 得到第一面的所有行
Iterator<Row> row = sheet.rowIterator();
/**
* 标题解析
*/
// 得到第一行,也就是标题行
Row title = row.next();
// 得到第一行的所有列
Iterator<Cell> cellTitle = title.cellIterator();
// 将标题的文字内容放入到一个map中。
Map titlemap = new HashMap();
// 从标题第一列开始
int i = 0;
// 循环标题所有的列
while (cellTitle.hasNext()) {
Cell cell = cellTitle.next();
String value = cell.getStringCellValue();
titlemap.put(i, value);
i = i + 1;
}
/**
* 解析内容行
*/
//用来格式化日期的DateFormat
SimpleDateFormat sf;
if(pattern.length<1)
{
sf=new SimpleDateFormat("yyyy-MM-dd");
}
else
sf=new SimpleDateFormat(pattern[0]);
while (row.hasNext()) {
// 标题下的第一行
Row rown = row.next();
// 行的所有列
Iterator<Cell> cellbody = rown.cellIterator();
// 得到传入类的实例
T tObject = clazz.newInstance();
int k = 0;
// 遍历一行的列
while (cellbody.hasNext()) {
Cell cell = cellbody.next();
// 这里得到此列的对应的标题
String titleString = (String) titlemap.get(k);
// 如果这一列的标题和类中的某一列的Annotation相同,那么则调用此类的的set方法,进行设值
if (fieldmap.containsKey(titleString)) {
Method setMethod = (Method) fieldmap.get(titleString);
//得到setter方法的参数
Class<?>[] ts = setMethod.getParameterTypes();
//只要一个参数
Object xclass = ts[0];
//判断参数类型
if(xclass instanceof String)
{
setMethod.invoke(tObject, cell.getStringCellValue());
}
else if(xclass instanceof Date)
{
setMethod.invoke(tObject, sf.parse(cell.getStringCellValue()));
}
else if(xclass instanceof Boolean)
{
String boolname="是";
if(cell.getStringCellValue().equals("否"))
{
boolname="否";
}
setMethod.invoke(tObject,boolname );
}
}
// 下一列
k = k + 1;
}
dist.add(tObject);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return dist;
}
public static void main(String[] args) {
ImportExcel<Loginfo> test = new ImportExcel(Loginfo.class);
File file = new File("D:\\testOne.xls");
Long befor = System.currentTimeMillis();
List<Loginfo> result = (ArrayList) test.importExcel(file);
Long after = System.currentTimeMillis();
System.out.println("此次操作共耗时:" + (after - befor) + "毫秒");
// for (int i = 0; i < result.size(); i++) {
// Loginfo loginfo=result.get(i);
// System.out.println("导入的信息为:"+loginfo.getLogInfo()+loginfo.getUserip()+loginfo.getUsername());
// }
System.out.println("共转化为List的行数为:" + result.size());
}
}
分享到:
相关推荐
本篇文章将深入探讨“C#通用Excel导入导出工具类”的实现原理及应用,主要涉及的技术点包括反射、特性以及如何创建一个高效的Excel导入导出解决方案。 首先,我们要理解反射在C#中的作用。反射是一种强大的机制,它...
这是一个利用poi封装的excel导入导出通用组件,详细用法请访问:http://fuyangrong.top/2018/01/29/excel导入导出通用组件/
本项目是基于NPOI实现的一个强类型Excel导入导出组件,旨在简化开发者的工作流程,提高代码的可维护性和可读性。 NPOI的核心功能在于对Excel文件的读写操作。通过NPOI,我们可以创建新的Excel工作簿,添加工作表,...
标题中的“一个通用从数据库导出excel、excel导入数据库组件所用到的jar包”指的是一个Java开发的工具,主要用于数据的导入导出操作。这个工具可以方便地将数据库中的数据导出为Excel格式,同时也可以将Excel文件中...
标题 "多功能通用Excel导入导出数据" 描述的是一个针对Excel数据处理的工具或库,它已经被二次封装,简化了导入导出操作。用户只需引入指定的jar包,并通过一行代码即可实现数据的导入和导出功能。描述中强调了其...
这是我设计的excel导入导出组件,使用java 编写,通过xml文件的配置,来设置excel到java bean的映射。关键(配置)文件:ExcelModeMappingl.xml...终于下决心写一个可重用性很高的组件,专门解决“重复造轮子”的问题。
JAVA中excel导入导出通用方法 JAVA 中 excel 导入导出通用方法是指在 Java 项目中实现 excel 文件的导入和导出功能。这种方法可以应用于各种需要 excel 文件交互的业务场景中。 一、引入依赖 在 Java 项目中想要...
。net通用导入导出 excel 类,返回datatable
Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel...
下面是一个实现了 Excel 导入导出工具类的示例: ```java import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFRow; ...
这个"npoi (excel导入导出)帮助类"是一个专门为处理Excel数据导入和导出设计的工具集,它利用Npoi的功能来简化操作流程。下面我们将详细探讨Npoi的核心功能以及如何使用这个帮助类来实现Excel的导入和导出。 首先,...
thinkhphp3.2 excel导入导出demothinkhphp3.2 excel导入导出demothinkhphp3.2 excel导入导出demothinkhphp3.2 excel导入导出demothinkhphp3.2 excel导入导出demothinkhphp3.2 excel导入导出demothinkhphp3.2 excel...
在这个“通用的Excel导入导出”项目中,我们看到作者创建了一个类来实现这个功能,让我们详细了解一下相关的知识点。 1. **Apache POI**:这是Apache软件基金会的一个开源项目,它提供了一组API,专门用于读写...
Excel导入导出Excel导入导出Excel导入导出Excel导入导出Excel导入导出Excel导入导出Excel导入导出Excel导入导出Excel导入导出Excel导入导出Excel导入导出Excel导入导出
Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出...
在IT领域,导入导出组件通常是指用于处理数据导入与导出功能的程序模块,尤其在Java编程中,这类组件对于数据处理、分析和存储至关重要。"导入导出组件.rar"可能是一个包含Java库或者代码示例的压缩包,旨在帮助...
这个"asp将EXCEL导入导出数据库原程序"提供了一个解决方案,能够方便地将Excel中的数据存入MSSQL数据库,同时也能将数据库中的数据导出到Excel文件。 首先,我们需要了解如何使用ASP连接MSSQL数据库。通常,这涉及...
在计算机编程领域,尤其是在后端开发中,处理数据导入导出是一个常见的需求...一个高效、稳定、易用的Excel导入导出工具类是后端开发中不可或缺的组件,它不仅能够提升开发效率,还能够确保数据处理的安全性和准确性。
易语言提供了一个名为“通用数据访问组件”的模块,其中包含了读取和写入Excel文件所需的接口。例如,`打开工作簿`函数用于打开一个Excel文件,`关闭工作簿`函数则用于关闭已打开的文件。另外,`选择工作表`和`选择...
本工具是基于Java反射机制实现的通用Excel导入导出类,它提供了便捷的方式来读取和写入Excel文件,适用于多种场景。下面我们将深入探讨这个工具的工作原理、使用方法以及相关的Java Excel处理知识。 1. **Java反射...