JAVA操作CSV

記錄一下java 操作csv的代碼。

1. 引入jar包
<dependency>
	<groupId>net.sourceforge.javacsv</groupId>
 	<artifactId>javacsv</artifactId>
 	<version>2.0</version>
</dependency>
2. 創建csv
package com.ysl;

import com.csvreader.CsvWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import javax.servlet.http.HttpServletResponse;

import com.ysl.CsvUtil;

/**
 * 創建csv
 * @author YSL
 */
public class CsvWriter {
    public static void main(String[] args) throws IOException {

        // 方式1. 直接創建本地的csv文件
        localFileCsv();

        // 方式2. 通過網頁返回csv
        webResponseCsv(res);

    }

    public static void localFileCsv() throws IOException {
        String filePath = "/home/yang/桌面/test-中文.csv";

        // 創建CSV寫對象
        CsvWriter csvWriter = new CsvWriter(filePath,',', Charset.forName("GBK"));
        // CsvWriter csvWriter = new CsvWriter(filePath); // 會中文亂碼

        // 表頭
        String[] headers = {"列1","列2","列3\n"};
        csvWriter.writeRecord(headers);
        csvWriter.writeRecord(new String[]{"value1", "value2", "value3" + "\n"});
        csvWriter.writeRecord(new String[]{"value1", "value2", "中文" + "\n"});
        csvWriter.writeRecord(new String[]{"value1", "value2", "中文"});
        csvWriter.writeRecord(new String[]{"value1", "value2", "中文" + "\n"});
        csvWriter.close();
    }

    public static void webResponseCsv(HttpServletResponse response) {
        // 導出csv 。CsvUtil見下文
        CsvUtil.writeCsv("文件名稱", response, new CsvUtil.WriteCsv() {
            @Override
            public void write(CsvWriter csvWriter) throws IOException {
                // csv表頭
                csvWriter.writeRecord(new String[]{"列1","列2","列3",});
                csvWriter.write("val1");
                csvWriter.write("val2");
                csvWriter.write("值3");
                csvWriter.endRecord();
            }
        });
    }
    
}
3. 讀取csv
import java.io.*;
import java.util.ArrayList;
import java.util.List;

import com.ysl.CsvUtil;

/**
 * 讀取csv
 */
public class CsvReader {
    public static void main(String[] args) throws IOException {
        // 這裏需要注意csv文件需要保存爲utf-8格式————可以用記事本打開,然後另存爲,選擇utf-8格式
        InputStream in = getResourcesFileInputStream("test-中文.csv");
        // 讀取csv
        List<String[]> records = CsvUtil.readCsv(in);
    }
    
    /**
     * 加載Resources目錄下的文件
     * @param fileName 文件名
     * @return
     */
    public static InputStream getResourcesFileInputStream(String fileName){
        // Resources目錄的絕對路徑
        // String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("" + fileName);
        return in;
    }

}
4. CsvUtil工具類
package com.ysl;

import com.csvreader.CsvWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.Charset;

/**
 * Csv工具類
 * @author:YSL
 */
public class CsvUtil {

    private static Logger logger = LoggerFactory.getLogger(CsvUtil.class);
    private static String DEFAULT_ENCODE = "UTF-8";
    private static String GBK_ENCODE = "GBK";

    /*
    * 自定義write csv 接口
    */
    public interface WriteCsv {
        void write(CsvWriter csvWriter) throws Exception;
    }

    /**
     * 導出csv
     * @param  fileName 文件名稱(不包括.csv後綴)
     * @param  response
     * @param  writeCsv 自定義接口,需實現write方法
     * @return 直接將csv返回給前端
     * @author YSL
     */
    public static void writeCsv(String fileName, HttpServletResponse response, CsvUtil.WriteCsv writeCsv){

        try {
            // 創建臨時文件
            File tempfile = File.createTempFile(fileName, ".csv");

            // 創建 CsvWriter 對象
            CsvWriter csvWriter = new CsvWriter(tempfile.getCanonicalPath(),',', Charset.forName(GBK_ENCODE));

            // 接口需要實現的方法
            writeCsv.write(csvWriter);

            // 關閉 CsvWriter 對象
            csvWriter.close();

            // 獲取寫入數據的臨時文件
            File fileLoad=new File(tempfile.getCanonicalPath());

            // 返回給前端
            CsvUtil.downLoadCsv(fileName+".csv", fileLoad, response);
        }catch (Exception e){
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }
    }

    /**
     * 導出csv文件
     * @param fileName 文件名稱,含後綴
     * @param fileLoad 要輸出的文件
     * @param response
     * @author YSL
     */
    public static void downLoadCsv(String fileName, File fileLoad, HttpServletResponse response) {

        try {
            byte[] b=new byte[1024 * 1024];
            OutputStream out=response.getOutputStream();
            response.reset();
            response.setContentType("application/csv");
            //re.setContentType("application/x-msdownload;");
            response.setHeader("content-disposition", "attachment; filename="+ URLEncoder.encode(fileName,DEFAULT_ENCODE));
            Long filelength=fileLoad.length();
            response.setHeader("Content_Length",String.valueOf(filelength));
            FileInputStream fileInputStream=new FileInputStream(fileLoad);
            int n;
            while ((n = fileInputStream.read(b)) != -1) {
                out.write(b, 0, n); //每次寫入out1024字節
            }
            // System.out.println(tempfile.getCanonicalPath());
            fileInputStream.close();
            out.flush();
            out.close();
            logger.info("export:"+fileName+" --- success");
        } catch (IOException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }
    }


    /**
     * 導出csv文件
     * @param fileName 文件名稱,含後綴
     * @param content 逗號隔開的值,換行符:\r\n
     * @param response
     * @author YSL
     */
    public static void downLoadCsv(String fileName, String content, HttpServletResponse response) {

        try {
            OutputStream out = response.getOutputStream();
            //response.reset();
            response.setContentType("application/csv");
            response.setHeader("content-disposition", "attachment; filename="+StringUtil.encode(fileName,Constants.DEFAULT_GLOBAL_ENCODE));
            response.setHeader("Content_Length",String.valueOf(content.length()));
            out.write(content.getBytes(GBK_ENCODE));
            out.close();
            logger.info("export"+fileName+"success");
        } catch (IOException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }
    }

	/**
     * 讀csv
     * @param in
     * @return
     * @author YSL
     * @throws IOException
     */
    public static List<String[]> readCsv(InputStream in) throws IOException {

        List<String[]> records = new ArrayList<String[]>();
        String record;
        // 設定UTF-8字符集,使用帶緩衝區的字符輸入流BufferedReader讀取文件內容
        BufferedReader file = new BufferedReader(new InputStreamReader(in, "UTF-8"));
        // file.readLine(); //跳過表頭所在的行

        // 遍歷數據行並存儲在名爲records的ArrayList中,每一行records中存儲的對象爲一個String數組
        while ((record = file.readLine()) != null) {
            String fields[] = record.split(",");
            records.add(fields);
        }
        // 關閉文件
        file.close();
        in.close();

        return records;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章