將 DataTable 資料存為文字檔:完整 WinForms 實作範例
核心程式碼
using System.IO;
using System.Text;
using System.Windows.Forms;
private void btnExport_Click(object sender, EventArgs e) {
try {
DataTable dt = GetGridData(); // 取得資料來源
WriteDataTableToText(dt);
MessageBox.Show("匯出成功!");
} catch (Exception ex) {
MessageBox.Show("匯出失敗:" + ex.Message);
}
}
private void WriteDataTableToText(DataTable dt) {
string tempPath = Path.Combine(Application.StartupPath, "TempExport.txt");
StringBuilder sb = new StringBuilder();
// 寫入標題列 (可自訂)
sb.AppendLine("注數\t紅1\t紅2\t紅3\t紅4\t紅5\t紅6\t藍1\t藍2");
foreach (DataRow row in dt.Rows) {
for (int i = 0; i < dt.Columns.Count; i++) {
sb.Append(row[i].ToString());
if (i < dt.Columns.Count - 1) sb.Append('\t');
}
sb.AppendLine();
}
File.WriteAllText(tempPath, sb.ToString(), Encoding.Default); // 或 UTF8
// 另存新檔對話框
using (SaveFileDialog sfd = new SaveFileDialog()) {
sfd.Filter = "文字檔 (*.txt)|*.txt|所有檔案 (*.*)|*.*";
sfd.FileName = "Export_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
if (sfd.ShowDialog() == DialogResult.OK) {
File.Copy(tempPath, sfd.FileName, true);
}
}
// 清理暫存檔
if (File.Exists(tempPath)) File.Delete(tempPath);
}
關鍵技術點
- StringBuilder:高效組合大量字串,避免重複記憶體配置
- File.WriteAllText:.NET 2.0+ 一次寫入,自動處理 Stream 開關
- Encoding.Default:相容舊系統 (ANSI),需支援 Unicode 可用
Encoding.UTF8
- SaveFileDialog:提供使用者選擇儲存位置與檔名
- 暫存檔機制:先寫固定路徑,再複製至使用者指定路徑,簡化邏輯
進階擴充建議
- 支援自訂分隔符 (Tab, Comma, Pipe)
- 加入欄位標題自動產生選項
- 大量資料分批寫入 (
StreamWriter 逐行) 避免記憶體壓力
- 匯出進度報告 (BackgroundWorker/Task + Progress<T>)
- 支援 CSV RFC 4180 標準 (雙引號逸出、換行處理)
常見坑點提醒
- 資料含換行符需決定是否置換或加引號
- 編碼不匹配導致中文亂碼 (建議統一 UTF-8 with BOM)
- 檔案被佔用時複製失敗 (需 try-catch 處理
IOException)
- 超大資料集記憶體不足 (改用 StreamWriter 串流寫入)