1. 程式人生 > >Java 檔案下載 csv檔案匯出特殊字元轉義

Java 檔案下載 csv檔案匯出特殊字元轉義

需求描述

將從資料庫查出的資料以生成csv檔案的方式下載下來(匯出)。

實現方案

最開始的方法是:

將從資料庫中查出的資料拼成符合csv檔案格式的字串,然後將字串轉為輸入流,最後返回InputStreamResource,達到下載的目的。下邊是實現的程式碼:

    @GetMapping("/test/csv")
    public ResponseEntity<InputStreamResource> createCSV(@RequestParam(required = false) String key1, @RequestParam(required = false
) String key2) throws IOException{ String fileName = UuidUtils.base58Uuid()+".csv"; //檔名是生成的base58的uuid,這個方法是本人自己寫的 HttpHeaders headers = new HttpHeaders(); headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); headers.add("Content-Disposition","attachment; fileName="
+fileName); headers.add("Pragma", "no-cache"); headers.add("Expires", "0"); //查詢員工列表 List<User> users = findUsers(key1,key2); //資料準備 StringBuilder str = new StringBuilder(); str.append("員工id,姓名,手機號\r\n"); for(User e : users){ str.append(e.getId()+","
+e.getName()+","+e.getMobilePhone()+"\r\n"); } //生成輸入流 InputStream in = new ByteArrayInputStream(str.toString().getBytes("gbk")); return ResponseEntity .ok() .headers(headers) .contentType(MediaType.parseMediaType("application/x-msdownload")) .body(new InputStreamResource(in)); }

上邊程式碼的問題在於:先將資料庫中查出的資料放入記憶體中,最後轉成輸入流,但是當資料庫中資料龐大的時候,會給記憶體造成很大的負擔,甚至溢位,說俗點就是你的記憶體炸了 哦呵呵呵。

思考解決方法: 能不能分頁查詢,每查出一部分都放入流中,然後清除記憶體中的資料,然後再進行查詢,再放入流中,再清除記憶體中的資料,如此迴圈直到查完為止。

解決方案:


    @GetMapping("/test/csv")
    public void createCSV(HttpServletResponse response, @RequestParam(required = false) String key1, @RequestParam(required = false) String key2)  throws IOException {
        //生成檔名
        String fileName = UuidUtils.base58Uuid()+".csv";

        //設定返回資料名字、型別和編碼格式
        response.addHeader("Content-Disposition","attachment; fileName="+fileName);
        response.setContentType("application/octet-stream");

        //編碼格式設為gbk,因為window底層編碼格式是gbk,如果這裡不設為gbk的話 office開啟會亂碼,wps不會。
        //另外 如果根本就不設定編碼的話會亂碼的,所以一定要設定,至於設定成gbk還是utf-8視情況而定吧。個人推薦是gbk
        response.setCharacterEncoding("gbk"); 

        PrintWriter writer = response.getWriter();

        int page = 0; //查詢第幾頁數
        int size = 500; //每頁資料條數
        Pageable pageable = new PageRequest(page,size);
        Page<User> userPage = findUsers(key1,key2,pageable);

        StringBuilder str = new StringBuilder();
        str.append("員工id,姓名,手機號\r\n");

        boolean flag = false;
        for(;true;){
            List<User> users = userPage.getContent();
            for(User e : users){
                str.append(csvString(e.getId()));
                str.append(",");
                str.append(csvString(e.getName()));
                str.append(",");
                str.append(csvString(e.getMobilePhone()));
                str.append("\r\n");
            }


            //  這裡是重點!!! 
            //  先把拼好的字串write出去,然後flush下 :Response物件之Flush方法,立即傳送緩衝區中的輸出
            //  如果未將 Response.Buffer 設定為 TRUE,則該方法將導致執行時錯誤。
            //  語法:Response.Flush;註釋:如果在 ASP 頁上呼叫 Flush 方法,則伺服器將響應該頁上保持活動的請求。應用於Response物件。
            writer.write(str.toString());
            writer.flush();

            //清空str中的資料
            str.delete(0,str.length());

            //判斷是否是最後一頁
            flag = userPage.isLast();
            if(flag){
                break;
            }

            //不是最後一頁 繼續查資料
            page++;
            pageable = new PageRequest(page,size);
            userPage = findUsers(key1,key2,pageable);
        }

        writer.close();
    }



    /**
     * 生成csv檔案之前特殊字元轉義
     * @param str
     * @return
     */
    public String csvString(String str){

        if(str.contains(",")){
            str = str.replace("\"","\"\"");
            str ="\"" + str + "\"";
        }

        return str;
    }

說明:第二個方法中Pageable是spring boot封裝的一個實體類,在jpa中查詢資料的時候傳入pageable會自動進行分頁查詢,具體使用方法百度

最後推薦一個 Java檔案下載方法總結 的比較全的文章 點選檢視

相關推薦

Java 檔案下載 csv檔案匯出特殊字元轉義

需求描述 將從資料庫查出的資料以生成csv檔案的方式下載下來(匯出)。 實現方案 最開始的方法是: 將從資料庫中查出的資料拼成符合csv檔案格式的字串,然後將字串轉為輸入流,最後返回InputStreamResource,達到下載的目的。下邊是實現的

