使用C#使用延迟绑定更改Excel单元格属性

我似乎无法得到我的Excel表单中的单个单元格的属性。 我已经创build了一个Excel工作表的function,使用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++; } 

似乎有很多关于如何实现类似于早期绑定的例子,但是我必须用迟来的约束来丢失一些东西。

我不是通过反思去经历这个事情的粉丝。 这是痛苦的。 如果可以,我真的build议看看新的“dynamic”关键字。 你失去了Intellisense(没有什么大不了的,因为在这种情况下它并不是那么有用),但是代码很容易编写和理解。

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

 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中录制一个macros,然后查看代码。 您几乎可以将其剪切并粘贴到您的C#代码中。

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

看看是否有帮助? ( 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); } 

对于字体,看看是否有帮助?

从上面的链接报价,以防万一死亡

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

使用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”replace为我想要设置的属性即可。


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

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

谢谢!