使用注解实现 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文件:
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的更多相关文章
- 基于注解的bean配置
基于注解的bean配置,主要是进行applicationContext.xml配置.DAO层类注解.Service层类注解. 1.在applicationContext.xml文件中配置信息如下 &l ...
- [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- SpringMVC自动扫描@Controller注解的bean
若要对@Controller注解标注的bean进行自动扫描,必须将<context:component-scan base-package="包路径.controller"/ ...
- 开涛spring3(12.3) - 零配置 之 12.3 注解实现Bean定义
12.3 注解实现Bean定义 12.3.1 概述 前边介绍的Bean定义全是基于XML方式定义配置元数据,且在[12.2注解实现Bean依赖注入]一节中介绍了通过注解来减少配置数量,但并没有完全 ...
- 开涛spring3(12.2) - 零配置 之 12.2 注解实现Bean依赖注入
12.2 注解实现Bean依赖注入 12.2.1 概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的 ...
- (转)Spring注解完成Bean的定义
使用Spring注解完成Bean的定义 2010-04-21 16:48:54| 分类: spring|举报|字号 订阅 下载LOFTER客户端 通过@Autowired或@Reso ...
- Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等
实验1:配置通过静态工厂方法创建的bean [通过静态方法提供实例对象,工厂类本身不需要实例化!] 1.创建静态工厂类 public class StaticFactory { private st ...
- (转)java之Spring(IOC)注解装配Bean详解
java之Spring(IOC)注解装配Bean详解 在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...
- 通过注解配置Bean
之前说的三种配置方式,都是使用XML配置,现在我们说说使用注解配置Bean. 这部分内容主要分为两个部分:使用注解配置Bean,使用注解配置Bean属性. 在classpath中扫描组件 组件扫描:S ...
随机推荐
- 解 自己关于 C# Button的Click事件的疑惑
先说说C#中事件的用法,从事件的用法中,我自己会产生一个疑惑 C#事件 class Program { static void Main(string[] args) { EventClass ec ...
- httpClient中的三种超时设置小结
httpClient中的三种超时设置小结 本文章给大家介绍一下关于Java中httpClient中的三种超时设置小结,希望此教程能给各位朋友带来帮助. ConnectTimeoutExceptio ...
- 用angularjs开发下一代web应用(二):angularjs应用骨架(二)
1.浅谈非入侵式JavaScript <div ng-click="doSomething()">...</div>这些指令和原来的事件处理器有下面不同之处 ...
- 核心游记之 page_address_init
lock_kernel()仅仅虚晃一枪就过去了. 紧接着来的是page_address_init include/linux/mm.h #if defined(CONFIG_HIGHMEM) &a ...
- Effective C++ 第二版 8) 写operator new 和operator delete 9) 避免隐藏标准形式的new
条款8 写operator new 和operator delete 时要遵循常规 重写operator new时, 函数提供的行为要和系统缺省的operator new一致: 1)正确的返回值; 2 ...
- autotools入门笔记(一)
GNU autotools作用:收集系统配置信息并自动生成Makefile文件. GNU autotools主要包括三个工具:autoconf.automake.libtool,还有很多辅助的工具,包 ...
- iPhone App开发实战手册学习笔记(9)之设计IOS App的目标
1 前言 如果我们要做一个属于自己的App需要达到那些目标呢,今天就来介绍一下. 2 详述 2.1 关注用户及其需求 你的主要目标永远都是在设计方案之前先想好用户用例.有些开发人员喜欢编写用户故事来确 ...
- Java中取某一个范围的随机数
一.取模操作 public static void main(String[] args) { for (int i = 1; i <= 20; i++) { int j = i % 11; S ...
- [Usaco2008 Feb]Meteor Shower流星雨
去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽, 届时将会对它撞到的一切东西造成毁灭性的打击 ...
- 可能性dp+减少国家HDU4336
Card Collector Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Subm ...