在 C# 中將 DataTable 轉換為 CSV

Muhammad Zeeshan 2023年10月12日
在 C# 中將 DataTable 轉換為 CSV

本文將引導你使用 C# 將 DataTable 轉換為 CSV 檔案。首先,我們必須知道 CSV 是什麼,所以讓我們開始吧。

逗號拆分值(也稱為 CSV 檔案)中的資料由逗號而不是空格分隔到各自的列中。CSV 檔案的另一個用途是在資料自動放入 Excel 中的相應單元格時立即在 Excel 中開啟檔案。

C# 中將 DataTable 轉換為 CSV

將 DataTable 轉換為 CSV 檔案的第一步是建立 DataTable。以下段落概述了這樣做所涉及的步驟。

建立和填充 DataTable

  • 首先,我們必須匯入以下庫:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
  • 我們建立了一個名為 datacreation 的類,其中包含一個名為 CreateData() 的方法,該方法生成一個 DataTable 作為其返回值。

    public static class datacreation {
      public static DataTable CreateData() {}
    }
    
  • 從資料輸入開始,我們必須在 CreateData() 中建立一個名為 dtDataTable 物件。

    DataTable dt = new DataTable();
    
  • 初始化物件後,下一步是將資料列新增到 DataTable dt。我們已經包含了 RollnumFirstnameLastnameSubject 欄位,你可以自由新增你需要的任何其他區域。

    dt.Columns.Add("RollNum", typeof(int));
    dt.Columns.Add("Firstname", typeof(string));
    dt.Columns.Add("Lastname", typeof(string));
    dt.Columns.Add("Subjects", typeof(string));
    
  • 接下來,在這些列或欄位中填寫資訊。

    dt.Rows.Add(3227, "Zeeshan", "Khan", "C#");
    dt.Rows.Add(3290, "Bubby", "Zeeshan", "Java");
    dt.Rows.Add(3247, "Osama", "shanii", "C++");
    dt.Rows.Add(3156, "Haseeb", "Bhatti", "Python");
    dt.Rows.Add(3223, "Saad", "Shukhri", "Mongo Db");
    dt.Rows.Add(3267, "Sheraz", "Malik", "MySQl");
    dt.Rows.Add(3288, "Nabeel", "Sindho", "PHP");
    dt.Rows.Add(3299, "Ahsan", "Chishti", "C");
    
  • CreateData() 函式將返回 DataTable 型別的表。

    return dt;
    

C# 中將 DataTable 轉換為 CSV

建立 DataTable 後,下一步是編寫將 DataTable 轉換為 CSV 的程式碼。

  • 我們在 implementCSV 類中新增了一個名為 ConvertTocsv 的新方法。變數 dtpath 是它採用的引數。

    public static class implementCSV {
      public static void ConvertTocsv(this DataTable dt, string path) {}
    }
    
  • ConvertTocsv 方法中,我們建立了一個名為 sStreamWriter 物件,它將在指定路徑中寫入資料。

    StreamWriter s = new StreamWriter(path, false);
    
  • 我們將使用 for 迴圈通過在每列之間插入逗號來拆分 DataTable 中的資料。

    for (int i = 0; i < dt.Columns.Count; i++) {
      s.Write(dt.Columns[i]);
      if (i < dt.Columns.Count - 1) {
        s.Write(",");
      }
    }
    s.Write(s.NewLine);
    
  • 之後,我們現在將使用一個 foreach 迴圈,它將使用逗號從 DataTable dt 寫入資料。

    foreach (DataRow dr in dt.Rows) {
      for (int i = 0; i < dt.Columns.Count; i++) {
        if (!Convert.IsDBNull(dr[i])) {
          string value = dr[i].ToString();
          if (value.Contains(',')) {
            value = String.Format("\"{0}\"", value);
            s.Write(value);
          } else {
            s.Write(dr[i].ToString());
          }
        }
        if (i < dt.Columns.Count - 1) {
          s.Write(",");
        }
      }
      s.Write(s.NewLine);
    }
    

