我似乎无法获取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++;
}
似乎有很多关于如何通过早期绑定实现类似功能的例子,但我必须遗漏一些具有后期绑定的东西。
答案 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);
谢谢!