论坛首页 Java企业应用论坛

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

浏览 24231 次
精华帖 (0) :: 良好帖 (4) :: 新手帖 (18) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-02  
发现跟帖子http://www.iteye.com/topic/657977内容一样,难道是同一个人么?^_^
0 请登录后投票
   发表时间:2010-06-03  

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

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




这个建议很好。
0 请登录后投票
   发表时间:2010-06-03  
Cindy_Lee 写道
请问楼主这个工具是否支持表查询出pojo对象有一对多或一对一关系的转换?



考虑到这种一对多或者多对一的关系了
正准备有时间扩展一下
0 请登录后投票
   发表时间:2010-06-07  
代码有点看不太懂啊
不过注释很详细
回去慢慢研究了
谢谢了
0 请登录后投票
   发表时间: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);
				}
			}




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


必然第一条数据会导不出来
0 请登录后投票
   发表时间:2010-06-12  
这个是导入的方法,第一条数据是标题行,用不着导入的
为什么需要标题行的原因,就在于我是通过标题行来判断时候是应该导入此列的
0 请登录后投票
   发表时间:2010-06-12  
请教楼主,可以处理多大的文件呢?如果我有10w,20w条数据要导出(假设有40列或者80列)会不会内存溢出啊?
0 请登录后投票
   发表时间:2010-06-12  
看了下exprotExcel方法,数据多的时候肯定会内存溢出了。有没有什么思路,现在在处理一个大数据量导出,怎么避免内存溢出?我基础不好。谢谢了。
0 请登录后投票
   发表时间:2010-06-14  
对酒当歌,人生几何 写道
看了下exprotExcel方法,数据多的时候肯定会内存溢出了。有没有什么思路,现在在处理一个大数据量导出,怎么避免内存溢出?我基础不好。谢谢了。


做buffer,分批导不就可以了么?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics