Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过C#在Excel中打开CSV文件?_C#_.net_Excel_Csv_Export To Csv - Fatal编程技术网

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

通过C#在Excel中打开CSV文件?,c#,.net,excel,csv,export-to-csv,C#,.net,Excel,Csv,Export To Csv,使用由提供的解决方案,我编写了以下过程,将ListView中的所有数据传输到.CSV文件。但是,我对两个部分存在问题: 当用户单击相应对话框上的YES时,我还不知道如何成功打开新创建的.CSV 似乎有些用户(在虚拟PC上,与我不同)无法打开或查看新文件,除非他们先关闭应用程序。我相信这是因为应用程序仍然有一个与创建的文件相关的进程。尝试打开文件时显示的消息是:“FileName.csv”无法访问。文件可能已损坏、位于没有响应的服务器上或为只读。 这是我目前的代码: private void bt

使用由提供的解决方案,我编写了以下过程,将ListView中的所有数据传输到.CSV文件。但是,我对两个部分存在问题:

  • 当用户单击相应对话框上的
    YES
    时,我还不知道如何成功打开新创建的.CSV
  • 似乎有些用户(在虚拟PC上,与我不同)无法打开或查看新文件,除非他们先关闭应用程序。我相信这是因为应用程序仍然有一个与创建的文件相关的进程。尝试打开文件时显示的消息是:
    “FileName.csv”无法访问。文件可能已损坏、位于没有响应的服务器上或为只读。
  • 这是我目前的代码:

    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();
            }
    
    private void btnCSVExcel\u单击(对象发送者,事件参数e)
    {
    如果(!Directory.Exists(@“C:\TEMP\”)
    {
    CreateDirectory(@“C:\temp\”);
    }
    如果(!Directory.Exists(@“C:\temp\Exported CSV Files\”)
    {
    目录.CreateDirectory(@“C:\temp\Exported CSV Files\”);
    }
    字符串csvPath=@“C:\temp\Exported CSV Files\”;
    ListViewToCSV(lvData,csvPath,false);
    }
    // https://stackoverflow.com/questions/1008556/export-listview-to-csv
    公共静态无效ListViewToCSV(ListView ListView、字符串文件路径、bool includeHidden)
    {
    字符串csvFileName=filePath+DateTime.Now.ToString(“yyyy-MM-dd-hh.MM.ss.ffffff”)+“.csv”;
    //生成标题字符串
    StringBuilder结果=新建StringBuilder();
    WriteCSVRow(结果,listView.Columns.Count,i=>includeHidden | | listView.Columns[i]。宽度>0,i=>listView.Columns[i]。文本);
    //导出数据行
    foreach(listView.Items中的ListViewItem listItem)
    {
    WriteCSVRow(结果,listView.Columns.Count,i=>includeHidden | | listView.Columns[i]。宽度>0,i=>listItem.SubItems[i]。文本);
    }
    File.writealText(csvFileName,result.ToString());
    var openCSVFile=MessageBox.Show(“导出完整的.CSV文件另存为:“+csvFileName+”\n\n立即打开文件?”,“CSV导出”,MessageBoxButtons.YesNo,MessageBoxIcon.Information);
    if(openCSVFile==DialogResult.Yes)
    {
    //是否需要在EXCEL中打开CSV文件。。。。?
    File.Open(csvFileName,FileMode.Open,FileAccess.ReadWrite,FileShare.None);
    }
    }
    私有静态void WriteCSVRow(StringBuilder结果、int itemsCount、Func isColumnRequired、Func columnValue)
    {
    bool isFirstTime=true;
    对于(int i=0;i

    有人对我如何解决最后两个问题有什么想法吗?我认为
    File.Open()
    可以满足第一个问题的要求,但是视觉上什么都没有发生,文档也无法打开。

    您需要在项目中添加对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;
        }
    
    1) Excel将自己注册为.csv文件的默认处理程序。要使用该类型的默认文件处理程序打开任何文件,只需执行以下操作:

    Process.Start(@"c:\full\path\to\file.csv");
    
    2)
    File.WriteAllText
    应在结尾处关闭该文件。上面显示的代码还有一行,读取
    File.Open(csvFileName…
    ,以独占写入模式打开文件。由于不关闭该文件,Excel无法打开它,直到a)进程终止或b)垃圾收集器关闭该文件。我打赌在发生拒绝访问错误的情况下,垃圾收集器还没有运行


    最后一项建议:删除
    文件。打开
    并替换为
    进程。启动
    ,您可能会看到不同的结果。

    这会起作用,但容易出错,需要额外的依赖项。我建议只使用
    过程。对csv文件启动
    ,而不是使用自动化。我看到了你的答案,但我不同意你的看法。Process.Start将使用Windows中的默认应用程序启动CSV。如果用户使用textpad映射CSV文件,则该文件将不会在Excel.com中打开。如果我必须让这类工作正常进行,我会手动查找注册表项的默认值
    HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Path\excel.exe
    ,然后手动启动该过程。自动化只是有太多的陷阱。(在这里有13年的办公自动化经验。)“自动化有太多的陷阱”:在这一点上我不能反驳你;)(还有13年的办公自动化经验)谢谢您的回复,Michael!根据您对Sebs解决方案的评论和您的观点差异,我尝试了您对问题1的解决方案。它似乎在工作。实际上,我确实从不同的导出过程中引用了Excel Interop,但由于我的用户在虚拟机上没有足够的处理能力,无法将所有数据直接加载到Excel电子表格中(对于普通PC用户来说,它工作得很好),所以该过程一直超时。对第二期有什么想法吗?我刚看到你在第二期的角色,对不起。我要试一试!谢谢你的帮助,迈克尔!这似乎起到了作用:)对我有效。