CSV是以逗号间隔的文本文件,其文件以纯文本形式存储表格数据(数字和文本)。
在JAVA中可以通过输出文件流的方式将数据写入CSV文件。
首先定义一个对象类
public class Person {
private String name;
private int age;
private int sex;
private String phone;
private String address;
}
然后填充下数据
List<Person> dataList = new ArrayList<Person>();
Person person1 = new Person();
person1.setName("張三");
person1.setSex(1);
person1.setAge(55);
person1.setPhone("13911111111");
person1.setAddress("北京海淀区");
dataList.add(person1);
Person person2 = new Person();
person2.setName("小美");
person2.setSex(0);
person2.setAge(20);
person2.setPhone("13911112222");
person2.setAddress("北京西城区");
dataList.add(person2);
Person person3 = new Person();
person3.setName("小明");
person3.setSex(1);
person3.setAge(25);
person3.setPhone("13933333333");
person3.setAddress("北京海淀区");
dataList.add(person3);
调用写文件流方法
public void writeCSV(List<Person> dataList, String finalPath) {
FileOutputStream out = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
File finalCSVFile = new File(finalPath);
out = new FileOutputStream(finalCSVFile);
osw = new OutputStreamWriter(out, "UTF-8");
// 手动加上BOM标识
osw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }));
bw = new BufferedWriter(osw);
/**
* 往CSV中写新数据
*/
String title = "";
title = "姓名,性别,年龄,手机号码,住址";
bw.append(title).append("\r");
if (dataList != null && !dataList.isEmpty()) {
for (Person data : dataList) {
bw.append(data.getName() + ",");
if (data.getSex() == 1) {
bw.append("男,");
} else if (data.getSex() == 0) {
bw.append("女,");
} else {
bw.append(" ,");
}
bw.append(data.getAge() + ",");
bw.append(data.getPhone() + ",");
bw.append(data.getAddress());
bw.append("\r");
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bw != null) {
try {
bw.close();
bw = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if (osw != null) {
try {
osw.close();
osw = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
out = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println(finalPath + "数据导出成功");
}
注意:生成的csv文件用EXCEL打开时,总是产生乱码,但是用NOTEPAD++打开时,显示正常。这是因为导出的文件是UTF-8不含BOM格式编码的,为了要让EXCEL正确的显示,需要手动的给将要输出的内容加上BOM标识。
除了写文件流的方法外还可以通过开源类库opencsv来生成csv文件。需要引入jar包
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>3.10</version>
</dependency>
调用方法如下
public void writeCSV2(List<Person> dataList, String finalPath) {
try {
Writer writer = new FileWriter(finalPath);
writer.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }));
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer)
.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
.withSeparator(CSVWriter.DEFAULT_SEPARATOR)
.withEscapechar('\\').build();
beanToCsv.write(dataList);
writer.close();
} catch (IOException e) {
e.printStackTrace();
} catch (CsvDataTypeMismatchException e) {
e.printStackTrace();
} catch (CsvRequiredFieldEmptyException e) {
e.printStackTrace();
}
System.out.println(finalPath + "数据导出成功");
}
生成的文件中的表头是字段名,象name,age,sex等。如果想替换成别的内容可以使用注解@CsvBindByName
public class Person {
@CsvBindByName(column = "姓名")
private String name;
@CsvBindByName(column = "年龄")
private int age;
@CsvBindByName(column = "性别")
private int sex;
@CsvBindByName(column = "手机")
private String phone;
@CsvBindByName(column = "住址")
private String address;
}