1

背景:我正在从数据库中填充大量 asp.net c# GridViews 和 ListViews,随后用户可以将它们导出到 Excel。我想导出为本机 Excel(不是 html)。我不能使用办公自动化,我正在使用 JET,它工作正常。我无法控制用户的机器。


问题:在进行导出时,您必须告诉 Jet 每个字段是什么类型,在我的例子中是“文本”(varchar)或“数字”(双精度)。不同之处在于,如果您导出数字列,用户可以在 Excel 中对数据求和,因为字符串导出时带有前导撇号,因此在算术中没有多大用处。

目前我解析 Grid/ListView 的第一个数据行,检查每个值是数字还是文本,并相应地为列分配类型。这行得通,除非我在第一列中有一些看起来数字但实际上是文本字符串的东西。我不想解析每一行以确保我有正确的数据类型,因为其中一些导出非常大。

当我从数据库加载 Grid/ListView 时,数据库当然知道每个字段是什么类型。所以我的问题是......如何提取 Grid/ListView 项目后面的数据库项目的类型?我可以将其显式编码为项目的属性,但这是重复我已经拥有的信息,只要我能得到它。

我知道我有一个 DataTable,然后我可以从中获取基础类型,但大多数情况下我没有方便的表,只有 Grid/ListView。

--(编辑)请注意,如果您尝试将空字符串插入可为空的数字列,Jet 会抛出异常。这样做的方法是从插入语句中省略该列名,或者输出一个零。

4

2 回答 2

0

据我所知,答案是“你不能”。我的数据源仅返回字符串,因此您无法有效地解析任何为列类型自动创建的 DataTable。


我所做的是...

我可以通过查看网格/列表的第一行来“嗅探”大多数列类型。仅当第一列数据为空(什么都不告诉您),或者第一列暗示数字但列数据是例如字母数字时,这才会失败。

因此,对于那些我知道存在问题或测试显示存在问题的列,我使用自定义属性注释那些特定的 Grid 或 ListView 项,该属性强制将项导出为文本或数字。我默认使用文本,所以在实践中,我主要只需要注释那些我特别想呈现为数字的条目。例外是一些以前导零开头的 ID 号,我想以这种方式呈现,因此明确地作为文本显示。

如果我有一个 DataTable(例如图表),但我不能做嗅探技巧(见上文)或注释技巧(同上),然后我将列类型的映射传递给我的导出代码。

总之,在某些情况下,我不得不在 Grid/ListView 模板字段或字段映射中重复列类型定义。不可能全部赢。它确实有效。

于 2010-08-20T20:51:53.523 回答
0

我认为你试图做的是弄清楚它的底层DataSourceGridView绑定ListView之后?

DataSource如果是这样,那是不可能的,因为一旦绑定,控件并没有真正跟踪。它们主要用于填充它的列、模板等,然后只维护这些项目。

我可以提供的唯一建议是将其存储DataSource在另一个位置,以便您以后可以访问它,然后使用它来发现用于每列的基础数据类型。如果需要,您可以将其存储在Sessionor中ViewState,但这会增加开销。另一种选择是在绑定之前找出数据类型,然后将它们存储在具有某种格式的隐藏字段中,您以后可以使用它来复制正在执行的操作。

例如(不好的例子,但给你一个想法)在隐藏字段中存储以下数据:

yourHiddenField.Text = "0,1|1,1|2,0|3,1|etc...";
// format "columnindex,fieldtype(0=double,1=string)" with a pipe delimiter.

不漂亮,但说明了我正在考虑的基本想法。

于 2010-08-18T18:40:48.837 回答