在处理cxgrid数据导出到Excel时,遇到了不少问题,其中最主要的问题是导出数据的格式设置。而导出数据的格式问题根据发生的顺序又可以细分为两节:首先是如何将cxgrid中的数据导出成Excel对应的数据类型,即使字符串导成文本、浮点数及整数导成数值;其次是如何解决数值型导出到Excel变成带货币符号的货币型而非数值型问题。
虽然cxgrid的帮助文档中对于cxgrid数据导出到Excel的函数有了较详细的描述(可参考前文《cxgrid数据导出到Excel方法》),但对于细节的内容并无太大帮助,至于中文的相关内容的搜索结果更是指望不上了,只好跑到官方网站上查找类似问题。等看e文看得昏昏沉沉、头晕眼花之后,才勉强清楚应该如何设置。
1.将cxgrid中的数据导出成Excel对应的数据类型的设置:
1.1设计时:
1.1.1.设置字段值类型(Column.DataBinding.ValueType)
1.1.2.设置编辑器类型(Column.Properties)
1.2运行时:
运行时的设置与设计时的设置类似,只是设置的属性变为Column.PropertiesClass和Column.DataBinding.ValueTypeClass。
范例代码如下:
//增加数据列
procedure addCXColumn(view:TcxGridDBBandedTableView;fldName,cptText:String;
valWidth:Integer;align:TAlignment;
vtc:TcxValueTypeClass;
propertiesClazz:TcxCustomEditPropertiesClass;
canShow:boolean=true);
begin
with view.CreateColumn do
begin
Caption := cptText;
Width := valWidth;
Visible := canShow;
HeaderAlignmentHorz := align;
PropertiesClass := propertiesClazz;
Position.BandIndex := view.Bands.Count-1;
DataBinding.FieldName := fldName;
DataBinding.ValueTypeClass := vtc;
end;
end;
//将自定义数据类型转换为cxgrid字段的数据类型
function transformToValueType(ftype:String):TcxValueTypeClass;
begin
if ftype=IC_FLD_TYPE_VARCHAR then
begin
result := TcxStringValueType;
exit;
end;
if ftype=IC_FLD_TYPE_NUMBER then
begin
result := TcxFloatValueType;
exit;
end;
if ftype=IC_FLD_TYPE_INT then
begin
result := TcxIntegerValueType;
exit;
end;
if ftype=IC_FLD_TYPE_DATE then
begin
result := TcxDateTimeValueType;
exit;
end;
result := TcxStringValueType;
end;
//将自定义数据类型转换为cxgrid的属性类型
function transformToPropertiesClass(ftype:String):TcxCustomEditPropertiesClass;
begin
if (ftype=IC_FLD_TYPE_VARCHAR) or (ftype=IC_FLD_TYPE_DATE) then
begin
result := TcxTextEdit.GetPropertiesClass;
exit;
end;
result := TcxSpinEdit.GetPropertiesClass;
end;
1.3导出函数的参数设置
ExportGrid4ToExcel函数的AUseNativeFormat参数必须设置为true。
1.4其他
后来测试了下,发现字段值属性ValueType(ValueTypeClass)的设置似乎不影响导出的数据类型,不设置不会影响导出效果,而编辑器类型Properties(PropertiesClass)的设置才是影响导出效果的关键。这与帮助文档中的内容有出入,不知是何缘故。
2.解决数值型导出到Excel变成带货币符号的货币型而非数值型问题
按上述内容设置后导出到Excel,cxgrid的数值型内容在Excel中变成货币型,而且导出内容前会出现具体地区对应的货币符号(如人民币符号,¥)。百思不得其解,最后在官方网站搜索时找到了不少类似问题,他们的客服人员都提到这么一点——TBCDField会被默认为货币类型,而且客服人员基本都会让用户升级控件或者修改具体的代码(不同版本所需要修改的地方都不相同)。把程序运行起来并跟踪进去,发现数值型字段在导出时果然被判断为货币型。只好对源代码进行修改,步骤如下:
step1.修改cxXLSExport.TcxXLSExportProvider.SetCellValue
varDouble:
SetCellDataDouble(ACol, ARow, AValue);
varCurrency:
SetCellDataCurrency(ACol, ARow, AValue);
改为:
varDouble,varCurrency:
SetCellDataDouble(ACol, ARow, AValue);
step2.重新编译cxExportVCLD7.dpk
改完重新编译工程,果然生效!!!