【问题标题】:Open a CSV file in Excel via C#?通过 C# 在 Excel 中打开 CSV 文件?
【发布时间】:2014-05-30 08:22:01
【问题描述】:

使用Max Galkin 提出的解决方案,我整理了以下过程,将 ListView 中的所有数据传输到 .CSV 文件。但是,我遇到了 2 个部分的问题:

  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.

这是我当前的代码:

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() 对于第一个问题可能就足够了,但视觉上什么都没有发生并且文档没有打开。

【问题讨论】:

  • This 为我工作。

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


【解决方案1】:

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

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

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

最终建议:去掉File.Open,换成Process.Start,你可能会看到不同的结果。

【讨论】:

  • 感谢您回复迈克尔!根据您对 Sebs 解决方案的评论和您的观点差异,我尝试了您对问题 1 的解决方案。它似乎正在工作。实际上,我确实从不同的导出过程中引用了 Excel 互操作,但是由于我的用户在虚拟机上没有足够的处理能力将所有数据直接加载到 Excel 电子表格中(对于普通 PC 用户,它一直超时)工作正常)。对问题 #2 有任何想法吗?
  • 刚刚看到你在#2 上的部分,抱歉。我会试一试!
  • 感谢迈克尔的帮助!这似乎已经成功了:)
【解决方案2】:

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

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;
    }

【讨论】:

  • 这会起作用,但它容易出错并且需要额外的依赖。我建议只对 csv 文件使用 Process.Start 而不是使用自动化。
  • 我看到了你的回答,但我不同意你的看法。 Process.Start 将使用 Windows 中的默认应用程序启动 CSV。如果用户使用文本板映射 CSV 文件,该文件将不会在 Excel 中打开。
  • 同意。在我绝对必须让这种事情工作的情况下,我手动查找注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe 的默认值并手动启动该过程。自动化有太多的陷阱。 (这里有 13 年的办公自动化经验。)
  • '自动化有太多的陷阱':我不能反驳你;)(也有 13 年的办公自动化经验)
猜你喜欢
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2023-03-29
  • 2013-12-15
相关资源
最近更新 更多