【问题标题】:Spreadsheetgear set data flags for specific column?Spreadsheetgear 为特定列设置数据标志?
【发布时间】:2014-07-01 20:28:44
【问题描述】:

我正在尝试这样做:

IWorksheet worksheet = Factory.GetWorkbook().Worksheets[0];

IRange range = worksheet.Cells["A1"];

range.CopyFromDataTable(dataTable, SetDataFlags.None);

worksheet.Cells.Columns.AutoFit();
return worksheet;

这通常工作得很好,但是我遇到了一个问题。我有一列的数字很长,前面可能有零,我需要将其输入并显示为文本。如果我查找该特定单元格,例如:

var cell = range["U34"].Value;

数据已经转换为科学计数法,因此之后的任何格式化都无法修复它。我尝试了 SetDataFlags.AllText,效果很好,但它破坏了工作表的其余部分,因为所有数字都存储为文本,这是不可接受的。

我不知道如何解决这个问题。

解决方案: 由于我只是想更改一列,如果它存在并且很多列是动态的,我会选择“预格式化”路线。从数据表中查找列索引:

int ColumnIndex = -1;
        for (int x = 0; x < dataTable.Columns.Count; x++)
        {
            if (dataTable.Columns[x].ColumnName.Equals("Whatever"))
            {
                ColumnIndex = x;
            }
        }
worksheet.Cells[0, ColumnIndex, 0, ColumnIndex].EntireColumn.NumberFormat = "@";

然后执行 CopyFromDataTable,将 Flags 设置为 None,一切都完美了!

【问题讨论】:

    标签: c# excel datatable spreadsheetgear


    【解决方案1】:

    IRange.CopyFromDataTable(...) 方法可以在 SetDataFlags.InsertCells 枚举选项中传递,它允许您预先设置目标范围的格式,以便插入的 DataTable 数据采用您指定的格式.此格式包括单元格的 IRange.NumberFormat,可设置为“@”并指定该单元格的输入应视为文本。

    因此,如果您知道哪些列将包含这些触发科学记数法的异常大的数字,则另一种选择是使用 IRange.NumberFormat = "@" 预先格式化您的工作表的目标范围,并按原样保留这些列的值。

    请参阅 IRange.CopyFromDataTable(...) 方法的文档,因为它提供了有关需要此“预格式化”的范围的重要信息。此外,假设您已在计算机上安装了 SpreadsheetGear,请查看适用于 C#/VB 的 SpreadsheetGear Explorer 解决方案中的 Reporting > DataSet to Workbook 示例(位于“开始”菜单下的“SpreadsheetGear”文件夹中)有关此 SetDataFlags.InsertCells 选项的现场演示。

    【讨论】:

    • 我选择了预格式化路线,因为我认为这对我的情况更容易。谢谢你的帮助!很棒的产品!
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 2021-03-01
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多