我正在尝试这样做:
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,一切都很完美!
答案 0 :(得分:1)
IRange。CopyFromDataTable(...)方法可以在SetDataFlags。InsertCells枚举选项中传递,该选项允许您预先格式化目标范围,以便插入的DataTable数据可以获取您指定的格式。这种格式包括一个单元格的IRange。NumberFormat,可以设置为&#34; @&#34;并指定应将该单元格的输入视为Text。
因此,如果您知道哪些列会有这些异常大的数字触发科学记数法,另一种选择是使用IRange.NumberFormat = "@"
预先设置工作表的目标范围格式,并保留您的值这些列是按原样的。
请参阅IRange。CopyFromDataTable(...)方法的文档,因为它提供了有关此格式需要的重要信息&#34;预格式化。&#34;另外,假设您已在自己的计算机上安装了SpreadsheetGear,请查看报告&gt;用于C#/ VB的SpreadsheetGear Explorer解决方案中的DataSet to Workbook 示例(位于“开始菜单”下的“#34; SpreadsheetGear&#34;文件夹”中),用于此SetDataFlags的插入式插件选项。