1

我正在尝试使用 SpreadsheetGear 将数据从 DataTable 导出到 Excel 文件中。Excel 文件中的工作表将从带有列标题和特定格式的模板复制。为了便于维护(更改存储过程和模板以更改报告内容,而不是重新部署服务),我不想在代码中进行某些列格式设置,即列填充颜色。

我使用 SpreadsheetGear 的CopyFromDataTable进行导出。但是,InsertCells 标志不会导致数据采用其插入的行的格式(列填充颜色),如描述说明(“这允许对单元格进行预格式化”)。

我正在通过不使用 InsertCells 标志来解决此问题,而只是在模板中的整个列上设置列填充颜色。但是,这会导致整个列被着色,包括超出使用范围。我想将格式限制在使用的范围内。

有什么方法可以清除UsedRange之外的任何格式吗?在我写这篇文章时,我意识到这种方法很复杂。但是格式化是强制性的,我想简化维护,只需要存储过程更改和模板更改。我对任何其他可能促进这一点的方法持开放态度。

4

2 回答 2

2

SetDataFlags .InserCells 枚举选项应允许在仅由您的 DataTable 填充的范围内选择格式。但是,如文档中所述,要使其正常工作有确切的要求:

“指定此标志 [InsertCells] 时,如果未指定 SpreadsheetGear.Data.SetDataFlags.NoColumnHeaders,则必须提供恰好包含两行数据的范围,前面是列标题行。”

“两行数据”应该按照您的需要进行格式化(内部/填充颜色等)。SpreadsheetGear 附带的 Explorer 示例解决方案(位于开始菜单/屏幕的 SpreadsheetGear 文件夹中)在Reporting > DataSet to Workbook下包含一个示例来演示这一点。

更新

下面的示例演示了如何将 InsertCells 标志与 NoColumnHeaders 结合使用。此代码假定您worksheet已经设置了格式化范围,并且您可以获得一个 DataTable,其大小对应于格式化范围中的列数。

using SpreadsheetGear;
using SpreadsheetGear.Data;

// Generate DataTable.  For this example, let's say it is 5 columns wide and 
// 10 rows deep...
DataTable dataTable = // ...get DataTable...

// We're not interested in a "Column Header" row, so for the above dataTable, 
// an IRange 5 columns wide and 2 rows deep needs to be specified where those
// two rows are already setup with the desired formatting.  In this case B2:F3
// are formatted accordingly.
worksheet.Cells["B2:F3"].CopyFromDataTable(dataTable, SetDataFlags.InsertCells |
    SetDataFlags.NoColumnHeaders);

// Sheet should how have B2:F11 populated with your dataTable data, with all
// rows having picked up the formatting as originally specified in B2:F3
于 2014-02-27T23:18:35.673 回答
1

我有两个建议

1) 不是很优雅,但您可以在 Excel 模板中使用条件格式来获取您希望填充电子表格的最大行数。如果单元格不是空白或同一行中的其他参考单元格符合定义的标准,您应该能够打开所需的格式。

2) 使用 Datatable.Rows.Count 计算 C# 数据表中的行数,然后根据该信息构造 Excel 单元格范围定义。粘贴到表格中后,将所需的格式应用于目标单元格区域(抱歉,没有时间查看代码示例)。

于 2014-02-28T01:12:01.330 回答