我正在尝试使用SpreadsheetGear将数据从DataTable导出到Excel文件中。将从具有列标题和特定格式的模板中复制Excel文件中的工作表。为了便于维护(更改存储过程和模板以更改报表内容,而不是重新部署服务)我不想在代码中进行某些列格式化,即列填充颜色。
我使用SpreadsheetGear的CopyFromDataTable进行导出。但是,InsertCells标志不会使数据采用其插入行的格式(列填充颜色)作为描述说明(“这允许单元格预先格式化”)。
我正在通过不使用InsertCells标志来解决这个问题,而只是在模板中的整个列上设置列填充颜色。但是,这会导致整个色谱柱变色,包括超出使用范围。我想将格式限制为使用范围。
有没有办法清除UsedRange的外格式?在我写这篇文章的时候,我意识到这种方法很复杂。但格式化是强制性的,我想简化维护,只需要存储的proc更改和模板更改。我愿意采取任何其他方法来促进这一点。
答案 0 :(得分:2)
SetDataFlags。InserCells枚举选项应允许在仅由DataTable填充的范围内拾取格式。但是,正如documentation:
中所述,有正确的要求使其正常工作“指定此标志[InsertCells]时,必须为数据提供恰好两行的范围,如果未指定SpreadsheetGear.Data.SetDataFlags.NoColumnHeaders,则前面有列标题行。”
“数据的两行”应格式化,但需要(内部/填充颜色等)。 SpreadsheetGear附带的Explorer Samples Solutions(位于“开始”菜单/屏幕的SpreadsheetGear文件夹中)包含一个示例,该示例在 Reporting>下进行了演示。数据集到工作簿。
<强>更新强>
下面是一个演示如何将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
答案 1 :(得分:1)
我有两个建议
1)不是很优雅,但您可以在Excel模板中使用条件格式设置,以获得您希望填充电子表格的最大行数。如果单元格不为空或者同一行中的某个其他参考单元符合定义的条件,则应该能够打开所需的格式。
2)使用Datatable.Rows.Count计算C#数据表中的行数,然后根据该信息构造Excel单元格范围定义。在粘贴到表格后,将所需的格式应用于目标单元格范围(对不起代码示例)。