通过C#在Excel中打开一个CSV文件?

使用Max Galkin提供的解决scheme,我将以下过程将ListView中的所有数据传输到.CSV文件。 我有两个部分的问题,但是:

  1. 当用户在适当的对话框上单击YES时,我还没有想出如何成功打开新创build的.CSV。
  2. 似乎有些用户(在Virtual PC上与我不同)不能打开或查看新文件,除非他们首先closures应用程序。 我相信这是由于应用程序仍然有一个与创build的文件绑定的进程。 试图打开文件时出现的消息是: 'FileName.csv' cannot be accessed. The file may be corrupted, located on a server that is not responding, or read-only. 'FileName.csv' cannot be accessed. The file may be corrupted, located on a server that is not responding, or read-only.

这是我现在的代码:

 private void btnCSVExcel_Click(object sender, EventArgs e) { if (!Directory.Exists(@"C:\TEMP\")) { Directory.CreateDirectory(@"C:\temp\"); } if (!Directory.Exists(@"C:\temp\Exported CSV Files\")) { Directory.CreateDirectory(@"C:\temp\Exported CSV Files\"); } string csvPath = @"C:\temp\Exported CSV Files\"; ListViewToCSV(lvData, csvPath, false); } // https://stackoverflow.com/questions/1008556/export-listview-to-csv public static void ListViewToCSV(ListView listView, string filePath, bool includeHidden) { string csvFileName = filePath + DateTime.Now.ToString("yyyy-MM-dd-hh.mm.ss.ffffff") + ".csv"; //make header string StringBuilder result = new StringBuilder(); WriteCSVRow(result, listView.Columns.Count, i => includeHidden || listView.Columns[i].Width > 0, i => listView.Columns[i].Text); //export data rows foreach (ListViewItem listItem in listView.Items) { WriteCSVRow(result, listView.Columns.Count, i => includeHidden || listView.Columns[i].Width > 0, i => listItem.SubItems[i].Text); } File.WriteAllText(csvFileName, result.ToString()); var openCSVFile = MessageBox.Show("Export Complete. CSV file saved as: " + csvFileName + ". \n\n Open File Now?", "CSV Exported", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (openCSVFile == DialogResult.Yes) { // NEED TO OPEN THE CSV FILE IN EXCEL....? File.Open(csvFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None); } } private static void WriteCSVRow(StringBuilder result, int itemsCount, Func<int, bool> isColumnNeeded, Func<int, string> columnValue) { bool isFirstTime = true; for (int i = 0; i < itemsCount; i++) { if (!isColumnNeeded(i)) continue; if (!isFirstTime) result.Append(","); isFirstTime = false; result.Append(String.Format("\"{0}\"", columnValue(i))); } result.AppendLine(); } 

任何人有任何想法可以解决这两个问题? 我认为File.Open()可能足以解决第一个问题,但在视觉上什么也没有发生,文档不能打开。

1)Excel将自己注册为.csv文件的默认处理程序。 要使用该types的默认文件处理程序打开任何文件,只需执行以下操作:

 Process.Start(@"c:\full\path\to\file.csv"); 

2) File.WriteAllText应该在最后closures文件。 上面显示的代码也有一行读取File.Open(csvFileName...以独占写入模式打开文件由于您不closures该文件,Excel不能打开它,直到a)过程终止或者b)文件被垃圾收集器closures。 我敢打赌,垃圾收集器还没有运行的情况下,发生访问被拒绝的错误。

最终build议:删除File.Open并用Process.Startreplace,您可能会看到不同的结果。

您需要在项目中添加对Microsoft Excel Interop库的引用:

 using Excel = Microsoft.Office.Interop.Excel; 

然后,您可以使用以下代码打开CSV文件:

  static void OpenCSVWithExcel(string path) { var ExcelApp = new Excel.Application(); ExcelApp.Workbooks.OpenText( path, Comma:true); ExcelApp.Visible = true; }