C# 使用后期绑定使用C更改Excel单元格属性
我似乎无法获取Excel工作表中单个单元格的属性。 我使用的函数创建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
// 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);
谢谢