6

我正在将数据从 CxDBGrid 导出到 Excel 文件。我能够创建文件并在其中复制数据,但我在列格式方面遇到了真正的问题。由于我从数据库中提取数据,因此我希望电子表格能够反映以下类型:NUMBER、VARCHAR2、DATE 等等。我直观地创建了一个宏,去寻找 VBA 代码,并在 Delphi 项目中复制它:

sheet.Columns[K+2].NumberFormat := '0,000'; //Number
sheet.Columns[K+2].NumberFormat := '@'; //Text
sheet.Columns[K+2].NumberFormat := 'm/d/yyyy'; //Date

数字格式在大多数情况下都可以正常工作,但其他两个则不行。当我打开生成的文件时,文本列显示为“自定义”类型,每个单元格显示“-64”。如果我去编辑一个单元格,正确的值实际上就在那里。日期是另一个问题:数据库的格式是 dd/mm/yyyy,如果我按原样将它提供给 Excel,它就会一团糟。我尝试设置正确的格式,但 Excel 无法识别它。

有什么线索吗?

我也在设置列宽。这完美无瑕。

4

2 回答 2

6

问题是分配的值是 Unicode 字符串。尝试这个:

sheet.Columns[K+2].NumberFormat := AnsiChar('@');
sheet.Columns[K+2].NumberFormat := AnsiString('m/d/yyyy');
于 2014-06-04T09:49:07.577 回答
3

你没有说“你是如何手动做事的”,这意味着人们必须完全猜测你在做什么。所以这是我的疯狂猜测:

  1. 如果我假设您使用的是 Developer Express 中的 Express Spreadsheet 组件,我对这个组件有丰富的经验。它不支持任意数字格式。它支持精确到小数点后两位的“货币”格式 (0.00)。它不支持三位或一位,或任何其他小数位数。如果是这样,这是 Express 电子表格中的一个已知设计问题。

  2. 如果手动表示上面显示的“工作表”是一个 OLE 对象,并且您通过 OLE 自动化与 Excel 本身进行通信,那么您应该将 CELLS 格式化为单独或作为范围,而不是列对象。我不确定列对象格式将如何覆盖单元格值,如果他们这样做的话。单元格的格式化通常是一个单元一个单元的问题,并且必须这样处理。

  3. 如果您真的希望它正常工作,您将不会通过 OLE 自动化使用 Excel,您将获得一个正确的 Excel XLS 格式的书写库。我很确定您可以直接从 CX(DevEx)数据库网格中获得正确的结果,但我会在他们的论坛上询问,而不是在这里。对于常规的 DB Grid,我只使用TJvDBGridExcelExportJedi JVCL 中的哪个,并且可以与常规的 VCL DB Grid 一起使用。

于 2012-08-18T17:36:26.403 回答