using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace YangjieTester { public static class ExportData { public static void ExportDataGridViewToCsv(DataGridView dgv, string filePath) { var sb = new StringBuilder(); // 1. 写入列标题(跳过 RowHeaders) var headers = new List(); foreach (DataGridViewColumn col in dgv.Columns) { if (col.Visible) // 只导出可见列 //headers.Add($"\"{col.HeaderText.Replace("\"", "\"\"")}\""); headers.Add(EscapeCsvField(col.HeaderText)); } sb.AppendLine(string.Join(",", headers)); // 2. 写入每一行数据 foreach (DataGridViewRow row in dgv.Rows) { if (row.IsNewRow) continue; // 跳过新增行 var cells = new List(); foreach (DataGridViewCell cell in row.Cells) { if (!dgv.Columns[cell.ColumnIndex].Visible) continue; string value; if (cell.Value == null || cell.Value == DBNull.Value) { value = ""; } else if (cell.Value is DateTime dt) { // ✅ 关键修复:显式格式化为包含秒(甚至毫秒) // 根据你的需求选择格式: //value = "'" + dt.ToString("yyyy-MM-dd HH:mm:ss.fff"); value = "\u200B" + dt.ToString("yyyy-MM-dd HH:mm:ss.fff"); } else { value = cell.Value.ToString(); } cells.Add(EscapeCsvField(value)); } sb.AppendLine(string.Join(",", cells)); } // 3. 写入文件 File.WriteAllText(filePath, sb.ToString(), Encoding.UTF8); } // 辅助方法:正确转义 CSV 字段 private static string EscapeCsvField(string value) { if (string.IsNullOrEmpty(value)) return ""; // 如果是我们手动加了单引号前缀(表示文本),则不加双引号 if (value.StartsWith("'")) return value; // 直接返回,如:'2025-11-12 10:47:17.591 // 否则,按标准 CSV 规则:含逗号、换行、引号的字段用双引号包裹 if (value.Contains(",") || value.Contains("\n") || value.Contains("\"")) return "\"" + value.Replace("\"", "\"\"") + "\""; return value; } public static void ExportDataToTxt(string txt,string filePath) { File.WriteAllText(filePath, txt, Encoding.UTF8); } } }