`

excel通用模板组件

阅读更多

最近在公司实习时,项目中总遇到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

5
0
分享到:
评论
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)


全部装入内存再输出当然不能避免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)



我自己写了一个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就不合适,个人觉得应该考虑其他方式
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)

相关推荐

    c# 按模板导出Excel 通用类

    "c# 按模板导出Excel 通用类"就是为了解决这个问题而设计的,它允许开发者按照预先设定的模板快速、高效地生成Excel文件。 这个通用类的核心功能包括: 1. **模板支持**:它可以读取已存在的Excel模板文件,保留...

    Excel通用打印(delphi)

    在Delphi编程环境中,开发Excel通用打印功能是一项常见的任务,特别是在需要进行数据报表处理和分析时。本资源“Excel通用打印(Delphi)”提供了一种解决方案,它可能包含了一个用户友好的界面,使得用户能够方便地...

    Excel表格通用模板:项目进度表.pdf

    【Excel表格通用模板:项目进度表.pdf】 项目进度表是管理项目执行过程中的核心工具,它用于跟踪和控制项目的各个阶段,确保项目按时、按预算完成。这份名为"项目进度表"的Excel模板是一个适用于各类项目的管理工具...

    java导出excel文档通用工具类

    总之,"java导出excel文档通用工具类"是Java开发中的一个实用组件,它封装了Excel文件生成的复杂性,使得开发者可以专注于数据处理和业务逻辑,而不是底层的文件操作。通过学习和理解这个工具类的工作原理,我们可以...

    Office 办公通用模板100例

    《Office办公通用模板100例》是一份涵盖了多种办公场景的应用模板集合,旨在提高工作效率,简化日常文档制作过程。这些模板适用于Microsoft Office的多个组件,包括Word、Excel、PowerPoint等,为用户提供了丰富的...

    VBasic.Net编写一个通用报表组件

    ### VBasic.Net编写一个通用报表组件 #### 一、引言 在软件开发过程中,数据报表的生成是一项常见且重要的任务。大多数开发语言虽然提供了基本的报表工具支持,但这些工具往往局限于固定的报表格式,缺乏灵活性,...

    通用excel凭证导入工具(T3).zip

    而“通用excel凭证导入工具”是T3系统的一个扩展组件,它允许用户利用Excel的便捷性预先整理好凭证数据,然后一次性批量导入到T3系统中,大大提升了凭证处理的速度。 Excel作为广泛使用的电子表格软件,拥有强大的...

    API接口模板-Word和excel.zip

    1. **API接口模板**:API(Application Programming Interface)接口是软件系统之间交互的桥梁,定义了不同组件或服务之间的交互方式。接口模板提供了一套标准化的结构,包括接口名、请求方法、URL、请求参数、响应...

    简约PPT模板 超强多通用多功能通用PPT模板

    模板中的"超强多通用"特性意味着它包含了大量的设计元素和组件,如图表、图形、图片框、流程图、时间线等,这些都可以根据用户的实际需求进行组合和定制,以展现复杂的数据或流程。对于那些不熟悉设计软件的用户来说...

    基于Java的Web通用DataTable组件设计.zip

    - **插件系统**:设计插件体系,方便扩展组件功能,如导出Excel、图表可视化等。 6. **案例分析** - **用户管理**:在员工管理系统中,DataTable可展示员工列表,支持搜索姓名、按部门排序、查看详细信息等操作。...

    大数据Excel通过POI导入数据库通用设计方案

    1. **抽象通用组件**:提取Excel读取和数据库存储的共性,封装成独立的组件,将业务逻辑与数据处理分离开,确保代码的复用性和可维护性。 2. **规则配置**:设计一套规则表,包含Excel表格结构与数据库表结构的映射...

    PowerBI零售行业通用业务模型

    Power Excel 是 Microsoft Excel 的增强版,集成了 Power Query(获取和转换数据)、Power Pivot(高级数据建模)以及 Power View(交互式报表)等组件,为用户提供了更高效的数据处理和分析能力。在零售业中,利用 ...

    asp生成excel报表

    在添加数据时,我们可以使用 Excel 的 Application 组件,该组件在安装 Excel 时安装到系统中。我们的操作也都是针对该组件。 四、Excel 报表的生成与打印 在生成报表时,我们需要使用 ASP 生成报表,并将其保存到...

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

    5. **Layui的使用**:Layui提供了一系列组件,如表格、按钮、弹窗等,可以用于构建用户友好的界面。在导出和导入功能中,Layui可以用于展示数据列表、提供导入文件的上传控件、显示进度条等,提升用户体验。 6. **...

    自定义动态导出excel封装类

    一个基础的自定义动态导出Excel封装类应包含以下组件: - **配置参数**:如文件名、工作簿名称、表格样式等。 - **数据模型**:用于存储要导出的数据,可以是自定义的Java对象。 - **导出方法**:根据数据模型创建...

    易语言EXCEL快速导入导出

    易语言提供了一个名为“通用数据访问组件”的模块,其中包含了读取和写入Excel文件所需的接口。例如,`打开工作簿`函数用于打开一个Excel文件,`关闭工作簿`函数则用于关闭已打开的文件。另外,`选择工作表`和`选择...

    POI导出.pdf,.doc,.xls,.jpg四种格式通用组件

    在描述中提到的"POI导出.pdf,.doc,.xls,.jpg四种格式通用组件",意味着该组件不仅限于处理Microsoft Office文档,还支持生成PDF和图像文件(如.jpg),实现了多种文件格式间的转换和导出。 1. **Apache POI 概述**...

    Excel表格+Word文档各类各行业模板-客户信用额度申表.zip

    "Excel表格+Word文档各类各行业模板-客户信用额度申表.zip"是一个包含多个行业通用的模板,主要用于处理和管理客户的信用额度申请。下面将详细阐述这两个软件在处理此类任务时的应用和相关知识点。 首先,Excel表格...

    Excel表格+Word文档各类各行业模板-材料提交日报表.zip

    "Excel表格+Word文档各类各行业模板-材料提交日报表.zip"这个压缩包文件显然提供了多种行业通用的模板,帮助用户快速创建专业且规范的材料提交日报表。下面我们将详细探讨Excel表格和Word文档在创建日报表中的应用,...

Global site tag (gtag.js) - Google Analytics