- 浏览: 99723 次
- 性别:
- 来自: 北京
最新评论
-
cywhfe:
受教了,多谢lz分享
StringUtils字符串操作处理 -
carlosfu:
这么牛啊,昨天发的 800多点击啊。
牛
多线程异步事件、任务自动调度 -
liuInsect:
没看出个什么问题啊、
多线程异步事件、任务自动调度 -
Coolala_cs:
nice!
多线程异步事件、任务自动调度 -
luxing44530:
akka actor?
多线程异步事件、任务自动调度
最近在公司实习时,项目中总遇到excel表的导出,就产生写一个组件实现此功能的想法,在此感谢MaximusGet的帮助,基于jdk1.5元数据注解、注释来实现属性名、列名解耦合,模板组件化,或者可以通过LinkedHashMap实现
package cn.edu.yxy.bean; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author 杨新彦 * @ 时间 2012-2-2 * @ 状态 创建 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ExcelAnnotation { public int id() default 0;//excel列id public String name(); //excel列名 }
列名显示顺序比较
package cn.edu.yxy.util; import java.lang.reflect.Field; import java.util.Comparator; import cn.edu.yxy.bean.ExcelAnnotation; /** * @author 杨新彦 * @ 时间 2012-2-2 * @ 状态 创建 */ public class FieldComparator implements Comparator<Object> { public int compare(Object arg0, Object arg1) { Field fieldOne = (Field)arg0; Field fieldTwo = (Field)arg1; ExcelAnnotation annoOne = fieldOne.getAnnotation(ExcelAnnotation.class); ExcelAnnotation annoTwo = fieldTwo.getAnnotation(ExcelAnnotation.class); if(annoOne==null||annoTwo==null){ return 0; } int result = annoOne.id()-annoTwo.id(); if(result>0){ return 1; }else if(result<0){ return -1; }else { return 0; } } }
//通用组件
package cn.edu.yxy.util; import java.io.File; /** * @author 杨新彦 * @ 时间 2012-2-2 * @ 状态 创建 */ public class DataToExcelModel { private static int sheetCount = 0; private static int max = 0; private static List<String> columnArr = null; // 属性名集合 private static List<Method> methodArr = null; // 待打印属性的get方法 /** * * @param source 数据源 * @param className 实体类类名 * @param path 文件存放路径 * @return true:执行成功;false:执行失败 * @throws Exception */ @SuppressWarnings("all") public static boolean createExcel(List source,String className,String path,final int pageCount) throws Exception { HSSFWorkbook wb = new HSSFWorkbook(); if(null != source){ max = source.size(); //总记录数 sheetCount = max / pageCount + (max % pageCount == 0 ? 0 : 1); //总页数 }else{ return createFile(path, wb); } Class classEntity = null; try { classEntity = Class.forName(className); } catch (ClassNotFoundException e) { e.printStackTrace(); } //排序对应的属性名 Field[] arrField = sortArributeName(classEntity); //生成方法集合并缓存 createMethod(arrField, classEntity); // 生成对应的方法名,要打印的列名 int nameSize = arrField.length; for (int i = 0; i < sheetCount; i++) { HSSFSheet sheet = wb.createSheet("sheet" + i); HSSFRow row = sheet.createRow(0); HSSFCell cell = null; int begin = pageCount * (i); //打印表头 for (int j = 0; j < nameSize; j++) { cell = row.createCell((short) j); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(columnArr.get(j)); } int k = 0; while (k < pageCount && (begin + k < max)) { Object object = source.get(begin + k); row = sheet.createRow(k + 1); for (int m = 0; m < nameSize; m++) { cell = row.createCell((short) m); cell.setEncoding(HSSFCell.ENCODING_UTF_16); try { cell.setCellValue(null == ((methodArr.get(m)).invoke(object)) ? "" : (methodArr.get(m)).invoke(object).toString()); } catch (Exception e) { e.printStackTrace(); } } k++; } } return createFile(path,wb); } private static void createMethod(Field[] arrField,Class<?> classEntity){ String columnName; // 打印的列� String beanName; // 属性名 String methodName; // 方法名 columnArr = new ArrayList<String>(); // 属性名集合 methodArr = new ArrayList<Method>(); for (Field field : arrField) { ExcelAnnotation ann = field.getAnnotation(ExcelAnnotation.class); columnName = ann.name(); columnArr.add(columnName); beanName = field.getName(); StringBuffer sb = new StringBuffer(); sb.append("get"); sb.append(beanName.substring(0, 1).toUpperCase()); sb.append(beanName.substring(1)); methodName = sb.toString(); Method method = null; try { method = classEntity.getMethod(methodName); } catch (Exception e) { e.printStackTrace(); } methodArr.add(method); } } /** * 生成文件,存放在制定的路径 * @param path 路径 * @param wb HSSFWorkbook * @return true 执行成功 * @throws IOException */ private static boolean createFile(String path,HSSFWorkbook wb){ boolean flag = false; //判断文件是否存在,若存在删除 File file = new File(path); if(file.exists()){ file.delete(); } FileOutputStream out = null; try { out = new FileOutputStream(path); wb.write(out); flag = true; } catch (Exception e) { e.printStackTrace(); }finally{ try { out.close(); } catch (IOException e) { e.printStackTrace(); } } return flag; } /** * 排序表头 * @param classEntity * @return */ private static Field[] sortArributeName(Class<?> classEntity){ // 对需要打印的属性名排序 Field[] fields = classEntity.getDeclaredFields(); ArrayList<Field> arrFieldList = new ArrayList<Field>(); for (Field field : fields) { if (field.isAnnotationPresent(ExcelAnnotation.class)) { arrFieldList.add(field); } } Field[] arrField = {}; arrField = arrFieldList.toArray(arrField); //排序显示 Arrays.sort(arrField, new FieldComparator()); return arrField; } }
javabean信息
package cn.edu.yxy.bean; /** * @author 杨新彦 * @ 时间 2012-2-2 * @ 状态 创建 */ public class DepartmentBean { public DepartmentBean() { super(); } /** * id<br> * 单位id */ private long id; /** * name<br> * 单位名称 */ @ExcelAnnotation(id = 8,name = "单位名称") private String name; /** * code<br> * 单位编码 */ @ExcelAnnotation(id = 2,name = "单位编码") private String code; // get、set方法
参考http://maximusget.iteye.com/blog/734108
- ExcelUtil.zip (1.4 MB)
- 下载次数: 10
评论
8 楼
fsword
2012-02-23
秦时明月黑 写道
测试了下,达到10万条数据时,出现堆内存溢出情况,大家看下有什么更好的思路,DataToExcelModel类抛出溢出
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getMethod0(Class.java:2670)
at java.lang.Class.getMethod(Class.java:1603)
at cn.edu.zzuli.yxy.DataToExcelModel.dataToExcelUtil(DataToExcelModel.java:80)
at cn.edu.zzuli.yxy.Test.main(Test.java:47)
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getMethod0(Class.java:2670)
at java.lang.Class.getMethod(Class.java:1603)
at cn.edu.zzuli.yxy.DataToExcelModel.dataToExcelUtil(DataToExcelModel.java:80)
at cn.edu.zzuli.yxy.Test.main(Test.java:47)
全部装入内存再输出当然不能避免OOM了,要边读边写,可以考虑用迭代器来做。
7 楼
tuyuan
2012-01-17
秦时明月黑 写道
测试了下,达到10万条数据时,出现堆内存溢出情况,大家看下有什么更好的思路,DataToExcelModel类抛出溢出
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getMethod0(Class.java:2670)
at java.lang.Class.getMethod(Class.java:1603)
at cn.edu.zzuli.yxy.DataToExcelModel.dataToExcelUtil(DataToExcelModel.java:80)
at cn.edu.zzuli.yxy.Test.main(Test.java:47)
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getMethod0(Class.java:2670)
at java.lang.Class.getMethod(Class.java:1603)
at cn.edu.zzuli.yxy.DataToExcelModel.dataToExcelUtil(DataToExcelModel.java:80)
at cn.edu.zzuli.yxy.Test.main(Test.java:47)
我自己写了一个excel2007格式的导出帮助工具
.每个sheet可以导出100W的数据量
6 楼
fyjabb
2012-01-17
5 楼
秦时明月黑
2012-01-17
nighty 写道
看看jxls
谢谢您的指点,初出茅庐,见识短浅
4 楼
nighty
2012-01-17
看看jxls
3 楼
xinannansha
2012-01-16
导出excel或生成excel报表可以参考这个组件,方便实用简单
http://jxls.sourceforge.net/
大数据量的导出本来用excel就不合适,个人觉得应该考虑其他方式
http://jxls.sourceforge.net/
大数据量的导出本来用excel就不合适,个人觉得应该考虑其他方式
2 楼
JetMah
2012-01-16
把数据都放到内存里面当然要溢出了
1 楼
秦时明月黑
2012-01-16
测试了下,达到10万条数据时,出现堆内存溢出情况,大家看下有什么更好的思路,DataToExcelModel类抛出溢出
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getMethod0(Class.java:2670)
at java.lang.Class.getMethod(Class.java:1603)
at cn.edu.zzuli.yxy.DataToExcelModel.dataToExcelUtil(DataToExcelModel.java:80)
at cn.edu.zzuli.yxy.Test.main(Test.java:47)
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getMethod0(Class.java:2670)
at java.lang.Class.getMethod(Class.java:1603)
at cn.edu.zzuli.yxy.DataToExcelModel.dataToExcelUtil(DataToExcelModel.java:80)
at cn.edu.zzuli.yxy.Test.main(Test.java:47)
发表评论
-
hive常用资料整理
2013-09-22 10:28 689hive基本wiki FaceBook 镜像(被墙):h ... -
一步步构建大型网站架构
2013-04-12 13:01 802一步步构建大型网站架构 之前我简单向大家介绍了各个知名 ... -
ZooKeeper典型应用场景一览
2013-04-01 18:51 984值得注意的是,ZK并非 ... -
nginx常用命令
2012-12-10 16:26 825/home/nginx/conf/ n ... -
maven项目管理工具常见命令
2012-07-09 11:16 1474jar包查询:http://mvnrepository.co ... -
eclipse下插件svn的安装
2011-12-05 15:45 939在eclispe目录,如D:\Program Files\My ... -
闲话淘宝网和新浪微博架构
2011-11-01 10:53 1845如今分布式系统在国 ... -
迈向架构师的第一步
2011-10-28 16:47 719有一个多月没有写blog ... -
浅谈大型网站动态应用系统架构
2011-10-16 20:14 777动态应用,是相对于网站静态内容而言,是指以c/c++、ph ... -
JavaEE程序员必读图书大推荐
2011-09-21 17:48 619下面是我根据多年的阅读和实践经验,给您推荐的一些图书: ... -
分布式存储系统Hadoop、hypertable
2011-09-17 13:27 1300分布式系统(distributed system)是建立在网络 ... -
我在华为工作十年
2011-07-31 10:05 965学习前人的经历,从成 ... -
软件开发面试百问
2011-07-21 20:36 832文/Jurgen Appelo 译/李剑 想雇 ... -
平衡艺术-从菜鸟到架构师
2011-07-21 20:33 840胡喜 作为一个不是科班出身、没有正规学习过计算机知 ... -
话说程序员的职业生涯
2011-07-21 20:24 690IBM软件集团大中华区总 ... -
poi读取excel数据到数据库中
2011-06-30 21:24 1793最近应朋友请求,做一个小程序读取excel数据到Mysql数据 ...
相关推荐
"c# 按模板导出Excel 通用类"就是为了解决这个问题而设计的,它允许开发者按照预先设定的模板快速、高效地生成Excel文件。 这个通用类的核心功能包括: 1. **模板支持**:它可以读取已存在的Excel模板文件,保留...
在Delphi编程环境中,开发Excel通用打印功能是一项常见的任务,特别是在需要进行数据报表处理和分析时。本资源“Excel通用打印(Delphi)”提供了一种解决方案,它可能包含了一个用户友好的界面,使得用户能够方便地...
【Excel表格通用模板:项目进度表.pdf】 项目进度表是管理项目执行过程中的核心工具,它用于跟踪和控制项目的各个阶段,确保项目按时、按预算完成。这份名为"项目进度表"的Excel模板是一个适用于各类项目的管理工具...
总之,"java导出excel文档通用工具类"是Java开发中的一个实用组件,它封装了Excel文件生成的复杂性,使得开发者可以专注于数据处理和业务逻辑,而不是底层的文件操作。通过学习和理解这个工具类的工作原理,我们可以...
《Office办公通用模板100例》是一份涵盖了多种办公场景的应用模板集合,旨在提高工作效率,简化日常文档制作过程。这些模板适用于Microsoft Office的多个组件,包括Word、Excel、PowerPoint等,为用户提供了丰富的...
### VBasic.Net编写一个通用报表组件 #### 一、引言 在软件开发过程中,数据报表的生成是一项常见且重要的任务。大多数开发语言虽然提供了基本的报表工具支持,但这些工具往往局限于固定的报表格式,缺乏灵活性,...
而“通用excel凭证导入工具”是T3系统的一个扩展组件,它允许用户利用Excel的便捷性预先整理好凭证数据,然后一次性批量导入到T3系统中,大大提升了凭证处理的速度。 Excel作为广泛使用的电子表格软件,拥有强大的...
1. **API接口模板**:API(Application Programming Interface)接口是软件系统之间交互的桥梁,定义了不同组件或服务之间的交互方式。接口模板提供了一套标准化的结构,包括接口名、请求方法、URL、请求参数、响应...
模板中的"超强多通用"特性意味着它包含了大量的设计元素和组件,如图表、图形、图片框、流程图、时间线等,这些都可以根据用户的实际需求进行组合和定制,以展现复杂的数据或流程。对于那些不熟悉设计软件的用户来说...
- **插件系统**:设计插件体系,方便扩展组件功能,如导出Excel、图表可视化等。 6. **案例分析** - **用户管理**:在员工管理系统中,DataTable可展示员工列表,支持搜索姓名、按部门排序、查看详细信息等操作。...
1. **抽象通用组件**:提取Excel读取和数据库存储的共性,封装成独立的组件,将业务逻辑与数据处理分离开,确保代码的复用性和可维护性。 2. **规则配置**:设计一套规则表,包含Excel表格结构与数据库表结构的映射...
Power Excel 是 Microsoft Excel 的增强版,集成了 Power Query(获取和转换数据)、Power Pivot(高级数据建模)以及 Power View(交互式报表)等组件,为用户提供了更高效的数据处理和分析能力。在零售业中,利用 ...
在添加数据时,我们可以使用 Excel 的 Application 组件,该组件在安装 Excel 时安装到系统中。我们的操作也都是针对该组件。 四、Excel 报表的生成与打印 在生成报表时,我们需要使用 ASP 生成报表,并将其保存到...
5. **Layui的使用**:Layui提供了一系列组件,如表格、按钮、弹窗等,可以用于构建用户友好的界面。在导出和导入功能中,Layui可以用于展示数据列表、提供导入文件的上传控件、显示进度条等,提升用户体验。 6. **...
一个基础的自定义动态导出Excel封装类应包含以下组件: - **配置参数**:如文件名、工作簿名称、表格样式等。 - **数据模型**:用于存储要导出的数据,可以是自定义的Java对象。 - **导出方法**:根据数据模型创建...
易语言提供了一个名为“通用数据访问组件”的模块,其中包含了读取和写入Excel文件所需的接口。例如,`打开工作簿`函数用于打开一个Excel文件,`关闭工作簿`函数则用于关闭已打开的文件。另外,`选择工作表`和`选择...
在描述中提到的"POI导出.pdf,.doc,.xls,.jpg四种格式通用组件",意味着该组件不仅限于处理Microsoft Office文档,还支持生成PDF和图像文件(如.jpg),实现了多种文件格式间的转换和导出。 1. **Apache POI 概述**...
"Excel表格+Word文档各类各行业模板-客户信用额度申表.zip"是一个包含多个行业通用的模板,主要用于处理和管理客户的信用额度申请。下面将详细阐述这两个软件在处理此类任务时的应用和相关知识点。 首先,Excel表格...
"Excel表格+Word文档各类各行业模板-材料提交日报表.zip"这个压缩包文件显然提供了多种行业通用的模板,帮助用户快速创建专业且规范的材料提交日报表。下面我们将详细探讨Excel表格和Word文档在创建日报表中的应用,...