【问题标题】:Creating and populating an excel sheet with late-binding使用后期绑定创建和填充 Excel 工作表
【发布时间】:2012-05-30 11:30:59
【问题描述】:

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

我有一个使用早期绑定并简单地循环遍历项目的实现,但我不知道您将如何通过后期绑定实现这一点,并且我需要能够嵌入 Interop 类型来制作应用程序与 MS Office 版本无关。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    我只在放置数据或更改页面设置等时使用 1 个对象 SSInterface……无论我实现了什么……但它可以根据我分配给加载时的界面。

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

    我还想补充一点:对您的问题的非常简单而简短的回答是“完全按照您已经做的方式做”您只需更改“如何”调用填充数据的方法...以及所有其余的 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)

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

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

    【讨论】:

    • 这是我正在努力解决的数据填充步骤。对于早期绑定,这是一个简单的案例:foreach (DataRow row in dataTable.Rows) { iCol = 1; foreach (DataColumn col in dataTable.Columns) { wSheet.Cells[iRow + 1, iCol] = row[col.ColumnName]; iCol++; } iRow++; } 对于后期绑定,我还不明白如何使用类似 'wSheet.GetType().InvokeMember(.. .)'我会继续摆弄它并尝试一些事情。
    • 噢,你打败了我。我只是逐字逐句地写出了相同的功能:P 非常感谢!
    猜你喜欢
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2021-10-07
    相关资源
    最近更新 更多