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文件:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGNtZHk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

当中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();
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

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

  1. 基于注解的bean配置

    基于注解的bean配置,主要是进行applicationContext.xml配置.DAO层类注解.Service层类注解. 1.在applicationContext.xml文件中配置信息如下 &l ...

  2. [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. SpringMVC自动扫描@Controller注解的bean

    若要对@Controller注解标注的bean进行自动扫描,必须将<context:component-scan base-package="包路径.controller"/ ...

  4. 开涛spring3(12.3) - 零配置 之 12.3 注解实现Bean定义

    12.3  注解实现Bean定义 12.3.1  概述 前边介绍的Bean定义全是基于XML方式定义配置元数据,且在[12.2注解实现Bean依赖注入]一节中介绍了通过注解来减少配置数量,但并没有完全 ...

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

    12.2  注解实现Bean依赖注入 12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的 ...

  6. (转)Spring注解完成Bean的定义

    使用Spring注解完成Bean的定义 2010-04-21 16:48:54|  分类: spring|举报|字号 订阅     下载LOFTER客户端     通过@Autowired或@Reso ...

  7. Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等

    实验1:配置通过静态工厂方法创建的bean  [通过静态方法提供实例对象,工厂类本身不需要实例化!] 1.创建静态工厂类 public class StaticFactory { private st ...

  8. (转)java之Spring(IOC)注解装配Bean详解

    java之Spring(IOC)注解装配Bean详解   在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...

  9. 通过注解配置Bean

    之前说的三种配置方式,都是使用XML配置,现在我们说说使用注解配置Bean. 这部分内容主要分为两个部分:使用注解配置Bean,使用注解配置Bean属性. 在classpath中扫描组件 组件扫描:S ...

随机推荐

  1. oracle 的常用语句

    第一部分 基本语法 //拼接表字段 select id   ||   'is'   ||   name from admin select * from emp where ename like '% ...

  2. 【Ubuntu】升到14,攻克了进入用户后没有菜单条导航栏的问题

    控制台还能够进,用ctrl+alt+f1用老账号登录,用sudo adduser test新建立一个名字叫test的帐号 然后就能够进去了,可能是配置文件坏掉了

  3. Linux - Linux系统目录架构

    Linux系统目录架构   Bin: 保存的是二进制可执行文件,也就是我们所敲的那些命令. Boot: 引导目录,整个操作系统的引导启动都是在boot目录下面.最主要的文件是vmLinuz-……,内核 ...

  4. vector中的find

    vector中的find - huangyimin的专栏 - 博客频道 - CSDN.NET vector中的find 2011-01-13 09:57 11334人阅读 评论(0) 收藏 举报 ve ...

  5. 使用RNSwipeViewController类库进行视图切换

    如今很多应用已经不再局限于点击按钮触发事件来进行视图之间切换,为迎合给予用户更好体验,体现iOS系统极佳用户体验,使用手势来进行各个视图之间切换,用户至于一个大拇指在屏幕中央就可浏览到很多信息: 关于 ...

  6. oracle切割字符串后以单列多行展示

    原始的sql: select substr(field1, instr(field1, '|', 1, rownum) + 1, instr(field1, '|', 1, rownum + 1) - ...

  7. Struts2通过自己定义拦截器实现登录之后跳转到原页面

    这个功能对用户体验来说是非常重要的.实现起来事实上非常easy. 拦截器的代码例如以下: package go.derek.advice; import go.derek.entity.User; i ...

  8. SAP屏幕框架的创建

    1.创建包括文本的基本框架 REPORT ztest_sum. TABLES:mara,syst. WITH FRAME TITLE mytitle. "mytitle是框架上的文本 ) A ...

  9. openCV之头文件分析

    我们利用openCV开源库进行项目开发时,往往要牵涉到头文件的添加问题,而openCV中头文件众多,该如何选择呢?下面对openCV2.4.10的头文件进行一个简单的梳理,以便能够快速的添加对应的头文 ...

  10. AIR

    There is a meaning for wings that cannot fly,it's a previous memory of when you once flew through th ...