[研究][ASP.NET][WebForm] 匯出寫入 .csv
2021-02-09
逗號分隔值 - 維基百科,自由的百科全書https://zh.wikipedia.org/wiki/%E9%80%97%E5%8F%B7%E5%88%86%E9%9A%94%E5%80%BC
逗號分隔值(Comma-Separated Values,CSV,有時也稱為字元分隔值,因為分隔字元也可以不是逗號)
環境:Visual Studio 2019 + ASP.NET + WebForm + C#
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ExportCsvTest.Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TestDBConnectionString %>" SelectCommand="SELECT * FROM [Table1]"></asp:SqlDataSource> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="id" DataSourceID="SqlDataSource1"> <Columns> <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True" SortExpression="id" /> <asp:BoundField DataField="FieldText" HeaderText="FieldText" SortExpression="FieldText" /> <asp:BoundField DataField="FieldDateTime" HeaderText="FieldDateTime" SortExpression="FieldDateTime" /> <asp:BoundField DataField="FieldInt" HeaderText="FieldInt" SortExpression="FieldInt" /> <asp:CheckBoxField DataField="FieldBit" HeaderText="FieldBit" SortExpression="FieldBit" /> </Columns> </asp:GridView> <asp:Button ID="Button_Export_Csv" runat="server" OnClick="Button_Export_Csv_Click" Text="匯出(.csv)" /><br /> <asp:Label ID="Label_MSG1" runat="server"></asp:Label> </div> </form> </body> </html> |
using System; using System.Collections.Generic; using System.Configuration; using System.Data.SqlClient; using System.IO; using System.Linq; using System.Text; using System.Web; using System.Web.Configuration; using System.Web.UI; using System.Web.UI.WebControls; namespace ExportCsvTest { public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button_Export_Csv_Click(object sender, EventArgs e) { string mainFileName = "匯出檔案名稱"; string fd = (string)ConfigurationManager.AppSettings["TempFolder"] + @"\"; if (!System.IO.Directory.Exists(fd)) { System.IO.Directory.CreateDirectory(fd); } string dateTimeString = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-fff"); // 若檔案名稱有中文字或特殊符號,Response.AddHeader() 輸出檔案名稱要編碼 string outFileName = HttpUtility.UrlEncode(mainFileName, System.Text.Encoding.UTF8) + "-" + dateTimeString + ".csv"; // XLWorkbook.SaveAs() 輸出檔案名稱不要用 HttpUtility.UrlEncode 編碼 // Response.TransmitFile() 輸出檔案名稱不要用 HttpUtility.UrlEncode 編碼 string dirFileName = fd + mainFileName + "-" + dateTimeString + ".csv"; try { Response.Clear(); Response.Buffer = true; Response.Charset = ""; #region Export CSV // [EXCEL] Excel打開是亂碼?快速找回資料的最好方法! // http://blog.e-happy.com.tw/excel-excel%E6%89%93%E9%96%8B%E6%98%AF%E4%BA%82%E7%A2%BC%EF%BC%9F%E5%BF%AB%E9%80%9F%E6%89%BE%E5%9B%9E%E8%B3%87%E6%96%99%E7%9A%84%E6%9C%80%E5%A5%BD%E6%96%B9%E6%B3%95%EF%BC%81/ // Excel開啟CSV時的中文編碼問題補遺 //https://blog.darkthread.net/blog/csv-encoding-again/ Response.ContentType = "application/octet-stream"; Response.ContentEncoding = Encoding.UTF8; //Response.ContentType = "application/vnd.ms-csv"; Response.AddHeader("content-disposition", "attachment;filename=" + outFileName); using (MemoryStream MyMemoryStream = new MemoryStream()) { //StreamWriter csvFileStreamWriter = new StreamWriter(MyMemoryStream); StreamWriter csvFileStreamWriter = new StreamWriter(MyMemoryStream, Encoding.UTF8); //string csvContent = ""; StringBuilder csvContent = new StringBuilder(); string dataText = ""; // 讀取資料,資料寫入「工作表1」 string queryString = @" --DECLARE @FieldText nvarchar(50) --SET @FieldText=N'abc' SELECT * FROM [TestDB].[dbo].[Table1] "; using (SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["TestDBConnectionString"].ConnectionString)) { SqlCommand command = new SqlCommand(queryString, connection); //command.Parameters.Clear(); //command.Parameters.AddWithValue("@FieldText", queryFieldText); connection.Open(); // 欄位名稱 csvContent.Append("id,FieldText,FieldDateTime,FieldInt,FieldBit\r\n"); SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) { //Console.WriteLine(String.Format("{0}", reader[0])); for (int i = 0; i < reader.FieldCount; i++) { dataText = reader[i].ToString(); // 規則運算式語言 - 快速參考 | Microsoft Docs // https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/regular-expression-language-quick-reference // 換掉影響 CSV 顯示效果的字元 dataText = dataText.Replace("\r", "").Replace("\n", "").Replace("\t", "").Replace(",", ",").Replace("'", "′").Replace(@"""", "”"); // 換掉可能影響 .ods 的不可見字元 //dataText = dataText.Replace("\a", "").Replace("\b", "").Replace("\t", "").Replace("\v", "").Replace("\f", "").Replace("\\", ""); // .NET C# 不能用,語法錯誤 //s = Regex.Replace(s, @"[^/x21-/x7E]", ""); //dataText = Regex.Replace(dataText, @"[^0x20-0x7E]", ""); //dataText = Regex.Replace(dataText, @"[^/x7E-/x20]", ""); // .NET C# 可用,語法正確,但中文字會被過濾掉,只剩 ASCII 可見字元 //dataText = Regex.Replace(dataText, @"[^\u0021-\u007E]", ""); // 不是第一個欄位(i=0)時,前面要加上逗號 if (i != 0) csvContent.Append(","); csvContent.Append(dataText); } csvContent.Append("\r\n"); // 每行最後加上換行 } } csvFileStreamWriter.Write(csvContent); csvFileStreamWriter.Flush(); MyMemoryStream.Position = 0; MyMemoryStream.WriteTo(Response.OutputStream); Response.Flush(); Response.End(); Label_MSG1.ForeColor = System.Drawing.Color.Green; Label_MSG1.Text = "匯出成功。"; // 上面 Response 輸出檔案,所以下面 JavaScript alert 是不會跳出的 //Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('匯出成功。');</script>"); } #endregion Export CSV } catch (Exception ex) { Label_MSG1.ForeColor = System.Drawing.Color.Green; string exMsg = "不明錯誤。"; if (ex != null) { exMsg = ex.Message.ToString(); } Label_MSG1.Text = exMsg; Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('匯出失敗。');</script>"); // Exception Message 內容可能導致 JavaScript alert 無法顯示,所以下面這行可能無法跳出對話盒視窗。 Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('" + exMsg + "');</script>"); } } // ---------- } } |
(完)
相關
[研究][ASP.NET][WebForm] 匯出寫入 .csv
https://shaurong.blogspot.com/2021/02/aspnet-csv.html
[研究]ASP.NET WebForm 用 ClosedXML 匯出 CSV ANSI 和 CSV UTF-8 ( .csv)(逗號分隔檔)https://shaurong.blogspot.com/2024/02/aspnet-webform-closedxml-csv-ansi-csv.html
沒有留言:
張貼留言