我正在将数据从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
数字格式在大多数情况下都可以正常工作,但其他两个则没有。 当我打开生成的文件时,文本列显示为“Custom”类型,每个单元格显示“-64”。如果我去编辑一个单元格,那么实际上就是正确的值。 日期是另一个问题:数据库的格式是dd / mm / yyyy,如果我按原样将其提供给Excel,它会搞得一团糟。我尝试设置正确的格式,但Excel无法识别它。
任何线索?
我也设置了列宽。这完美无瑕。
答案 0 :(得分:4)
问题是指定的值是Unicode字符串。试试这个:
sheet.Columns[K+2].NumberFormat := AnsiChar('@');
sheet.Columns[K+2].NumberFormat := AnsiString('m/d/yyyy');
答案 1 :(得分:3)
你没有说过“你是如何手动做的”,这意味着人们必须完全猜测你在做什么。所以这是我的猜测:
如果我假设您正在使用Developer Express中的Express Spreadsheet组件 我对这个组件有丰富的经验。它不支持任意数字格式。它支持“money”格式(0.00),正好有两位小数。它不支持三个或一个或任何其他数量的小数位。 如果是这样,这是Express电子表格中的一个已知的设计问题。
如果通过手动意味着上面显示的“工作表”是一个OLE对象,并且您正在通过OLE自动化与Excel本身进行通信,那么您应该单独或作为范围格式化CELLS,而不是列对象。我不确定列对象格式如何覆盖单元格值,如果它们完全覆盖的话。细胞的格式通常是逐个细胞的,必须按原样处理。
如果你真的希望它能够正常工作,你就不会通过OLE自动化使用Excel,你将获得一个适当的Excel XLS格式的写作库。我很确定你可以直接从CX(DevEx)数据库网格获得正确的结果,但我会在他们的论坛上问,而不是在这里。使用常规数据库网格,我只使用Jedi JVCL中的TJvDBGridExcelExport
,它可以与常规的VCL数据库网格一起使用。