我只需要一个确认/快速信息。我觉得这是一个显而易见的问题,但我只想确保并充分了解正在发生的事情。在网上找不到太多详细信息。
我使用SpreadSheetGear从数据表中转储电子表格中的数据。这些表中有一些Guid。现在,当我试图从我的数据表中复制时,我会收到一个错误,说数据类型错误,除非我使用标志AllText或删除数据表中包含Guid的列进行导入。
excel似乎无法支持Guids作为变量/数据类型。这正常吗?我不一定需要数据,无论如何都可以很容易地转换为文本格式,但我只想完全理解这个问题。
下面是一个带有以下错误的示例代码:无效的单元格值类型。
public void Test()
{
DataTable table = new DataTable();
table.Columns.Add("ID", typeof(Guid));
table.Columns.Add("Drug", typeof(string));
table.Columns.Add("Patient", typeof(string));
table.Columns.Add("Date", typeof(DateTime));
table.Rows.Add(Guid.NewGuid(), "Indocin", "David", DateTime.Now);
table.Rows.Add(Guid.NewGuid(), "Enebrel", "Sam", DateTime.Now);
table.Rows.Add(Guid.NewGuid(), "Hydralazine", "Christoff", DateTime.Now);
IWorkbook wrk = Factory.GetWorkbook();
IWorksheet wsht = wrk.Worksheets["Sheet1"];
IRange rng = wsht.Cells["A1"];
rng.CopyFromDataTable(table, SpreadsheetGear.Data.SetDataFlags.None);
wrk.SaveAs("C:\MyData.xls",FileFormat.OpenXMLWorkbook);
wrk.Close();
}
使用不带SetDataFlags.AllText标志的IRange.CopyFromDataTable(…)基本上就像使用循环为DataTable中的每个数据"单元格"设置IRange.Value,这意味着此传入DataTable数据中使用的数据类型受IRange.VValue的设置器要求的约束,该设置器声明:
将指定单元格的值设置为System.String,System.Double、System.Int32、System.Int64、System.Int16、System.Char、,System.Boolean,System.DateTime,SpreadsheetGear.ValueError,System.Decimal、System.DBNull、object[、]或null
由于Guid
不是与IRange.Value一起使用的有效类型,因此在DataTable中使用此数据类型也不起作用。
当您指定SetDataFlags.AllText标志时,SpreadsheetGear首先对DataTable中的每个数据"单元格"调用ToString(),因此无论它是否在上面的列表中,所有传入的数据类型都将被接受。