重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
基于 java 注解生成加签验签 csv。
成都一家集口碑和实力的网站建设服务商,拥有专业的企业建站团队和靠谱的建站技术,10年企业及个人网站建设经验 ,为成都上千客户提供网页设计制作,网站开发,企业网站制作建设等服务,包括成都营销型网站建设,品牌网站制作,同时也为不同行业的客户提供网站建设、做网站的服务,包括成都电商型网站制作建设,装修行业网站制作建设,传统机械行业网站建设,传统农业行业网站制作建设。在成都做网站,选网站制作建设服务商就选创新互联建站。
开源地址: " rel="nofollow">github csv
以前觉得 csv 文件的多写非常简单,就懒得封装。
最近一个月写了两次 csv 文件相关的东西,发现要处理的细节还是有的,还浪费比较多的时间。
比如:
UTF-8 中文编码使用 excel 打开乱码,因为缺少 BOM 头。
不同类型字段转化为字符串,顺序的指定,head 头的指定,如果手写都会很繁琐。
,
后无元素,split 会缺失等。为了解决上述问题,此框架应运而生。
Fluent 流式写法
基于 java 注解
jdk7+
maven 3.x
com.github.houbb
csv
0.0.2
演示基本类型的转换
public class User {
private String name;
private int age;
private float score;
private double money;
private boolean sex;
private short level;
private long id;
private char status;
private byte coin;
//Getter & Setter & toString()
}
/**
* 构建通用测试列表
* @return 列表
*/
private List buildCommonList() {
User user = new User();
short s = 4;
byte b = 1;
user.age(10)
.name("你好")
.id(1L)
.score(60)
.coin(b)
.level(s)
.money(200)
.sex(true)
.status('Y');
return Arrays.asList(user);
}
public void commonTest() {
final String path = "src\\test\\resources\\common.csv";
CsvWriteBs.newInstance(path)
.write(buildCommonList());
}
name,age,score,money,sex,level,id,status,coin
你好,10,60.0,200.0,true,4,1,Y,1
public void commonTest() {
final String path = "src\\test\\resources\\common.csv";
List userList = CsvReadBs.newInstance(path)
.read(User.class);
System.out.println(userList);
}
[User{name='你好', age=10, score=60.0, money=200.0, sex=true, level=4, id=1, status=Y, coin=1}]
为了用户使用的便利性,和后期拓展的灵活性。
CSV 有两个引导类:
名称 | 作用 |
---|---|
CsvWriteBs | csv 文件写入引导类 |
CsvReadBs | csv 文件读取引导类 |
方法 | 默认值 | 说明 |
---|---|---|
newInstance(final String path) | 必填 |
创建实例,并且指定待写入文件路径。 |
writeBom(boolean writeBom) | true |
是否写入 UTF8 BOM 头,建议第一次写入指定,避免中文乱码 |
charset(String charset) | UTF-8 |
指定文件编码 |
sort(ISort sort) | NoSort | 默认不进行字段排序 |
write(List |
无 |
待写入的文件列表 |
方法 | 默认值 | 说明 |
---|---|---|
newInstance(final String path) | 必填 |
创建实例,并且指定待读取文件路径。 |
charset(String charset) | UTF-8 |
指定文件编码 |
sort(ISort sort) | NoSort | 默认不进行字段排序 |
startIndex(int startIndex) | 1 | 文件的第二行,默认第一行是 head |
endIndex(int endIndex) | 文件的最后一行 |
用于待处理对象的字段上。
/**
* 字段显示名称
* 1. 默认使用 field.name
* @return 显示名称
*/
String label() default "";
/**
* 读取是否需要
* @return 是
*/
boolean readRequire() default true;
/**
* 写入是否需要
* @return 是
*/
boolean writeRequire() default true;
/**
* 读取转换
* @return 处理实现类
*/
Class extends IReadConverter> readConverter() default CommonReadConverter.class;
/**
* 写入转换
* @return 处理实现类
*/
Class extends IWriteConverter> writeConverter() default StringWriteConverter.class;
属性 | 默认值 | 说明 |
---|---|---|
label | 字段名称 | 用于 csv 头生成 |
readRequire | true | 是否需要从 csv 文件读取 |
writeRequire | true | 当前字段是否需要写入 csv 文件 |
readConverter | CommonReadConverter | 将 csv 中的字符串转化为当前字段类型,支持 8 大基本类型+String |
writeConverter | StringWriteConverter | 直接调用当前字段值 toString() 方法,null 直接为空字符串 |
其中 readConverter/writeConverter 支持用户自定义
public class UserAnnotation {
@Csv(label = "名称")
private String name;
@Csv(label = "密码", readRequire = false, writeRequire = false)
private String password;
@Csv(label = "生日", readConverter = ReadDateConvert.class, writeConverter = WriteDateConvert.class)
private Date birthday;
//Getter & Setter & toString()
}
使我们自定义的针对 Date 的转换实现。
public class WriteDateConvert implements IWriteConverter {
@Override
public String convert(Date value) {
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
return dateFormat.format(value);
}
}
public class ReadDateConvert implements IReadConverter {
@Override
public Date convert(String value, Class fieldType) {
try {
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
return dateFormat.parse(value);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
public void annotationTest() {
final String path = "src\\test\\resources\\annotation.csv";
CsvWriteBs.newInstance(path)
.write(buildAnnotationList());
}
其中列表构建:
/**
* 构建基于注解的测试列表
* @return 列表
*/
private List buildAnnotationList() {
UserAnnotation user = new UserAnnotation();
user.name("你好")
.password("123")
.birthday(new Date());
return Arrays.asList(user);
}
名称,生日
你好,20190603
public void annotationTest() {
final String path = "src\\test\\resources\\annotation.csv";
List userList = CsvReadBs.newInstance(path)
.read(UserAnnotation.class);
System.out.println(userList);
}
[UserAnnotation{name='你好', password='null', birthday=Mon Jun 03 00:00:00 CST 2019}]