使用注解实现 bean 转 csv

csv 文件是以

aaa,bbb,ccc

aaa,bbb,ccc

保存的

这里的要求是将 List<T> 类型的线性表 转化成 类似 html 中 table的格式,即第一行是 head 后面是 body

使用注解的效果如下 :


                List<User> users=new ArrayList<User>();
	   	users.add(new User("刘夏楠", 23, "男"));
		users.add(new User("刘夏楠", 23, "男"));
		users.add(new User("刘夏楠", 23, "男"));

		writeBeanToCsvFile("D:\\test.csv", users);
		

csv文件:

其中bean user 如下:

package bean;

import annotation.csvField;

public class User {

	@csvField("姓名")	private String name;
	@csvField("年龄")private Integer age;
	private String sex;

	public User(String name, Integer age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}

}

达到的效果就是

拥有 @csvField 注解的字段才会被 写入csv文件

并且 @csvField 的值作为csv文件的 title 即 第一行

我们使用反射来达到这个效果

bean 转 List<String[]> 如下:

private static <T> List<String[]> getStringArrayFromBean(List<T> beans) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		if(beans.size()<1)
			throw new IllegalArgumentException("长度不能小于1");

		List<String[]> result=new ArrayList<String[]>();
		Class<? extends Object> cls=beans.get(0).getClass();//获取泛型类型
		Field[] declaredFields=cls.getDeclaredFields();
		List<Field> annoFields=new ArrayList<Field>();
		for(int i=0;i<declaredFields.length;i++){//筛选出拥有注解的字段
			csvField anno=declaredFields[i].getAnnotation(csvField.class);//获取注解
			if(anno!=null)
				annoFields.add(declaredFields[i]);
		}
		String[] title=new String[annoFields.size()];	

		for(int i=0;i<annoFields.size();i++){
			title[i]=declaredFields[i].getAnnotation(csvField.class).value();//获取注解的值
		}
		result.add(title);

		for(T each:beans){
			String[] item=new String[annoFields.size()];
			for(int i=0;i<annoFields.size();i++){
				String fieldName=annoFields.get(i).getName();
				String methodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);

					Method method=each.getClass().getMethod(methodName, null);
					String val=method.invoke(each, null).toString();
					item[i]=val;
			}
			result.add(item);
		}
		return result;
	}

然后使用 csv 的一个工具包 javacsv.jar来写入csv文件

public static <T> void  writeBeanToCsvFile(String csvFilePath,List<T> beans) throws IOException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		File file =new File(csvFilePath);
		if(!file.exists()){		//如果文件不存在,创建文件
				file.createNewFile();
		}
		 CsvWriter wr =new CsvWriter(csvFilePath,',', Charset.forName("GBK"));
		List<String[]> contents=getStringArrayFromBean(beans);
		 for(String[] each:contents){
			 wr.writeRecord(each);
		 }
		 wr.close();
	}
时间: 2024-10-14 04:26:38

使用注解实现 bean 转 csv的相关文章

基于注解的bean配置

基于注解的bean配置,主要是进行applicationContext.xml配置.DAO层类注解.Service层类注解. 1.在applicationContext.xml文件中配置信息如下 <!--定义服务层代码存放的包扫描路径--> <context:component-scan base-package="org.mainstudio.com.service,org.mainstudio.com.dao" /> 其中base-package包括了要进行

14Spring通过注解配置Bean(2)

下面将对13Spring通过注解配置Bean(1)的中Repository.Service.Controller通过注解方式来建立关联. <context:component-scan>元素还会自动注册AutowiredAnnotationBeanPostProcessor后置处理器实例,该实例可以自动装配具有@Autowired属性. @Autowired注解会自动装配具有兼容类型的单个Bean属性 ——构造器,普通字段(即使是非public),一切具有参数的方法都可以应用@Autowire

SpringMVC自动扫描@Controller注解的bean

若要对@Controller注解标注的bean进行自动扫描,必须将<context:component-scan base-package="包路径.controller"/>放置在dispatcherservlet的配置文件中,若配置在ContextLoaderListener的配置文件applicationContext.xml中则不起作用 <!-- 上下文配置文件 --> <context-param> <param-name>co

Spring4学习笔记-通过注解配置bean

通过注解配置Bean TestObject.java package com.spring.beans.annotation; import org.springframework.stereotype.Component;; @Component public class TestObject { } UserController.java package com.spring.beans.annotation.controller; import org.springframework.st

[转]Spring注解[email&#160;protected]注解、@Bean注解以及配置自动扫描、bean作用域

1.@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文) package com.test.spring.support.configuration; @Configuration public class TestConfiguration { public TestConfiguration(){ System.out.println("spring容器启动初始化...");

[学习笔记]Spring注解实现Bean

12.3  注解实现Bean定义 12.3.1  概述 前边介绍的Bean定义全是基于XML方式定义配置元数据,且在[12.2注解实现Bean依赖注入]一节中介绍了通过注解来减少配置数量,但并没有完全消除在XML配置文件中的Bean定义,因此有没有方式完全消除XML配置Bean定义呢? Spring提供通过扫描类路径中的特殊注解类来自动注册Bean定义.同注解驱动事务一样需要开启自动扫描并注册Bean定义支持,使用方式如下(resources/chapter12/ componentDefini

Spring -- 注解配置Bean

通过注解配置Bean 特定组件包括: @Component: 基本注解, 标识了一个受 Spring 管理的组件 @Respository: 标识持久层组件 @Service: 标识服务层(业务层)组件 @Controller: 标识表现层组件 上面的组件可以混用,因为IOC容器并无法区分当前类是否为业务.持久.还是表现层. 对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称 使用注解配置Bean前,我们

开涛spring3(12.2) - 零配置 之 12.2 注解实现Bean依赖注入

12.2  注解实现Bean依赖注入 12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的数据将覆盖基于注解配置中的依赖注入的数据. Spring3的基于注解实现Bean依赖注入支持如下三种注解: Spring自带依赖注入注解: Spring自带的一套依赖注入注解: JSR-250注解:Java平台的公共注解,是Java EE 5规范之一,在JDK6中默认包含这些注解,从Spring2.

13Spring通过注解配置Bean(1)

配置Bean的形式:基于XML文件的方式:基于注解的方式(基于注解配置Bean:基于注解来装配Bean的属性) 下面介绍基于注解的方式来配置Bean. ——组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. ——特定组件包括: [email protected]:基本注解,标识了一个受Spring管理的组件 [email protected]:标识持久层组件 [email protected]:标识服务层(业务层)组