基于 java 注解生成加簽驗簽 csv。
成都一家集口碑和實力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團隊和靠譜的建站技術(shù),10年企業(yè)及個人網(wǎng)站建設(shè)經(jīng)驗 ,為成都上千客戶提供網(wǎng)頁設(shè)計制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營銷型網(wǎng)站建設(shè),品牌網(wǎng)站制作,同時也為不同行業(yè)的客戶提供網(wǎng)站建設(shè)、做網(wǎng)站的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選創(chuàng)新互聯(lián)建站。
開源地址: " rel="nofollow">github csv
以前覺得 csv 文件的多寫非常簡單,就懶得封裝。
最近一個月寫了兩次 csv 文件相關(guān)的東西,發(fā)現(xiàn)要處理的細節(jié)還是有的,還浪費比較多的時間。
比如:
UTF-8 中文編碼使用 excel 打開亂碼,因為缺少 BOM 頭。
不同類型字段轉(zhuǎn)化為字符串,順序的指定,head 頭的指定,如果手寫都會很繁瑣。
,
后無元素,split 會缺失等。為了解決上述問題,此框架應運而生。
Fluent 流式寫法
基于 java 注解
jdk7+
maven 3.x
com.github.houbb
csv
0.0.2
演示基本類型的轉(zhuǎn)換
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()
}
/**
* 構(gòu)建通用測試列表
* @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) | 必填 |
創(chuàng)建實例,并且指定待寫入文件路徑。 |
writeBom(boolean writeBom) | true |
是否寫入 UTF8 BOM 頭,建議第一次寫入指定,避免中文亂碼 |
charset(String charset) | UTF-8 |
指定文件編碼 |
sort(ISort sort) | NoSort | 默認不進行字段排序 |
write(List |
無 |
待寫入的文件列表 |
方法 | 默認值 | 說明 |
---|---|---|
newInstance(final String path) | 必填 |
創(chuàng)建實例,并且指定待讀取文件路徑。 |
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;
/**
* 讀取轉(zhuǎn)換
* @return 處理實現(xiàn)類
*/
Class extends IReadConverter> readConverter() default CommonReadConverter.class;
/**
* 寫入轉(zhuǎn)換
* @return 處理實現(xiàn)類
*/
Class extends IWriteConverter> writeConverter() default StringWriteConverter.class;
屬性 | 默認值 | 說明 |
---|---|---|
label | 字段名稱 | 用于 csv 頭生成 |
readRequire | true | 是否需要從 csv 文件讀取 |
writeRequire | true | 當前字段是否需要寫入 csv 文件 |
readConverter | CommonReadConverter | 將 csv 中的字符串轉(zhuǎn)化為當前字段類型,支持 8 大基本類型+String |
writeConverter | StringWriteConverter | 直接調(diào)用當前字段值 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 的轉(zhuǎn)換實現(xiàn)。
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());
}
其中列表構(gòu)建:
/**
* 構(gòu)建基于注解的測試列表
* @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}]