1.csv文件了解
CSV文件默认以英文逗号做为列分隔符,换行符作为行分隔符。
如果不提供网页形式只用命令行或二进制程序输出数据到CSV,只需要将数据段按,分割,行按\n分割,写入到一个.csv文件即可。
但有时字段里含有,和换行符就麻烦了,数据输出会出现混乱。这时可以使用双引号"来将每个字段内容括起来,CSV默认认为由""括起来的内容是一个栏位, 这时不管栏位内容里有除"之外字符的任何字符都可以按原来形式引用。
例如
"姓; 名:k,j",email,是一行的内容,
"姓;名:k,j" 是一个单元格里的。
用""括起来的栏位内容里有CSV默认的换行符也没关系。这样输出数据就很方便了。注意"是要加转义字符。java里面的转义是\"。
唯一需要注意的 就是若字段内容里含有"怎么办。这时只需将"替换成两个双引号("")即可。CSV会将字段里的两个双引号""显示成一个。
2.生成csv代码实例
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import com.*.util.DateUtil;
import com.*.common.util.StringUtil;
import com.*.party.PartyStaff;
public class CsvUtil {
public static void main(String[] args) {
// csv表头
List<String> headList = Arrays.asList("StaffName", "Gender", "Phone", "CreateDate");
// csv内容
PartyStaff xiaoMing = new PartyStaff();
xiaoMing.setCreate_date(new Date());
xiaoMing.setGender("M");
xiaoMing.setPhone("\t13620965172");// 注意:\t是一个不可见制表符,否则csv超过11位会用科学计数法表示
xiaoMing.setStaff_name("小明");
PartyStaff xiaoHong = new PartyStaff();
xiaoHong.setCreate_date(new Date());
xiaoHong.setGender("F");
xiaoHong.setPhone("\t15986206858");
xiaoHong.setStaff_name("小红");
List<PartyStaff> staffList = new ArrayList<PartyStaff>();
staffList.add(xiaoMing);
staffList.add(xiaoHong);
ByteArrayOutputStream csvOutputStream = null;
InputStream byteArrayInputStream = null;
BufferedWriter csvWtriter = null;
String csvFileName = "g:/testCsv.csv";
try {
csvOutputStream = new ByteArrayOutputStream();
csvWtriter = new BufferedWriter(new OutputStreamWriter(csvOutputStream, "GBK"));
// 写csv文件头
writeRow(headList, csvWtriter);
// for循环一行一行地写数据
List<String> dataList = new ArrayList<String>();
for (PartyStaff partyStaff : staffList) {
dataList.add(partyStaff.getStaff_name());
dataList.add(partyStaff.getGender());
dataList.add(partyStaff.getPhone());
dataList.add("\t" + DateUtil.formatDate(partyStaff.getCreate_date(), DateUtil.DEFAULT_PATTERN));// 制表符是为了csv日期正确显示
writeRow(dataList, csvWtriter);
dataList.clear();
}
// 清空缓冲区数据
csvWtriter.flush();
byteArrayInputStream = new ByteArrayInputStream(csvOutputStream.toByteArray());
fileInputStreamToFileOutStream(byteArrayInputStream, csvFileName);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
}
}
/**
* 写一行数据
*
* @param row
* 数据列表
* @param csvWriter
* @throws IOException
*/
private static void writeRow(List<String> rowData, BufferedWriter csvWriter) throws IOException {
String splitRowData = StringUtil.join(rowData, ",");
csvWriter.write(splitRowData);
csvWriter.newLine();
}
/**
* 把输入流转换成文件写到本地磁盘
*
* @param inputStream
* @param outPutFileName
*/
public static void fileInputStreamToFileOutStream(InputStream inputStream, String outPutFileName) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(outPutFileName);
byte[] b = new byte[1024];
while ((inputStream.read(b)) != -1) {
fileOutputStream.write(b);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeResource(inputStream, fileOutputStream);
}
}
/**
* 资源的关闭
*
* @param inputStream
* @param fileOutputStream
*/
private static void closeResource(InputStream inputStream, FileOutputStream fileOutputStream) {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}