【问题标题】:SpreadsheetGear CopyFromDataTable cell formattingSpreadsheetGear CopyFromDataTable 单元格格式
【发布时间】:2014-02-26 14:20:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 澄清 - 表中的列数和行数是否不确定?否则,如果总是有固定数量的列和行,您可以在工作表模板中预设目标区域的格式。
  • @Xcheque - 列数是已知的,并且它们在模板中已预先格式化,只有行(不确定数量)才是问题所在。我不想格式化超过已用行数的列,如果我在模板中的整个列上设置填充颜色,就会发生这种情况。我无法让 SpreadsheetGear 插入的行为类似于 Excel 中的手动插入,其中插入的行采用上面插入的格式。

标签: c# excel formatting spreadsheetgear


【解决方案1】:

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

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

“两行数据”应根据您的需要进行格式化(内部/填充颜色等)。 SpreadsheetGear 附带的资源管理器示例解决方案(在您的开始菜单/屏幕的 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

【讨论】:

  • 是的,我通读了这个。文档有点混乱,因为据我所知,您不能指定第二个数据标志。因此,如果您正在设置 InsertCells,则不能设置 NoColumnHeaders,反之亦然(如果我错了,请纠正我)。不过,除此之外,这正是我采用的方法,但效果并不理想。它就像粘贴值一样 - 数据只是覆盖在单元格已有的任何格式上。
  • 可以使用多个标志。您只需要使用按位或运算符 (|) 将它们组合起来。关于此功能的整体问题,我不知道 InsertCells 有任何问题,我为 SpreadsheetGear 工作,所以我应该知道!如果有帮助,我将通过一个演示此功能的示例来修改我的答案。
  • 有趣,我知道我迟早需要学习位运算符!我会试试这个,看看会发生什么。
  • @CsabaToth,是的,谢谢你的提问,所以我记得标记我的答案。
【解决方案2】:

我有两个建议

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

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

【讨论】:

  • 感谢您的建议。使用 1) - 行数不是很可预测。但也许我可以有条件地格式化每一行(它是.xls,所以不太糟糕),然后在复制数据后,复制并粘贴整个工作表以删除条件格式(是否有格式“粘贴值”等效? ) 然后删除所有空行。使用 2) - 我正在使用原始实现执行此操作,但我不希望代码进行任何格式化(以避免重新部署)。也许我可以避免这一切,让用户对超出使用范围的列格式感到满意...
猜你喜欢
  • 2013-07-17
  • 2019-06-02
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2013-02-03
  • 1970-01-01
相关资源
最近更新 更多