C# 使用后期绑定使用C更改Excel单元格属性

C# 使用后期绑定使用C更改Excel单元格属性,c#,excel,office-interop,late-binding,C#,Excel,Office Interop,Late Binding,我似乎无法获取Excel工作表中单个单元格的属性。 我使用的函数创建Excel工作表,用数据集中的数据填充它,然后打印工作表 我遇到的问题是,当我打印工作表时,格式都不正常- 单元格太小,许多信息被截断。如何设置单元格的宽度和更改字体 以下是我正在处理的一个小片段,供您阅读: // Add rows iRow = 1; foreach (DataRow row in table.Rows) { iCol = 1; foreach (DataColumn col in tabl

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

我遇到的问题是,当我打印工作表时,格式都不正常- 单元格太小,许多信息被截断。如何设置单元格的宽度和更改字体

以下是我正在处理的一个小片段,供您阅读:

// 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++;
}

关于如何实现早期绑定类似的功能,似乎有很多例子,但我肯定错过了后期绑定的一些功能。

更改单元格的宽度与更改列的宽度是一样的

看看这是否有用?未经测试

有关字体,请参阅帮助

从上面的链接引用,以防它死掉

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() });
    }
}

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

看看这是否有用?未经测试

有关字体,请参阅帮助

从上面的链接引用,以防它死掉

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() });
    }
}

我不喜欢通过反思来理解这一点。很痛。如果可以的话,我真的建议你看看新的动态关键字。你失去了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代码中。

我不喜欢通过反射来了解这一点。很痛。如果可以的话,我真的建议你看看新的动态关键字。你失去了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代码中。

使用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替换为我要设置的任何属性

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

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);

谢谢

使用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替换为我要设置的任何属性

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

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);
谢谢