import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CSVWritter {
private static final Logger logger = LoggerFactory.getLogger(CSVWritter.class);
/**
* CSV文件列分隔符
*/
private static final String CSV_COLUMN_SEPARATOR = ",";
/**
* CSV文件行分隔符
*/
private static final String CSV_ROW_SEPARATOR = "\r\n";
/**
* @param dataList 集合數據
* @param titles 表頭部數據
* @param keys 表內容的鍵值
* @param os 輸出流
*/
public static void doExport(List<List<Object>> dataList, OutputStream os) throws Exception {
StringBuffer buf = new StringBuffer();
// 組裝數據
if (null != dataList && !dataList.isEmpty()) {
for(List<Object> row : dataList){
int i = 1;
int size = row.size();
for (Object data : row) {
String dataStr;
if(null != data){
dataStr = data.toString().replaceAll("\"", "\"\"");
}else{
dataStr = "";
}
if(DateTimeUtils.isDateStr(dataStr)){
buf.append("\"\t").append(dataStr).append("\t\"");
}else{
buf.append("\"").append(dataStr).append("\"");
}
if (i < size) {
buf.append(CSV_COLUMN_SEPARATOR);
}
}
buf.append(CSV_ROW_SEPARATOR);
}
}
// 寫出響應
os.write(buf.toString().getBytes("GBK"));
os.flush();
}
/**
* 設置Header
*
* @param fileName
* @param response
* @throws UnsupportedEncodingException
*/
public static void responseSetProperties(String fileName, HttpServletResponse response) throws UnsupportedEncodingException {
// 讀取字符編碼
String utf = "UTF-8";
// 設置響應
response.setContentType("application/ms-txt.numberformat:@");
response.setCharacterEncoding(utf);
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "max-age=30");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, utf));
}
/**
* CSV文件生成方法
* @param head 文件頭
* @param dataList 數據列表
* @param outPutPath 文件輸出路徑
* @param filename 文件名
* @return
*/
public static File createCSVFile(String filePath, List<List<Object>> dataList) {
File csvFile = null;
BufferedWriter csvWtriter = null;
try {
csvFile = new File(filePath);
File parent = csvFile.getParentFile();
if (parent != null && !parent.exists()) {
parent.mkdirs();
}
csvFile.createNewFile();
// GB2312使正確讀取分隔符","
csvWtriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
csvFile), "GB2312"), 1024);
// 寫入文件內容
for (List<Object> row : dataList) {
writeRow(row, csvWtriter);
}
csvWtriter.flush();
} catch (Exception e) {
logger.error("createCSVFile Exception",e);
} finally {
try {
csvWtriter.close();
} catch (IOException e) {
logger.error("close csvWtriter Exception",e);
}
}
return csvFile;
}
/**
* 寫一行數據方法
* @param row
* @param csvWriter
* @throws IOException
*/
private static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException {
int i = 1;
int size = row.size();
// 寫入文件頭部
for (Object data : row) {
StringBuffer sb = new StringBuffer();
String dataStr;
if(null != data){
dataStr = data.toString().replaceAll("\"", "\"\"");
}else{
dataStr = "";
}
if(DateTimeUtils.isDateStr(dataStr)){
sb.append("\"\t").append(dataStr).append("\t\"");
}else{
sb.append("\"").append(dataStr).append("\"");
}
if (i < size) {
sb.append(CSV_COLUMN_SEPARATOR);
}
String rowStr = sb.toString();
csvWriter.write(rowStr);
i++;
}
csvWriter.newLine();
}
}