完整的原始碼

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataTableExport {
  public static class datacreation {
    public static DataTable CreateData() {
      DataTable dt = new DataTable();
      dt.Columns.Add("RollNum", typeof(int));
      dt.Columns.Add("Firstname", typeof(string));
      dt.Columns.Add("Lastname", typeof(string));
      dt.Columns.Add("Subjects", typeof(string));

      dt.Rows.Add(3227, "Zeeshan", "Khan", "C#");
      dt.Rows.Add(3290, "Bubby", "Zeeshan", "Java");
      dt.Rows.Add(3247, "Osama", "shanii", "C++");
      dt.Rows.Add(3156, "Haseeb", "Bhatti", "Python");
      dt.Rows.Add(3223, "Saad", "Shukhri", "Mongo Db");
      dt.Rows.Add(3267, "Sheraz", "Malik", "MySQl");
      dt.Rows.Add(3288, "Nabeel", "Sindho", "PHP");
      dt.Rows.Add(3299, "Ahsan", "Chishti", "C");
      return dt;
    }
  }
  public static class implementCSV {
    public static void ConvertTocsv(this DataTable dt, string path) {
      StreamWriter s = new StreamWriter(path, false);
      for (int i = 0; i < dt.Columns.Count; i++) {
        s.Write(dt.Columns[i]);
        if (i < dt.Columns.Count - 1) {
          s.Write(",");
        }
      }
      s.Write(s.NewLine);
      foreach (DataRow dr in dt.Rows) {
        for (int i = 0; i < dt.Columns.Count; i++) {
          if (!Convert.IsDBNull(dr[i])) {
            string value = dr[i].ToString();
            if (value.Contains(',')) {
              value = String.Format("\"{0}\"", value);
              s.Write(value);
            } else {
              s.Write(dr[i].ToString());
            }
          }
          if (i < dt.Columns.Count - 1) {
            s.Write(",");
          }
        }
        s.Write(s.NewLine);
      }
      s.Close();
    }
  }
}

建立 Windows 窗體

在 DataTable 中建立資料並使用逗號分隔後,下一步是構建一個 Windows 窗體,可以在其中顯示資料,然後將其轉換為 .csv 格式。

  • 首先,讓我們建立一個 Windows 窗體,如下所示,在其中,我們將放置一個 DataGridView 和一個名為 Convert data to CSV 的按鈕。包括顯示建立資料的 DataGridView 和將 DataTable 轉換為 CSV 的按鈕。

    資料表形式

  • 執行完 Windows 窗體後,它將如下所示:

    執行表格

為 Windows 窗體編寫程式碼

建立 Windows 窗體後,下一步是編寫 將資料轉換為 CSV 按鈕的程式碼。

  • 通過呼叫下面列出的方法初始化一個物件並用資料填充它。

    DataTable dt = datacreation.CreateData();
    
  • OpenSavefileDialog() 可用於以給定名稱儲存檔案。

    string filename = OpenSavefileDialog();
    
  • ConvertTocsv 將用於​​從我們建立的資料建立一個 CSV 檔案。

    dt.ConvertTocsv(filename);
    

Windows 窗體原始碼

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  DataTable dt = datacreation.CreateData();
  dataGridView1.DataSource = dt;
}

private void btnCSV_Click(object sender, EventArgs e) {
  DataTable dt = datacreation.CreateData();
  string filename = OpenSavefileDialog();
  dt.ConvertTocsv(filename);
}

private string OpenSavefileDialog() {
  string filename = null;
  SaveFileDialog saveFileDialog = new SaveFileDialog();
  saveFileDialog.Filter = "csv File|*.csv";
  saveFileDialog.Title = "Save";
  DialogResult dialogResult = saveFileDialog.ShowDialog();
  if (dialogResult == DialogResult.OK) {
    filename = saveFileDialog.FileName;
  }
  return filename;
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

相關文章 - Csharp CSV

相關文章 - Csharp DataTable