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. tq2440+fedora安装qt4.5

    1. make[1]: arm-none-linux-gnueabi-g++:命令未找到 make[1]: *** [.obj/release-shared-emb-arm/qatomic_arm.o ...

  2. iOS学习——UI基础UIButton(七)

    前面写了UIWindow.UIViewController,那些都是一些框架,框架需要填充上具体的view才能组成我们的应用,移动应用开发中UI占了很大一部分,最基础的UI实现是使用系统提供的各种控件 ...

  3. Swift教程之typealias代替OC的typedef

    //MARK:-------swift中的typedef-------------- //使用 keyword定义类型别名,相似typedef typealias NSInteger = Int va ...

  4. Swift - 使用TableView的静态单元格进行页面布局

    通过使用静态单元格的列表,我们可以很方便的进行页面布局.下面通过一个“添加任务页面”来进行演示. 效果图如下: 实现步骤: 1,在storyboard中拖入一个TableViewController, ...

  5. JS - 焦点图

    下载地址:http://www.lanrentuku.com/js/jiaodiantu-1076.html 修改焦点图: CSS代码: /* 懒人图库 搜集整理 www.lanrentuku.com ...

  6. 基础知识(9)- Swing用户界面组件

    9.1 Swing和模型-视图-控制器设计模式  9.1.1 设计模式  9.1.2 模型-视图-控制器模式  9.1.3 Swing按钮的模型-视图-控制器分析 9.2 布局管理概述  9.2.1 ...

  7. Boost Thread学习笔记

    thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 W ...

  8. [Machine Learning (Andrew NG courses)]IV.Linear Regression with Multiple Variables

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenFoXzE5OTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  9. hadoop出现ava.lang.ClassNotFoundException: org.codehaus.jackson.map.JsonMappingException

    Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/map/JsonMa ...

  10. D7升级时候发现许多System函数和网络函数只有Byte版本的,需要注意

    SetLength 对于字符串,是WideChar的长度GetMem 只针对ByteMove 只针对ByteFillChar 只针对ByteWriteFile(API) 只针对Byte SetSock ...