我一直在查看微软支持页面Binding for Office automation servers with Visual C# .NET,尝试创建一个Excel工作表,用数据表中的值填充它,然后将其保存到计算机中。
我有一个使用早期绑定的实现,只是循环遍历项目,但我不知道如何通过后期绑定实现这一点,我需要能够嵌入Interop类型来生成应用程序版本与MS Office无关。
如何使用后期绑定将数据表中的行添加到新的Excel工作表?
答案 0 :(得分:1)
我建议编写一个界面并抽象数据填充步骤和excel步骤。这样你就可以拥有一个系统来实现与excel的早期绑定来做事,然后是一个使用这个界面来填充excel表的引擎。第2步是使用Late Binding而不是早期绑定来编写接口的第二个实现。然后,在创建接口时,只需将第二个实现替换为代码中的第一个实现。
在代码中,您只能创建一个对象,即接口本身。在创建它时,您可以将其指定为实现该接口的任何其他类/实现...这是我自己的代码中的示例:
ISpreadsheetControl SSInterface;
if (conditionCheck())
SSInterface = new ExcelImplementer();
else
SSInterface = new OpenOfficeImplementer();
我只使用1对象,SSInterface,放置数据或更改页面设置等等...我实现的任何其他...但它可以通过两种不同的方式来实现,基于我分配给哪个类加载时的界面。
关于“如何”的细节和细节...我发现你提供的链接中的第二个例子确实非常有用。它全部与Type和Invoke有关。困难在于在任何特定时间跟踪您正在使用的内容。这是使其更难处理的事情之一,并且是首先提取早期绑定实现的一个很好的理由。这样,您可以在编写第二个时看到所需的所有方法名称及其参数列表。
我还想补充一点:对你的问题非常简单和简短的回答是“完全按照你原来的那样做”你只是改变'如何'调用填充数据的方法......以及其他所有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 );
我不得不承认,我现在还没有可以测试它的实现,但根据我所知道的事情,这应该有效。如果“单元格”不起作用,我也会使用“范围”相同的代码...我实际上并不知道是否需要数字输入。
link to Cells property description (msdn)
您可能还想稍微探索整个系统,它可以帮助您找到您可能正在寻找的一些内容。
经过测试管理成功创建并测试上述代码,效果非常好。