生成、導出CSV文件

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();
    }

}

 

發佈了22 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章