1、下面是处理双引号、逗号、回车和中文字符的通用方法,以后有时间再整理高率的方法
/**
* 功能说明:获取UTF-8编码文本文件开头的BOM签名。
* BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记。例:接收者收到以EF BB BF开头的字节流,就知道是UTF-8编码。
* @return UTF-8编码文本文件开头的BOM签名
*/
public static String getBOM() {
byte b[] = {
(byte)0xEF, (byte)0xBB, (byte)0xBF};
return new String(b);
}
/**
* 要处理 逗号,双引号、回车
* 还有中文情况
* ***/
public static String commaDealText(String csvText) {
if(csvText == null)
return null;
//如果有双引号,则要先处理双引号
if(csvText.contains("\"")) {
csvText = csvText.replaceAll("\"", "\"\"");
}
//如果有逗号 和 回车
if(csvText.contains(",") || csvText.contains("\n")) {
csvText = "\"" + csvText + "\"";
}
return csvText;
}
/**
* 生成并下载csv文件
* @param response
* @param exportData
* @param map
* @param outPutPath
* @param fileName
* @throws IOException
*/
@SuppressWarnings("rawtypes")
public static MyResult exportDataFile(List<String> headerList, List<String> exportData, String outPutPath, String fileName) throws IOException{
MyResult res = new MyResult(true);
File csvFile = null;
BufferedWriter csvFileOutputStream = null;
try {
File file = new File(outPutPath);
if (!file.exists()) {
file.mkdirs();
}
//定义文件名格式并创建
csvFile =new File(outPutPath+fileName+".csv");
if(csvFile.exists()){
csvFile.delete();
}
csvFile.createNewFile();
// UTF-8使正确读取分隔符","
//如果生产文件乱码,windows下用gbk,linux用UTF-8
csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "UTF-8"), 1024);
//写入前段字节流,防止乱码
csvFileOutputStream.write(getBOM());
/**** 写入文件头部内容 ***/
if(headerList == null || headerList.isEmpty()) {
res.setFlag(false);
res.setMsg("headerList can not be null or empty");
return res;
}
StringBuffer sb = new StringBuffer();
sb.setLength(0);
for(String headName : headerList) {
headName = CSVUtils.commaDealText(headName);
sb.append(headName).append(",");
}
csvFileOutputStream.write(sb.toString());
//换行
csvFileOutputStream.newLine();
for(String data : exportData) {
csvFileOutputStream.write(data);
csvFileOutputStream.newLine();
}
csvFileOutputStream.flush();
} catch (Exception e) {
//logger.error(e.getMessage(), e);
} finally {
try {
csvFileOutputStream.close();
} catch (IOException e) {
//logger.error(e.getMessage(), e);
}
}
return res;
}