2011-05-10 19 views
8

我試圖導出一些數據(存儲在數據表中)。其中一些值在其中有一個換行符。現在,每次我嘗試導入excel(2010)中的文件時,linbreaks都會被識別爲新行,而不是實際的換行符。生成的csv文件中的換行符讓我瘋狂

我已經搜索了幾個小時,看到了很多解決方案,但我似乎無法得到它修復。

方式i個輸出我的CSV文件: (可變csvfile是一個StringBuilder)

context.Response.Clear(); 
context.Response.ContentType = "text/csv"; 
context.Response.ContentEncoding = System.Text.Encoding.UTF8; 
context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + name + ".csv"); 
context.Response.Write(csvfile.ToString()); 
context.Response.End(); 

當我用Excel手動打開它,它顯示優良。但是,因爲Excel 2003不支持文件格式,我必須導入它。通過導入,它將換行符(字段中的\ n)視爲新行。

不幸的是,我不能給你我一起工作的真實數據的例子(它的所有個人數據),但是我可以告訴你它是如何出錯的例子:

Header1,Header2,Header3 
"value1","value2","value 3 
and this is where its going wrong" 

這是一個簡單的csv文件,當你導入它時,你會看到它出錯的地方。我默認使用雙引號標記封裝字段。我也從默認值中刪除了前導空格。

我在這個看似簡單的問題上花了至少2天時間,但對於我的生活,我無法弄清楚我該如何修復它。我在同一個問題上看到了多個主題,但沒有提供的解決方案似乎解決了這個問題。

+0

你必須保持斷行嗎? – 2011-05-10 14:59:54

+1

是的,恐怕換線對數據非常重要。 – 2011-05-10 15:01:00

+1

看到這個問題:http://stackoverflow.com/questions/1241220/generating-csv-file-for-excel-how-to-have-a-newline-inside-a-value – 2011-05-10 15:17:56

回答

3

這個工作對我來說:

a)設置Response.ContentEncoding = System.Text.Encoding.UTF8不足以使Excel正確打開UTF-8文件。相反,你必須手動編寫一個字節順序標記(BOM)報頭的Excel文件:

if (UseExcel2003Compatibility) 
    { 
     // write UTF-16 BOM, even though we export as utf-8. Wrong but *I think* the only thing Excel 2003 understands 
     response.Write('\uFEFF'); 
    } 
    else 
    { 
     // use the correct UTF-8 bom. Works in Excel 2008 and should be compatible to all other editors 
     // capable of reading UTF-8 files 
     byte[] bom = new byte[3]; 
     bom[0] = 0xEF; 
     bom[1] = 0xBB; 
     bom[2] = 0xBF; 
     response.BinaryWrite(bom); 
    } 

b)將作爲八位字節流,請使用一個文件名。CSV擴展並做引用文件名作爲由HTTP規範要求:

response.ContentType = "application/octet-stream"; 
response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 

C)使用雙引號

我只是檢查各領域,對我的Excel能夠正常打開下載的文件是這樣,包括場換行符。

但是請注意,在所有默認分隔符不同於「,」的系統上,Excel仍然無法正確打開此類CSV。例如。如果用戶在設置爲德語區域設置的Windows系統上運行Excel,Excel將無法正確打開文件,因爲它需要用分號而不是逗號作爲分隔符。我不認爲有什麼可以做的。

+5

其實有,但它是一個非常模糊的功能。您可以將其寫爲csv中的第一行: sep =, 無論區域設置如何,它都會使Excel使用相同的分隔符。 – 2013-04-19 19:01:36

+0

不錯,我不知道這個。謝謝。 – 2013-04-23 13:27:29

1

因爲換行符表示新記錄,所以我不認爲CSV字段中有換行符。在將字段值添加到字符串之前,您可以替換字段值中的所有換行符嗎?或者,也許你可以建立一個Excel文件,他們應該允許在一個字段換行。

+5

CSV文件被允許有行打破田野。 – 2011-05-10 15:09:10

1

只要該字段正確雙引號,就可以在CSV文件中有換行符。這裏的問題似乎是讓Excel正確導入記錄。

這已經在網站上以前問,有幾個可能的解決方案:

  • 設置對輸出文件ASCII或UTF-8編碼。由於您在問題中將其設置爲UTF-8,請嘗試使用ASCII碼。 (link

  • 更改文件名.csv,這可能會誘使EXCEL導入正確導入文件(link

+0

恐怕我已經嘗試過ASCII,但沒有結果。我知道這個問題之前已經被問過,甚至多次。我已閱讀並嘗試過每種解決方案,但出於某種原因,它只是不想正確導入。 – 2011-05-10 15:15:57

0

包含BOM的UTF文件將導致Excel直接處理新行,即使該字段被引號包圍。 (經過測試的Excel 2008 Mac)

解決方法是使任何新行回車(CHR 13)而不是換行。

0

我有同樣的問題。我到達的解決方案,同時在部分瀏覽this blog - 「導出到Excel以正確的格式:」

我修改了代碼如下:

string brstyle = @"<style>br { mso-data-placement:same-cell; }</style>"; 

Response.Write(brstyle); 

Response.Write(stringWriter.ToString()); 

它爲我工作。現在,帶換行符的文本出現在單個單元格中,而不是每個換行符的新單元格(行)中。