c# - 使用后期绑定(bind)创建和填充 Excel 工作表

标签 c# excel .net-4.0 interop late-binding

我一直在查看 Microsoft 支持页面 Binding for Office automation servers with Visual C# .NET尝试创建一个 Excel 工作表,用数据表中的值填充它,然后将它保存到机器上。

我有一个使用早期绑定(bind)并简单地循环遍历项目的实现,但我不知道你如何使用后期绑定(bind)实现这一点,我需要能够嵌入 Interop 类型来制作应用程序独立于 MS Office 的版本。

如何使用后期绑定(bind)将数据表中的行添加到新的 Excel 工作表?

最佳答案

我建议编写一个接口(interface)并抽象数据填充步骤和 excel 步骤。这样你就可以拥有一个系统,它实现了与 excel 的早期绑定(bind)来做事,然后是一个使用这个接口(interface)来填充 excel 工作表的引擎。第 2 步是使用后期绑定(bind)而不是早期绑定(bind)来编写接口(interface)的第二个实现。然后,您只需在创建接口(interface)时用代码中的第一个实现替换第二个实现。

在代码中,您只会创建 1 个对象,即接口(interface)本身。但是,在创建它时,您可以将其分配为实现该接口(interface)的任何其他类/实现...这是我自己的代码中的一个示例:

ISpreadsheetControl SSInterface;
if (conditionCheck())
    SSInterface = new ExcelImplementer();
else
    SSInterface = new OpenOfficeImplementer();

我只使用 1 个对象,SSInterface,在放置数据或更改页面设置等时......无论我实现了什么......但它可以根据我分配给哪个类以两种不同的方式来实现加载时的界面。

至于“如何做”的具体细节……我发现您提供的链接中的第二个示例确实非常有帮助。一切都与类型和调用有关。困难在于随时跟踪您正在处理的内容。这是使它更难使用的原因之一,也是首先提取早期绑定(bind)实现的一个很好的理由。这样您就可以在编写第二个时看到所有需要的方法名称及其参数列表。

我还想补充一点:对你的问题的非常简单和简短的回答是“按照你已经做的完全一样的方式做”你只需改变你调用填充数据的方法的“方式”......以及所有其他 excel 互操作实现。

更新

我认为这可能会满足您的需求,尽管它足够困惑以至于我建议将它(实际上是两个操作,一个可以调用另一个)放入它自己单独的方法中的某个地方。

//Get a range object that contains the cell.
Parameters = new Object[2];
Parameters[0] = iRow + 1;
Parameters[1] = iCol;
objRange_Late = objSheet_Late.GetType().InvokeMember( "Cells",
    BindingFlags.GetProperty, null, objSheet_Late, Parameters );

//Write value in cell
Parameters = new Object[1];
Parameters[0] = row[col.ColumnName];
objRange_Late.GetType().InvokeMember( "Value", BindingFlags.SetProperty, 
    null, objRange_Late, Parameters );

我必须承认,我现在还没有可以对其进行测试的实现,但根据我所了解的情况,它应该可以工作。如果“Cells”不起作用,我也会使用“Range”的相同代码...我实际上不知道它是否需要数字输入。

link to Cells property description (msdn)

您可能还想探索一下整个系统,它可以帮助您找到一些您可能正在寻找的东西。

已测试成功创建并测试了上述代码,它运行良好。

关于c# - 使用后期绑定(bind)创建和填充 Excel 工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10815425/

相关文章:

c# - 使用 Interop 从 DataGrid 导出到 Excel 太慢

excel - 使用 VBA 将 CSV 导入 Excel 匹配列标题

.net-4.0 - WCF 在客户端和主机之间共享对象

c# - 绘制 emf 抗锯齿

c# - 我可以在 Blazor 中有多个 _Host.chstml 文件吗?

c# - 查询表达式 ""中的语法错误(缺少运算符)

C#.NET 4.0 并发字典 : TryRemove within a lock?

c# - 单击 MessageBox 中的帮助按钮多次加载帮助链接

c# - 如何在MVC项目外部重构数据库访问代码,但将 View 模型保留在内部?

c# - 从 byte[] 下载文件 C# MVC