`
whoosh
  • 浏览: 235400 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

“Java+POI+模板”二:基于对象列表输出到excel(利用反射)

 
阅读更多

请先阅读 “Java+POI+模板”一:打造复杂Excel 报表  

 

1. 首先创建ExcelUtil类,该类将要实现将一组对象转换为Excel表格,并且可以从Excel表格中读取到一组List对象中。现在我们先创建类并实现单例。

 

public class ExcelUtil {
	private static ExcelUtil eu = new ExcelUtil();
	private ExcelUtil(){}
	
	public static ExcelUtil getInstance() {
		return eu;
	}
}

 2. 创建一个Annotation类,用来在对象的get方法上加入的annotation,通过该annotation说明某个属性所对应的标题。

 

@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelResources {
	/**
	 * 属性的标题名称
	 * @return
	 */
	String title();
	/**
	 * 在excel的顺序
	 * @return
	 */
	int order() default 9999;
}

 3. 创建ExcelHeader类,用来存储Excel标题的对象,通过该对象可以获取标题和方法的对应关系

 

public class ExcelHeader implements Comparable<ExcelHeader>{
	/**
	 * excel的标题名称
	 */
	private String title;
	/**
	 * 每一个标题的顺序
	 */
	private int order;
	/**
	 * 说对应方法名称
	 */
	private String methodName;
	
	
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public int getOrder() {
		return order;
	}
	public void setOrder(int order) {
		this.order = order;
	}
	public String getMethodName() {
		return methodName;
	}
	public void setMethodName(String methodName) {
		this.methodName = methodName;
	}
	
	public int compareTo(ExcelHeader o) {
		return order>o.order?1:(order<o.order?-1:0);
	}
	public ExcelHeader(String title, int order, String methodName) {
		super();
		this.title = title;
		this.order = order;
		this.methodName = methodName;
	}
	@Override
	public String toString() {
		return "ExcelHeader [title=" + title + ", order=" + order
				+ ", methodName=" + methodName + "]";
	}
	
	
}

 4. 创建Model类,并在属性的get方法上面加上我们的Annotation

 

public class User {
	
	private int id;
	private String username;
	private String nickname;
	private int age;
	
	@ExcelResources(title="用户标识",order=1)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	@ExcelResources(title="用户名",order=2)
	public String getUsername() {
		return username;
	}
	
	public void setUsername(String username) {
		this.username = username;
	}
	
	@ExcelResources(title="用户昵称",order=3)
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	
	@ExcelResources(title="用户年龄",order=4)
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public User(int id, String username, String nickname, int age) {
		super();
		this.id = id;
		this.username = username;
		this.nickname = nickname;
		this.age = age;
	}
	public User() {
		super();
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", nickname="
				+ nickname + ", age=" + age + "]";
	}
	
	
}

 5. 在ExcelUtil中实现exportObj2ExcelByTemplate方法,用于处理将对象转换为Excel。

 

public void exportObj2ExcelByTemplate(Map<String,String> datas,String template,String outPath, List objs, Class clz, boolean isClasspath){
		ExcelTemplate et=ExcelTemplate.getInstance();
		if(isClasspath){
			et.readTemplateByClasspath(template);
		}else{
			et.readTemplateByPath(template);
		}
		List<ExcelHeader> headers=getHeaderList(clz);
		Collections.sort(headers);
		//输出标题
		et.createNewRow();
		for (ExcelHeader eh : headers) {
			et.createCell(eh.getTitle());
		}
		//输出值
		try {
			for(Object obj:objs){
				et.createNewRow();
				for(ExcelHeader eh:headers){
					String mn=eh.getMethodName();
					Method m=clz.getDeclaredMethod(mn);
					Object rel=m.invoke(obj);
					et.createCell(rel.toString());
				}
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		et.writeToFile(outPath);
	}

这里输出值的过程也可以通过导入BeanUtils来处理

//输出值
		try {
			for(Object obj:objs){
				et.createNewRow();
				for(ExcelHeader eh:headers){
//					String mn=eh.getMethodName();
//					Method m=clz.getDeclaredMethod(mn);
//					Object rel=m.invoke(obj);
//					et.createCell(rel.toString());
					et.createCell(BeanUtils.getProperty(obj,getMethodName(eh) ));
				}
			}
		} 

 

 exportObj2ExcelByTemplate方法方法会调用getHeaderList方法,来获取Annotation的title以及order

 

private List<ExcelHeader> getHeaderList(Class clz){
		List<ExcelHeader> headers=new ArrayList<ExcelHeader>();
		Method[] ms = clz.getDeclaredMethods();
		for (Method m : ms) {
			String mn =m.getName();
			if(mn.startsWith("get")&& m.isAnnotationPresent(ExcelResource.class)){
				ExcelResource er=m.getAnnotation(ExcelResource.class);
				headers.add(new ExcelHeader(er.title(), er.order(), mn));
			}
		}
		return headers;
		
	}

 6. 实现此功能

 

@Test
	public void testObj2Xls() {
		List<User> users = new ArrayList<User>();
		users.add(new User(1,"aaa","水水水",11));
		users.add(new User(2,"sdf","水水水",11));
		users.add(new User(3,"sdfde","水水水",11));
		users.add(new User(4,"aaa","水水水",11));
		users.add(new User(54,"aaa","水水水",11));
		users.add(new User(16,"aaa","水水水",11));
		ExcelUtil.getInstance().exportObj2ExcelByTemplate(null,"/excel/user.xls","d:/test/poi/tus.xls", users, User.class, true);
	}

 原先的模板如下图:



 插入完成后的模板如下图:



 

  • 大小: 29.9 KB
  • 大小: 89.7 KB
分享到:
评论

相关推荐

    SpringBoot+POI+反射机制实现复杂Excel文件解析

    在本文中,我们将深入探讨如何使用SpringBoot、Apache POI库和Java的反射机制来解析复杂的Excel文件。SpringBoot是一个流行的轻量级框架,它简化了Java应用的开发过程,而POI则是一个用于读写Microsoft Office格式...

    java_poi导入excel通用工具类V0915

    "java_poi导入excel通用工具类V0915" 提供了一种通用的方式来处理Excel数据的导入工作,它支持多种赋值方式,包括单个对象、列表对象以及指定坐标的赋值。 首先,让我们深入理解一下这个工具类的主要功能: 1. **...

    java 根据简单对象自动 生成excel

    通过这个示例,你可以了解到如何将Java对象转换为Excel表格,以及如何利用反射和注解来增强代码的灵活性和可扩展性。这在实际开发中非常有用,特别是在需要动态生成或解析不同结构数据的情况下。

    基于类注解将对象数据导出到excel

    标题 "基于类注解将对象数据导出到excel" 提示我们关注的是一个关于使用类注解和编程技术将对象数据转换并导出为Excel文件的解决方案。这通常涉及到Java编程语言,因为Java广泛使用注解(annotations)来增强代码的...

    java导入导出通用模板

    总结起来,Java导入导出通用模板是利用自定义注解提供元数据,通过反射实现动态操作,结合Java POI库处理Excel文件,以实现数据的灵活导入和导出。这种模板化的设计模式在Java开发中具有广泛的应用价值,尤其是在...

    JAVA读取Excel,建库建表,并生成java实体

    如果需要自动生成实体类,可以考虑使用模板引擎如FreeMarker或Velocity,将Excel数据映射到模板上,生成Java源代码。 5. **SyncDBJava-master项目**: 提供的压缩包文件名称`SyncDBJava-master`可能是一个包含源...

    Java导出Excel详细示例.pdf

    它将通过实例展示如何使用Java代码导出数据到Excel文件中,使用的是Apache POI库。文档中提到的“Java基础学习免费资源”和“预祝你成功的学会Java基础”,说明该文档是面向Java初学者的资源,旨在帮助他们快速掌握...

    Java处理Excel源代码

    7. **数据写入**:将Java对象写回Excel,首先需要创建相应的行和单元格,然后将对象的属性值设置到对应的单元格中。如果对象列表很大,考虑使用迭代器或流式处理以减少内存占用。 8. **样式和格式**:POI还允许设置...

    java 生成固定 java模板类导入exc文件

    在Java编程中,生成固定的Java模板类并导入Excel文件是一项常见的任务,特别是在处理大量数据时。这个场景通常出现在数据处理、报表生成或者自动化测试中。下面将详细解释这个过程涉及的关键知识点。 首先,我们...

    Excel表格操作实用工具类

    本实用工具类利用Java编程语言中的泛型、反射和Apache POI库,实现了对Excel表格的强大功能,以适应各种实体封装的报表表格需求。 首先,让我们深入理解一下核心概念: 1. **泛型**:Java泛型是一种在编译时检查...

    java导入导出excel

    从Java 8开始,引入了流(Stream)的概念,虽然原生的Java API不直接支持Excel操作,但可以借助其他库,如jOOR,通过反射API操作Excel对象,结合Java 8的数据流进行处理。 例如,使用jOOR库读取Excel: ```java ...

    注解反射导出Excel自定义中文表头

    在Java编程中,导出Excel数据是一项常见的任务,特别是在数据处理和报表生成的场景下。本文将深入探讨如何使用注解反射技术来实现Excel自定义中文表头的导出,结合数据库查询的数据,以实现更加灵活和人性化的数据...

    excel-demo.rar

    这个项目可能包含了代码示例,演示如何读取Excel文件并利用Java的反射机制将数据映射到JavaBean对象中。 Apache POI是Apache软件基金会的开源项目,主要为微软的Office文档格式提供读写功能,包括Excel(XLS、XLSX)...

    Java最全学习资料+面试题+DOS命令+设计模式+Excel技巧+java学习笔记

    Java程序员可以通过Apache POI等库与Excel交互,实现自动化报告、数据导入导出等功能。学习如何高效使用Excel公式、图表、数据透视表等特性,将有助于提升工作效率。 6. **Java学习笔记**:个人的学习笔记通常包含...

    poi动态导出excel(适合多数据).pdf

    标题"poi动态导出excel(适合多数据).pdf"涉及到的关键知识点是使用Apache POI库动态创建和导出Excel文件。Apache POI是一个流行的Java库,它允许开发人员读写Microsoft Office格式的文件,包括Excel。在本例中,我们...

    java excel导出 支持03 07导出 样式可配置

    通过使用这些API,开发者可以创建动态的Excel文件,将Java对象的数据反射到对应的单元格中。 动态反射是Java编程中的一个重要概念,它允许程序在运行时检查和使用类的信息,包括方法和字段。在这个上下文中,反射被...

    包含Easy Excel,Java实现操作excel的读写等,个人学习所用

    Easy Excel的核心理念是无模板处理,它通过反射技术将Java对象与Excel单元格对应,使得数据的读写更加灵活。它提供了一个流式处理的方式,能够有效避免内存溢出问题,尤其适用于处理大量数据。这个特性使得它在...

    用easypoi 制表 格式 列子

    2. **写入Excel数据**:同样,通过注解和反射机制,Easypoi可以将Java对象的数据写入到Excel中。开发者只需要创建一个对象列表,调用相应的方法,就能自动生成Excel文件。 3. **模板处理**:Easypoi支持使用模板来...

    JAVA读取Excel,建库建表,并生成java实体.zip

    这个名为"JAVA读取Excel,建库建表,并生成java实体.zip"的压缩包文件,显然提供了一个完整的解决方案,涵盖了从读取Excel数据到在数据库中创建表,以及根据Excel内容生成Java实体类的全过程。下面我们将详细探讨...

    jxls开发jar包

    2. **数据绑定**:`jxls`能够将Java对象的属性值绑定到Excel模板的单元格,这极大地简化了数据到模板的映射过程。 3. **表格操作**:支持复杂的表格操作,如合并单元格、调整行高和列宽、添加条件格式等。 4. **...

Global site tag (gtag.js) - Google Analytics