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特殊符號,右邊是轉義 < <> >& &
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"