JAVA写CSV文件

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;
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值