`
eya
  • 浏览: 41891 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

发一个通用从数据库导出excel、excel导入数据库组件

阅读更多
以前发过一次,看见许多朋友都很需要这种通用的导入导出组件
请注意:导入导出功能是通过自定义的Annotattion来实现的,要将pojo中的字段的类标注指定的annotation才可以,如果没有标注的,就默认不导出导入

一般情况下只需要简单的三步,就可以实现导入和导出了,要是你使用了hibernate,就会发现太方便了

一:
构造输入输出流 如: OutputStream out = new FileOutputStream("D:\\testOne.xls");
二,构造导入导出对象 如: ExcelExport<Testpojo> ex = new ExcelExport<Testpojo>();
三,操作  ex.exportExcel("测试", list, out);


当然,因为操作数据都是Connection接口的,所以,你可以在导入
导出之前对数据进行过滤、排序、分组等,到时候动态的传进去就可以了,实在非常的方便,废话不多说,直接上代码:


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 * 作者:eya;QQ:1371392495,email:eya@eya.cc
 *  欢迎转载;转载时请著名出处
 * 
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcelAnnotation {
	// excel导出时标题显示的名字,如果没有设置Annotation属性,将不会被导出和导入
	public String exportName();
}






import java.util.Date;

/**
 * 作者:eya;QQ:1371392495,email:eya@eya.cc
 *  欢迎转载;转载时请著名出处
 * 
 */
public class Testpojo {
	@ExcelAnnotation(exportName = "用户名")
	String username;
	@ExcelAnnotation(exportName = "登录名")
	String loginname;
	@ExcelAnnotation(exportName = "年龄")
	Integer age;
	@ExcelAnnotation(exportName = "收入")
	Long   money;
	@ExcelAnnotation(exportName = "时间")
	Date createtime;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getLoginname() {
		return loginname;
	}
	public void setLoginname(String loginname) {
		this.loginname = loginname;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public Long getMoney() {
		return money;
	}
	public void setMoney(Long money) {
		this.money = money;
	}
	public Date getCreatetime() {
		return createtime;
	}
	public void setCreatetime(Date createtime) {
		this.createtime = createtime;
	}
	

}








import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;


/**
 * 作者:eya;QQ:1371392495,email:eya@eya.cc
 *  欢迎转载;转载时请著名出处
 * 
 */
public class ExcelStyle {
	public static HSSFCellStyle setHeadStyle(HSSFWorkbook workbook ,HSSFCellStyle style)
	{
		
		style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 生成字体
		HSSFFont font = workbook.createFont();
		font.setColor(HSSFColor.VIOLET.index);
		font.setFontHeightInPoints((short) 12);
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		// 把字体应用到当前的样样式
		style.setFont(font);
		return style;
		
	}
	public static HSSFCellStyle setbodyStyle(HSSFWorkbook workbook ,HSSFCellStyle style2)
	{
		style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
		style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
		style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
		style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		// 生成字体
		HSSFFont font2 = workbook.createFont();
		font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
		// 把字体应用到当前的样样式
		style2.setFont(font2);
		return style2;
	}
}






import java.util.Date;

/**
 * 作者:eya;QQ:1371392495,email:eya@eya.cc
 *  欢迎转载;转载时请著名出处
 * 
 */
public class Testpojo {
	@ExcelAnnotation(exportName = "用户名")
	String username;
	@ExcelAnnotation(exportName = "登录名")
	String loginname;
	@ExcelAnnotation(exportName = "年龄")
	Integer age;
	@ExcelAnnotation(exportName = "收入")
	Long   money;
	@ExcelAnnotation(exportName = "时间")
	Date createtime;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getLoginname() {
		return loginname;
	}
	public void setLoginname(String loginname) {
		this.loginname = loginname;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public Long getMoney() {
		return money;
	}
	public void setMoney(Long money) {
		this.money = money;
	}
	public Date getCreatetime() {
		return createtime;
	}
	public void setCreatetime(Date createtime) {
		this.createtime = createtime;
	}
	

}






import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
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;

/**
 * 作者:eya;QQ:1371392495,email:eya@eya.cc
 *  欢迎转载;转载时请著名出处
 * 
 */
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方法的参数
						Type[] ts = setMethod.getGenericParameterTypes();
						//只要一个参数
						String xclass = ts[0].toString();
						//判断参数类型
						
					
						if(xclass. equals("class java.lang.String"))
						{
							setMethod.invoke(tObject, cell.getStringCellValue());
						}
						else if(xclass. equals("class java.util.Date"))
						{
							setMethod.invoke(tObject, sf.parse(cell.getStringCellValue()));
						}
						else if(xclass. equals("class java.lang.Boolean"))
						{
							Boolean boolname=true;
							if(cell.getStringCellValue().equals("否"))
								{
								boolname=false;
								}
							setMethod.invoke(tObject,boolname );
						}
						else if(xclass. equals("class java.lang.Integer"))
						{
							setMethod.invoke(tObject,new Integer( cell.getStringCellValue()));
						}
						
						else if(xclass. equals("class java.lang.Long"))
						{
							setMethod.invoke(tObject,new Long( cell.getStringCellValue()));
						}
					}
					// 下一列
					k = k + 1;
				}
				dist.add(tObject);
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return dist;
	}

	public static void main(String[] args) {
		ImportExcel<Testpojo> test = new ImportExcel(Testpojo.class);
		File file = new File("D:\\testOne.xls");
		Long befor = System.currentTimeMillis();
		List<Testpojo> result = (ArrayList) test.importExcel(file);

		Long after = System.currentTimeMillis();
		System.out.println("此次操作共耗时:" + (after - befor) + "毫秒");
		 for (int i = 0; i < result.size(); i++) {
			 Testpojo testpojo=result.get(i);
		 System.out.println("导入的信息为:"+testpojo.getLoginname()+
				 "----"+testpojo.getAge()+"---"+testpojo.getMoney()+"-----"+testpojo.getCreatetime());
		 }

		System.out.println("共转化为List的行数为:" + result.size());
	}
}





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;

import cc.eya.base.entity.account.Loginfo;


/**
 * 作者:eya;QQ:1371392495,email:eya@eya.cc
 *  欢迎转载;转载时请著名出处
 * 
 */
public class ExcelExport<T> {
	//格式化日期
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	/**
	 * 
	 * @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();
			Class tCls = ts.getClass();
			HSSFWorkbook workbook = new HSSFWorkbook();
			// 生成一个表格
			HSSFSheet sheet = workbook.createSheet(title);
			// 设置表格默认列宽度为15个字节
			sheet.setDefaultColumnWidth(15);
			// 生成一个样式
			HSSFCellStyle style = workbook.createCellStyle();
			// 设置标题样式
			style = ExcelStyle.setHeadStyle(workbook, style);

			// 得到所有字段
		
			Field filed[] = ts.getClass().getDeclaredFields();
			// 标题
			List<String> exportfieldtile = new ArrayList<String>();
			// 导出的字段的get方法
			List<Method> methodObj = new ArrayList<Method>();
			// 遍历整个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);
					// 添加到需要导出的字段的方法
					String fieldname = f.getName();
					String getMethodName = "get"
							+ fieldname.substring(0, 1).toUpperCase()
							+ fieldname.substring(1);
					
					Method getMethod = tCls.getMethod(getMethodName,
							new Class[] {});
					
					
					methodObj.add(getMethod);
				}
			}
			// 产生表格标题行
			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);
			}

	
			int index = 0;
			//这里重新取一下,前面调用了next()方法,会出现少一条的情况
                 its = dataset.iterator();
			// 循环整个集合
			
			while (its.hasNext()) {
				//从第二行开始写,第一行是标题
				index++;
				row = sheet.createRow(index);
				T t = (T) its.next();
				for (int k = 0; k < methodObj.size(); k++) {
					HSSFCell cell = row.createCell(k);
					Method getMethod=methodObj.get(k);
					Object value = getMethod.invoke(t, new Object[] {});
					String textValue = getValue(value);
					cell.setCellValue(textValue);
				}

			}
			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;
		
			textValue = sdf.format(date);
		} else
			textValue = value.toString();

		return textValue;
	}

	public static void main(String[] args) throws Exception {
		
		//构造一个模拟的List来测试,实际使用时,这个集合用从数据库中查出来
		List list = new ArrayList();
		for (int i = 0; i < 5000; i++) {
			Testpojo pojo = new Testpojo();
			pojo.setLoginname("登录名"+i);
			pojo.setUsername("用户名"+i);
			pojo.setMoney(new Long(1000+i));
			pojo.setCreatetime(new Date());
		    pojo.setAge(28);
			list.add(pojo);
		}
		//构造输出对象,可以从response输出,直接向用户提供下载
		OutputStream out = new FileOutputStream("D:\\testOne.xls");
		//开始时间
		Long l = System.currentTimeMillis();
		//注意
		ExcelExport<Testpojo> ex = new ExcelExport<Testpojo>();
		//
		ex.exportExcel("测试", list, out);
		out.close();
		//结束时间
		Long s = System.currentTimeMillis();
		System.out.println("总共耗时:" + (s - l));

	}
}





  • lib.rar (8 MB)
  • 下载次数: 2386
分享到:
评论
33 楼 赤脚行天下 2011-04-21  
我测了一下,比如我有5条数据,但导出来的只有4条。不知LZ遇见了这个问题没有?
32 楼 对酒当歌,人生几何 2010-06-17  
这样啊。有时间试试看。谢谢了
31 楼 C_J 2010-06-17  
先弄一个缓冲区,比如1MB左右,然后从DB中先取N条记录入这个buffer,入的时候检测缓冲区剩余可用空间,同时把buffer中的内容一次性写入file中。

这样每次分批操作,即便内存很小也可以做完,牺牲时间换空间而已。
30 楼 对酒当歌,人生几何 2010-06-17  
C_J 写道
对酒当歌,人生几何 写道
看了下exprotExcel方法,数据多的时候肯定会内存溢出了。有没有什么思路,现在在处理一个大数据量导出,怎么避免内存溢出?我基础不好。谢谢了。


做buffer,分批导不就可以了么?

呵呵,还不会弄buffer,可否讲下大概的思路?
29 楼 C_J 2010-06-14  
对酒当歌,人生几何 写道
看了下exprotExcel方法,数据多的时候肯定会内存溢出了。有没有什么思路,现在在处理一个大数据量导出,怎么避免内存溢出?我基础不好。谢谢了。


做buffer,分批导不就可以了么?
28 楼 对酒当歌,人生几何 2010-06-12  
看了下exprotExcel方法,数据多的时候肯定会内存溢出了。有没有什么思路,现在在处理一个大数据量导出,怎么避免内存溢出?我基础不好。谢谢了。
27 楼 对酒当歌,人生几何 2010-06-12  
请教楼主,可以处理多大的文件呢?如果我有10w,20w条数据要导出(假设有40列或者80列)会不会内存溢出啊?
26 楼 eya 2010-06-12  
这个是导入的方法,第一条数据是标题行,用不着导入的
为什么需要标题行的原因,就在于我是通过标题行来判断时候是应该导入此列的
25 楼 valentiy 2010-06-11  
nageer 写道
以前也做过类似的excel导入导出,但是是用xml配置的。lz的想法很好,但是有些地方还是有点看不懂。。。
eya 写道

	public Collection<T> importExcel(File file ,String...  pattern) {


不知道为什么pattern传入的是可变参数类型,后文应该也只是用到pattern[0]而已。
另外ImportExcel为什么要每次导入都去获取目标目标类的所有的字段列表呢,应该只要获取一次保存起来就行了吧。
eya 写道

			/**
			 * 类反射得到调用方法
			 */
			// 得到目标目标类的所有的字段列表
			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);
				}
			}




另外导出的时候会不会少导一条数据啊,我没有亲自运行过,但是看代码好像会把第一条数据少导出来,有错请指正。呵呵


必然第一条数据会导不出来
24 楼 shanxmxj 2010-06-07  
代码有点看不太懂啊
不过注释很详细
回去慢慢研究了
谢谢了
23 楼 eya 2010-06-03  
Cindy_Lee 写道
请问楼主这个工具是否支持表查询出pojo对象有一对多或一对一关系的转换?



考虑到这种一对多或者多对一的关系了
正准备有时间扩展一下
22 楼 eya 2010-06-03  
H_eaven 写道

1.楼主的importExcel, exportExcel有很大的重构余地,每个方法都做了太多的工作。
2.JXL,poi,  这两个API基本和JDBC是同一级别的,在程序当中可以直接用,但会搞得这些低层的API与业务代码混在一起。
对它们进行封装是很有意义的。
3.  即使使用反射,如果能避免直接操作字段,就尽量避免,反射操作属性和方法是正常的,它不会破坏封装性。
4. 可以使用注解的方式,对字段与excel列进行绑定操作,但应该不是最好的方式。因为字段与列的映射是定义一个Sheet规则的一部分,
     还有其它基本的规则,A:如:读取数据从第几行开始,因为列头是不需要读入的;文档最后几行可能是"注意事项“,这些也应该被忽略掉,这些
     都是规则的一部分。  B:属性映射,不要映射到列头的内容,应该使用excel的列编号,列编号是稳定的,列头是容易被修改的。C:注解是写在代码上的,
     修改映射关系是需要重新编译类的。    注解很强大,但处处以注解为先,有的时候并不是合理的,使用xml格式的配置更合理些。




这个建议很好。
21 楼 H_eaven 2010-06-03  

1.楼主的importExcel, exportExcel有很大的重构余地,每个方法都做了太多的工作。
2.JXL,poi,  这两个API基本和JDBC是同一级别的,在程序当中可以直接用,但会搞得这些低层的API与业务代码混在一起。
对它们进行封装是很有意义的。
3.  即使使用反射,如果能避免直接操作字段,就尽量避免,反射操作属性和方法是正常的,它不会破坏封装性。
4. 可以使用注解的方式,对字段与excel列进行绑定操作,但应该不是最好的方式。因为字段与列的映射是定义一个Sheet规则的一部分,
     还有其它基本的规则,A:如:读取数据从第几行开始,因为列头是不需要读入的;文档最后几行可能是"注意事项“,这些也应该被忽略掉,这些
     都是规则的一部分。  B:属性映射,不要映射到列头的内容,应该使用excel的列编号,列编号是稳定的,列头是容易被修改的。C:注解是写在代码上的,
     修改映射关系是需要重新编译类的。    注解很强大,但处处以注解为先,有的时候并不是合理的,使用xml格式的配置更合理些。
20 楼 pn2008 2010-06-02  
发现跟帖子http://www.iteye.com/topic/657977内容一样,难道是同一个人么?^_^
19 楼 javaSunStar 2010-06-02  
不错,支持
18 楼 javaSunStar 2010-06-02  
可以啊 支持
17 楼 show_hu 2010-06-02  
派不上用场。。。。
16 楼 nageer 2010-06-02  
以前也做过类似的excel导入导出,但是是用xml配置的。lz的想法很好,但是有些地方还是有点看不懂。。。
eya 写道

	public Collection<T> importExcel(File file ,String...  pattern) {


不知道为什么pattern传入的是可变参数类型,后文应该也只是用到pattern[0]而已。
另外ImportExcel为什么要每次导入都去获取目标目标类的所有的字段列表呢,应该只要获取一次保存起来就行了吧。
eya 写道

			/**
			 * 类反射得到调用方法
			 */
			// 得到目标目标类的所有的字段列表
			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);
				}
			}




另外导出的时候会不会少导一条数据啊,我没有亲自运行过,但是看代码好像会把第一条数据少导出来,有错请指正。呵呵
15 楼 Cindy_Lee 2010-06-02  
请问楼主这个工具是否支持表查询出pojo对象有一对多或一对一关系的转换?
14 楼 madbluesky 2010-06-02  
ireport

相关推荐

    一个通用从数据库导出excel、excel导入数据库组件所用到的jar包

    标题中的“一个通用从数据库导出excel、excel导入数据库组件所用到的jar包”指的是一个Java开发的工具,主要用于数据的导入导出操作。这个工具可以方便地将数据库中的数据导出为Excel格式,同时也可以将Excel文件中...

    【转】通用从数据库导出excel、excel导入数据库组件

    标题中的“通用从数据库导出excel、excel导入数据库组件”是指一种软件工具或技术,它允许用户方便地将数据从数据库导出到Excel电子表格格式,并能将Excel数据反向导入回数据库。这样的组件通常在数据迁移、数据分析...

    Excel导入导出数据库小工具

    总的来说,【Excel导入导出数据库小工具】是一个实用的工具,结合了C#的文件处理和数据库操作能力,为日常数据管理工作提供了便利。通过研究源代码,开发者不仅可以掌握Excel与数据库之间的数据迁移技术,还能提升C#...

    通用ASP.NET Core NPOI导出复杂Word、Excel和Excel数据导入实战项目

    4. **Excel数据导入**:项目可能需要从用户上传的Excel文件中读取数据并将其存储到数据库。这需要解析Excel文件,读取数据,进行必要的验证,然后将数据保存到合适的数据库表中。NPOI提供`HSSFWorkbook`和`...

    ASP.NET(C#)导入&导出Excel

    在ASP.NET(C#)开发中,导入和导出Excel是一项常见的功能需求,它涉及到Web应用程序与Microsoft Excel数据的交互。这个主题涵盖了多个知识点,包括文件流处理、数据序列化、Excel对象模型的理解以及如何利用C#语言...

    vb编写的oracle数据库导入导出

    在导入数据时,可以从文件(如CSV或Excel)读取数据,然后使用数据适配器将数据加载到DataSet,最后通过适配器的Update方法将数据写入数据库。导出时,可以反向操作,先从数据库获取数据到DataSet,再写入文件。 5....

    Asp.net 导出Excel文件总结(导出csv、Office COM组建、Jet OLEDB、NPOI)

    NPOI是一个开源的.NET库,用于读写Microsoft Office文档,包括Excel。它提供了丰富的API,可以创建、修改Excel文件,设置单元格样式,处理公式等,而无需依赖Office。NPOI适用于大量数据处理和复杂格式的场景,性能...

    DELPHI实现异构数据库导入导出,效率高,拿出来分享。。。。。。。。。

    总的来说,DELPHI通过其强大的数据库组件和灵活的编程模型,提供了实现异构数据库导入导出的强大工具。通过精心设计的算法和策略,可以有效地处理大规模数据迁移,实现高效、可靠的数据交换。在实际项目中,根据具体...

    excel通用模板组件

    标题中的“Excel通用模板组件”指的是一个用于处理Excel文件的工具或库,它提供了一种通用的方法来操作Excel模板,从而实现数据填充、格式化和自动化处理。这种组件通常适用于需要大量处理Excel数据的业务场景,例如...

    excel导入和导出

    数据查询编辑器(Power Query)是Excel的一个内置组件,它提供了强大的数据清洗、转换和加载功能。用户可以连接到各种数据源,如Access、SQL Server、Web服务等,然后使用M语言(Power Query语言)进行复杂的数据...

    PB使用HTML格式导出Excel.rar_excel_pb excel_pb html_pb导出excel_pb读取html文

    总的来说,PB通过HTML格式导出Excel是一种实用的方法,它结合了数据窗口的强大功能和HTML的通用性。不过,这种方式有其限制,例如对复杂格式的支持不足。在实际应用中,开发者需要根据项目需求和资源来决定是否采用...

    Delphi_从DBGrid,StringGrid导出Excel

    - StringGrid则是一个通用的网格控件,适用于非数据库数据的显示和编辑。它可以手动填充和管理数据。 2. **数据导出的基本流程**: - 首先,需要遍历DBGrid或StringGrid中的每一行数据。 - 对于DBGrid,通常通过...

    Delphi 导出为Excel的函数代码

    这里的示例代码中,`CreateOleObject('Excel.Application')` 创建了一个 Excel 应用程序对象。这允许我们进一步控制 Excel 的工作簿、工作表等元素,实现数据导入导出等功能。 2. **处理文件路径和对话框**: 代码...

    Excel通用方法及操作组件打包下载

    标题中的“Excel通用方法及操作组件打包下载”指的是一个资源包,其中包含了多个与Excel相关的实用技巧、函数应用以及可能的VBA(Visual Basic for Applications)宏或C#、ASP.NET编程接口,用于扩展Excel的功能。...

    对任何数据库通用的报表很强大的

    6. 数据导出:从数据库导出数据到Excel的过程及其在实际业务中的应用。 掌握这些知识点,不仅能够帮助开发人员创建针对任何数据库的报表系统,还能提升他们在数据分析和报告生成方面的专业能力。

    Table表格导出为Excel、csv、txt、sql、json、xml、Word格式

    本项目提供的"Table表格导出为Excel、csv、txt、sql、json、xml、Word格式"就是这样一个功能丰富的解决方案,它允许用户将网页中的表格数据方便地转换为多种常见格式。 首先,我们来详细了解一下这些文件格式的特点...

    Excel导出文件

    综上所述,Java导入导出Excel是一个涉及前端交互、后端处理和数据操作的过程,需要理解Web开发、文件处理和Java API的使用,确保数据的准确性和安全性。通过这个项目,开发者可以提升对这些技术的掌握,更好地实现...

    数据分页导入Excel

    数据分页导入Excel是一项在大数据处理中常见的任务,它涉及到如何高效地从数据库中提取大量数据并将其组织成Excel格式。在这个过程中,我们通常会利用Java的Apache POI库,这是一个强大的工具,允许开发者创建、修改...

    thinkphp下 导入导出csv文件

    6. 测试环境准备:描述中提到“测试需要手动修改TP数据库配置”,意味着在测试环境中,可能需要创建一个新的数据库或修改现有数据库的连接参数,以便与CSV文件数据的导入导出操作匹配。 7. 压缩包文件内容: - `....

    通用数据库检索系统

    此外,通用数据库检索系统还应具备数据导入导出功能,能与各种文件格式进行交互,如CSV、Excel、XML等。这样,用户可以方便地在数据库和文件系统之间传输数据,实现数据的备份、迁移或整合。 在安全性方面,系统应...

Global site tag (gtag.js) - Google Analytics