C#通过COM使用Excel:如何用另一个工作簿替换整个工作簿?

C#通过COM使用Excel:如何用另一个工作簿替换整个工作簿?,c#,excel,com,C#,Excel,Com,我开发了一个应用程序,可以生成包含图表、数据等的丰富Excel文件(报表)。 我的程序现在只需将生成的结果保存在一个文件中并启动它: byte[] reportBytes = getReport(...); string reportFilename = "report.xls"; Excel.Application oXL; Excel.Workbook oWB; try { oXL = (Excel.Application)System.Runtime.InteropServic

我开发了一个应用程序,可以生成包含图表、数据等的丰富Excel文件(报表)。 我的程序现在只需将生成的结果保存在一个文件中并启动它:

byte[] reportBytes = getReport(...);
string reportFilename = "report.xls";

Excel.Application oXL;
Excel.Workbook oWB;

try
{
    oXL = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    oWB = oXL.Workbooks[name];
    oWB.Close(false);
}
catch (Exception ex)
{
    //
}                

File.WriteAllBytes(reportFilename, reportBytes);
Process.Start(reportFilename);
在此代码中,每次启动应用程序时,打开的Excel工作簿都会关闭并重新打开(这会导致闪烁)。 我希望在开发过程中打开Excel workbok,并在每次启动后动态获取报告更新。我相信COM技术可以做到这一点


我需要用另一个(临时).xls文件替换打开工作簿的所有内容。你能给我举个工作例子吗?

你的问题不够清楚。我的理解是,您希望替换另一个excel文件的内容。为什么不简单地复制粘贴文件呢。如果需要上一个文件,则只需将其复制到备份文件夹中,然后再使用新文件覆盖

如果我所说的适用,那么请评论我的回答。我将进一步调查这个问题。请正确地解释这个问题

就闪烁问题而言,为什么不尝试以下方法:

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
app.Workbooks.Open(@"<FilePath>");
Microsoft.Office.Interop.Excel.Application app=new Microsoft.Office.Interop.Excel.Application();
应用程序。工作簿。打开(@“”);
但这将启动Excel,您必须手动关闭它

为避免在打开和关闭excel文件时闪烁,请使用oledb写入excel。下面是一个示例代码:

string filePath = @"<FilePath>";
string connectionString = @"Provider = Microsoft.ACE.OLEDB.12.0, Data Source={0}"; 
OleDbConnection conn = new OleDbConnection();
OleDbCommand cmd = new OleDbCommand();
conn.ConnectionString = string.Format(connectionString, filePath);
conn.Open();
cmd.CommandText = "Insert into [Sheet1$] (a1,a2) values('5','e')";
cmd.ExecuteNonQuery();
conn.Close();
stringfilepath=@”;
字符串连接字符串=@“Provider=Microsoft.ACE.OLEDB.12.0,数据源={0}”;
OleDbConnection conn=新的OleDbConnection();
OleDbCommand cmd=新的OleDbCommand();
conn.ConnectionString=string.Format(ConnectionString,filePath);
conn.Open();
cmd.CommandText=“插入[Sheet1$](a1,a2)值('5','e')”;
cmd.ExecuteNonQuery();
康涅狄格州关闭();

当我第一次启动应用程序时,它会将生成的报告保存到文件中,并在Excel中打开。然后我关闭我的应用程序,更改其代码(调试)并再次启动。它生成报告,关闭opened.xls(如果我没有手动关闭它),保存到相同的文件名,然后再次打开。此关闭-重新打开会导致Excel窗口短期“闪烁”。我希望避免使用它,并动态刷新所有.xls内容。>“为什么不简单地复制粘贴文件”,因为这会产生错误“文件区域正在使用”。那么您的意思是说您在启动并关闭应用程序的同时保持日志文件打开?如果是这样,我建议使用oledb将数据写入excel。查看我的更新答案的示例代码。我没有任何日志。我的excel文件是由C#代码生成的报告。是的,在关闭、编辑和重新启动我的C#代码进行调试时,我将其保持打开状态。我非常希望避免抄写Excel文件的所有部分(表格、图表、样式等中的数据)。