我只需要确认/快速信息。我觉得这是一个显而易见的问题,但只是想确保并完全理解发生了什么。无法在网上找到更多细节。
我使用SpreadSheetGear从数据表转储电子表格中的数据。这些表中有一些Guid。现在当我尝试从我的数据表中复制时,我收到错误的错误数据类型,除非我使用标记AllText导入或删除我的数据中包含Guids的列。
似乎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();
}
答案 0 :(得分:3)
在没有CopyFromDataTable的情况下使用IRange。SetDataFlags(...)。AllText标志基本上就像使用循环为每个"单元格设置IRange。Value&#34 ; DataTable中的数据,这意味着此传入的DataTable数据中使用的数据类型受IRange。Value的setter要求的约束,其中声明:
...将指定单元格的值设置为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首先在每个"单元格上调用ToString()" DataTable中的数据,因此无论是否在上面的列表中,都将接受所有传入的数据类型。