C# VTSO:有时用户无法打开由WinC窗体应用程序生成的Excel文件

C# VTSO:有时用户无法打开由WinC窗体应用程序生成的Excel文件,c#,export-to-excel,C#,Export To Excel,我们的一个应用程序允许用户使用Excel模板生成Excel文件,该模板使用Click Once安装/部署。这是一个VSTO应用程序 Excel文件是通过在注册表中存储一些值并使用以下代码调用模板生成的。COLUYMN从两个不同的列表中提取,一个是必需列表,另一个是可选列表: private void myButtonExport_Click(object sender, EventArgs e) { if (CurrentTableRow == null) return; if

我们的一个应用程序允许用户使用Excel模板生成Excel文件,该模板使用Click Once安装/部署。这是一个VSTO应用程序

Excel文件是通过在注册表中存储一些值并使用以下代码调用模板生成的。COLUYMN从两个不同的列表中提取,一个是必需列表,另一个是可选列表:

private void myButtonExport_Click(object sender, EventArgs e)
{
    if (CurrentTableRow == null) return;
    if (CurrentTemplateRow == null) return;

    List<string> requiredColumns = excelTemplateTableDS.GetColumnsList(false);
    List<string> myColumns = userTableDS.GetColumnsList(false);
    string selectStatement;

    try
    {
        CustomerListColumnSelect f = new CustomerListColumnSelect(myColumns, requiredColumns);
        if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            selectStatement = string.Format("SELECT {0} FROM [{1}]", string.Join(", ", f.SelectedColumns.ToArray()), CurrentTableRow.TableName);

            Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Company\Collection Development");
            rk.DeleteValue("TemplateTableName", false);
            rk.DeleteValue("TemplateSelectStatement", false);
            rk.SetValue("TemplateTableName", CurrentTableRow.TableName, Microsoft.Win32.RegistryValueKind.String);
            rk.SetValue("TemplateSelectStatement", selectStatement, Microsoft.Win32.RegistryValueKind.String);
            rk.Close();

            // Launch Excel
            AppLog.WriteEvent("CreateCustomerList", TraceEventType.Information,
                string.Format("Creating customer list [{0}] using table [{1}]", CurrentTemplateRow.TemplateName, CurrentTableRow.TableName));
            if (Debugger.IsAttached)
            {
                FileInfo fi = new FileInfo(CurrentTemplateRow.Path);
                string newPath = string.Format(@"C:\Documents and Settings\mpetrie\My Documents\Visual Studio 2010\Projects\Collection Development Templates\{0}\bin\Release\{1}", CurrentTemplateRow.TemplateName, fi.Name);
                // If running under DEBUG (and app not installed), then launch latest version
                Process.Start(newPath);
            }
            else
            {
                Process.Start(CurrentTemplateRow.Path);
            }
        }
        f.Dispose();
    }
    catch (Exception ex)
    {
        MessageBox.Show(this, CurrentTemplateRow.Path + "\r\n" + ex.Message, "Process.Start", MessageBoxButtons.OK, MessageBoxIcon.Error);
        ResetSteps(sender, e);
        return;
    }
}
然后,每个模板都有一组代码,用于使用注册表中的值将数据加载到存储表中。这部分从来没有问题,它是在excel文件保存后,有人试图打开它

我不熟悉这个应用程序和VSTO。我有点不清楚文件是如何保存的。我假设当它被保存时,模板中的所有关联代码不会与文件一起保存,只有数据会被保存

通常,我们的用户无法打开该文件。Excel从不出错,它只是像试图打开文件一样旋转。我们已经等待了30分钟或更长时间,但没有结果。似乎文件被打开了,但从未被渲染,但这只是一个猜测。这是非常随机的。有时,同一个文件可以由其他用户打开,有时有问题的用户可以稍后再试,并且文件可以正常打开

从防病毒到网络共享,我们有几种可能导致问题的想法。虽然,这是一个随机的问题,我们不知道如何调试它发生时,它可能不会再发生几个小时或几天。用户报告他们在打开任何其他Excel文件时没有问题,只打开此应用程序生成的文件

有人知道这是什么原因吗


肖恩

我对这个问题的描述是完全错误的。在今天亲眼看到这个问题之后。问题是文件已打开,但不可见。我将启动一个新线程,更好地描述问题。

是否关闭excel文件?您需要释放excel对象。你能把你的连接放在using语句中吗?我把代码完全弄错了。它是在不同的代码区域调用Excel模板…我将更新主要问题