java 批量更改CSV檔案內容中指定位置的字元

有104個一樣格式的檔案只是記錄數不同 改為這個模式 把最後的2改為4 也就是2表示兩條記錄,4表示總的記錄(包括第一行和最後一行) @Test public void test4() throws Exception{

Java程式設計之CSV檔案匯入與匯出的實現

年前在開發功能模組的時候用到了CSV檔案匯入匯出,就此整理一下,便於大家參考。 匯入匯出功能很多時候用到的都是Excel檔案,但是現在越來越多的使用了CSV檔案進行此操作,它是一個純文字檔案,可以用記事本開啟,也可以用Excel開啟。CSV檔案不像Excel那樣有很多條條框

Servlet實現匯出下載csv檔案

工作上遇到的場景,需要將客戶列表資料匯出成csv檔案。測試了一個最簡單版本,記錄一下。 訂單實體類: package entity; /** * 訂單資訊實體 * Created by dylan-pc on 2017/8/17. */ public class

(android檔案下載下載連結中包含特殊字元--空格,中文等,導致無法識別處理方案

今天在app測試時出現標題所示錯誤,導致無法正常重server端下載檔案; 通過檢視日誌,瞭解到是由於下載連結中出現空格、中文等特殊字元,導致連線地址不合法; 在網上也查看了很多描述相關問題解決方案的帖子,很有啟發-- 但是考慮到方便自己和大家,還是把問題和解決方案貼出來

java程式碼實現CSV檔案讀取、將資料拆分成多個CSV檔案及資料匯出CSV檔案

package com.cn; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; impor

xml檔案特殊字元轉義

在使用mybatis/ibatis寫sql時總是忘記特殊轉義表示,在此記錄 左邊為xml特殊符號,右邊是轉義 <     &lt;>     &gt;&   &

Django中生成和下載csv檔案

有時候我們做的網站,需要將一些資料,生成有一個CSV檔案給瀏覽器,並且是作為附件的形式下載下來。 生成小的CSV檔案: def index(request): response = HttpResponse(content_type='text/csv') # att

Java讀取CSV檔案CSV檔案資料內容包含逗號處理)

文章目錄 0. 前言 1. 解決方案 2. 程式碼片段 0. 前言 最近在公司寫專案時,有個匯入csv格式檔案資料的需求。Java讀取csv檔案時預設是按照 ,[英文逗號]分割的

Java 下載工具類(多檔案打包下載, 單檔案下載, 單檔案預覽)

1. 準備標準檔案類DocumentOModel @Data @ApiModel("文件資訊(轉換後)") public class DocumentOModel { @ApiModelProperty( value = "文件ID",

java 實現下載htttp檔案的簡便辦法 FileUtils IOUtils

其實很多時候,我們並不需要去重複造輪子,只需要借 就可以。但是前提就得你得知道誰家有輪子可借才行。這次就用到了 org.apache.common.io 家的輪子了。 具體實現: public String downloadHttpUrl(String url, Str

java筆記)java讀寫CSV檔案的方法

CSV檔案 逗號分隔值(Comma-Separated Values,CSV,有時也稱為字元分隔值,因為分隔字元也可以不是逗號),其檔案以純文字形式儲存表格資料(數字和文字)。純文字意味著該檔案是一個字元序列,不含必須像二進位制數字那樣被解讀的資料。CSV檔案由任意數目的記錄組成,記

java 解析csv檔案例子,csv檔案 中文亂碼問題

java 解析csv檔案例子,採用了第三方包,csv檔案 中文亂碼問題 解析方法: public List resolveCsv(String csvFileName) {  CSVReader reader = null;  String[] nextLine = null

java讀取寫入csv檔案Demo

讀取Demo: public static void main(String[] args) { File csv = new File("C:\\Result.csv"); // CSV

java讀寫CSV檔案的兩種方法

BufferedWriter writer =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "GBK")) ;// 附加 上述程式碼片段作用: 轉碼 逗號分隔值(Com

Java裡面讀取csv檔案中文亂碼

csv檔案預設編碼為ANSI,這裡出現亂碼主要是編碼不一致問題DataInputStream in = new DataInputStream(new FileInputStream(new File("d:\\*.csv")));BufferedReader br= ne

php點選生成並下載csv檔案

header("Content-Type: text/csv"); header("Content-Disposition: attachment; filename=test.csv"); header('Cache-Control:mus

js實現使用檔案下載csv檔案

1. 理解Blob物件 在Blob物件出現之前,在javascript中一直沒有比較好的方式處理二進位制檔案,自從有了Blob了,我們就可以使用它操作二進位制資料了。現在我們開始來理解下Bolb物件及它的檔案流下載應用場景。 1. 建立Blob物件方式如下: var blob = new Blob(

檔案下載 Flask 檔案和流

有本地檔案  放到nginx跟目錄下,通過訪問nginx下載:略 flask返回檔案 @api.route('/file/down') def excel_down(): directory = r'D:/' filename = 'www.rar' fi

html+Java 結合的CSV匯入匯出

在自己專案中有涉及到CSV匯入匯出的功能,自己通過查詢資料和修改,總結了一份使用模板,僅作為參考。 匯入 <div> <input name="file" id="file" type="file" accept=".csv" onchange="changeFile"