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

时间:2014-08-13 11:12:31

标签: c# excel com

我开发了一个应用程序,它生成带有图表,数据等的丰富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文件。你能告诉我工作的例子吗?

1 个答案:

答案 0 :(得分:0)

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

如果我的意思适用,那么请评论我的答案。我会进一步研究这个问题。请妥善解释问题。

就闪烁问题而言,为什么不试试这个:

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
app.Workbooks.Open(@"<FilePath>");

但这将启动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();