cxgrid导出数据的格式设置(转载)

在处理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

改完重新编译工程,果然生效!!!

原文地址:https://www.cnblogs.com/martian6125/p/9631093.html