使用Late Binding使用C#更改Excel单元格属性

时间:2012-07-05 16:14:41

标签: c# excel office-interop late-binding

我似乎无法获取Excel工作表中单个单元格的属性。 我创建一个Excel工作表的函数,用DataSet中的数据填充它,然后打印工作表。

我遇到的问题是,当我打印表格时,格式化完全没有了 - 单元格太小,许多信息被截断。如何设置单元格的宽度并更改字体?

以下是我正在使用的一小段内容,供您阅读:

// Add rows
iRow = 1;

foreach (DataRow row in table.Rows)
{
    iCol = 1;

    foreach (DataColumn col in table.Columns)
    {
        Parameters = new Object[2];
        Parameters[0] = iRow + 1;
        Parameters[1] = iCol;
        excelCell = excelSheet.GetType().InvokeMember("Cells",
          BindingFlags.GetProperty, null, excelSheet, Parameters);

        Parameters = new Object[1];
        Parameters[0] = row[col.ColumnName];
        excelCell.GetType().InvokeMember("Value",
          BindingFlags.SetProperty, null, excelCell, Parameters);

        iCol++;
    }
    iRow++;
}

似乎有很多关于如何通过早期绑定实现类似功能的例子,但我必须遗漏一些具有后期绑定的东西。

3 个答案:

答案 0 :(得分:4)

我不喜欢通过反思来解决这个问题。这是痛苦的。如果可以,我真的建议查看新的“动态”关键字。你失去了Intellisense(没什么大不了的,因为它在这种情况下并不是那么有用),但代码很容易编写和理解。

以下是打开Excel,创建工作簿,设置单元格值,设置字体大小以及最后更改列宽的示例:

var excelType = Type.GetTypeFromProgID("Excel.Application");
dynamic excel = Activator.CreateInstance(excelType);
excel.Visible = true;
excel.Workbooks.Add();
excel.Cells(1, 1).Value = "Hello";
excel.Cells(1, 1).Font.Size = "14";
excel.Columns(@"A:A").ColumnWidth = 20;

如果您不确定如何做某事,您基本上只需在Excel中录制宏,然后查看代码即可。您几乎可以将其剪切并粘贴到C#代码中。

答案 1 :(得分:1)

更改单元格的宽度与更改列的宽度

相同

看看这有用吗? (的 UNTESTED

// Set the column width
public void SetColWdth(string rng, double wdth)
{
    Range = excelSheet.GetType().InvokeMember("Range",
    BindingFlags.GetProperty,null, excelSheet, new object [] {rng});
    object [] args = new object [] {wdth};
    Range. GetType().InvokeMember ("Columnwdth",
    BindingFlags.SetProperty, null, Range, args);
}

对于字体,请参阅this是否有帮助?

引用上述链接以防它死亡

foreach (string line in header)
{

    Object entireRow = GetRow(sheet, columnCount, rowOffset);
    entireRow.GetType().InvokeMember("MergeCells",
    BindingFlags.SetProperty, null, entireRow,
    new object[] { true });
    entireRow.GetType().InvokeMember("HorizontalAlignment",
    BindingFlags.SetProperty, null, entireRow, new object[] { 3 });
    Object tlCell = GetCell(sheet, 1, rowOffset);
    tlCell.GetType().InvokeMember("Value2", BindingFlags.SetProperty,
    null, tlCell, new object[] { "'" + line });
    Object font = tlCell.GetType().InvokeMember("Font",
    BindingFlags.GetProperty, null, tlCell, null);

    rowOffset++;
}

for (int col = 0; col < data.Columns.Count; col++)
{
    Object test = GetCell(sheet, col + 1, rowOffset);
    //DataTable Headers
    {
        Object erow = test.GetType().InvokeMember("EntireRow",
        BindingFlags.GetProperty, null, test, null);
        Object font = erow.GetType().InvokeMember("Font",
        BindingFlags.GetProperty, null, erow, null);
        erow.GetType().InvokeMember("HorizontalAlignment",
        BindingFlags.SetProperty, null, erow, new object[] { 3 });
        font.GetType().InvokeMember("Bold", BindingFlags.SetProperty,
        null, font, new object[] { true });
        test.GetType().InvokeMember("Value2", BindingFlags.SetProperty,
        null, test, new object[] { data.Columns[col].ColumnName.ToString() });
    }
}

答案 2 :(得分:1)

使用Siddharth向我展示的内容,我能够从工作表中获取一个单元格范围并更改该范围内的ColumnWidth属性:

//Get the first worksheet.
Parameters = new Object[1];
Parameters[0] = 1;
excelSheet = excelSheets.GetType().InvokeMember("Item",
    BindingFlags.GetProperty, null, excelSheets, Parameters);

//Set the Column Width within a large Range of cells.
Parameters = new Object[2];
Parameters[0] = "A1";
Parameters[1] = "E55";
excelRange = excelSheet.GetType().InvokeMember("Range",
    BindingFlags.GetProperty, null, excelSheet, Parameters);

Parameters = new Object[1];
Parameters[0] = 26;
excelRange.GetType().InvokeMember("ColumnWidth",
BindingFlags.SetProperty, null, excelRange, Parameters);

我可以使用此方法通过将“ColumnWidth”替换为我想要设置的属性来更改该范围内的任何单元格属性。


要更改字体,我首先需要将单元格的Font属性作为对象,然后使用该对象访问字体属性:

object cellFont = excelCell.GetType().InvokeMember("Font",
    BindingFlags.GetProperty, null, excelCell, null);

Parameters = new Object[1];
Parameters[0] = true;
cellFont.GetType().InvokeMember("Bold",
BindingFlags.SetProperty, null, cellFont, Parameters);

谢谢!