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

时间:2014-04-15 19:37:09

标签: c# .net excel csv export-to-csv

使用Max Galkin提供的解决方案,我将以下过程放在一起,将ListView中的所有数据传输到.CSV文件。我遇到了两个部分的问题:

  1. 当用户在相应的对话框上点击YES时,我还没想出如何成功打开新创建的.CSV。
  2. 似乎有些用户(在Virtual PC上与我不同)无法打开或查看新文件,除非他们首先关闭应用程序。我相信这是因为应用程序仍然有一个与创建的文件绑定的进程。尝试打开文件时显示的消息是:'FileName.csv' cannot be accessed. The file may be corrupted, located on a server that is not responding, or read-only.
  3. 这是我目前的代码:

    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()可能足以满足第一个问题,但在视觉上没有任何事情发生,文档也无法打开。

2 个答案:

答案 0 :(得分:12)

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

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

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

最终建议:移除File.Open并替换为Process.Start,您可能会看到不同的结果。

答案 1 :(得分:8)

您需要在项目中添加对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;
    }