技巧教程:数据集导出excel时进行重组
前阵子,一个同学让我分析两份数据以及一段Dephi编写的代码,他自己已初步实现了从数据集到Excel的导出,但没有实现换行以及出现了除第一列外其余列均缺少一行记录的问题。因此希望我帮忙完成将同时将一个生产单上的多个产品编码的配置情况导入到同一个excel中的算法。其初始数据(在数据集中)大体如下:
订单编号 名称 属性编码 属性值
0000001 A基础信息 功能 单功能
0000001 A基础信息 外观 WG
0000001 B结构技术要求 内部颜色 白色
0000001 B结构技术要求 外部颜色 红色
0000001 C其他技术要求 分级 A类
0000001 D参数信息 X 100
0000001 D参数 Y 200
最终效果数据(在Excel中显示):
A基础信息 B结构技术要求 C其他技术要求
功能:单功能 内部颜色:白色 分级:A类
外观:WG 外部颜色:红色
D参数信息
X:100
Y:200
根据初始图以及最终效果显示,Excel以每3列换行,并实现不同名称的属性码及属性值的获取。源码如下:
tRow :=3;----由于有Excel表头信息,因此实际从第三行起实现,存放的是名称
iRow :=tRow+1;---设置初始的属性信息的起始行
Max :=iRow;---获取处于同行名称中属性信息量最大值
iCol :=1; -----列
cdsViewCPDConfigInfl.First;---将记录集移至第一行,其中记录集是按照名称进行排序的
strcpd :=cdsViewCPDConfigInfl.fieldbyname('名称').asstring;---获取当前记录集中名称值并存放在变量中,以便后期的比较归类
cdsViewCPDConfigInfl.Eof do
begin
//在组名称相同的情况下写该组下的行数据
if cdsViewCPDConfigInfl.fieldbyname(名称).asstring = strcpd then
begin
eclapp2.WorkSheets[i].cells[tRow, iCol].value := cdsViewCPDConfigInfl.fieldbyname(名称).asstring ;//写组名
eclapp2.WorkSheets[i].cells[iRow, iCol].value := cdsViewCPDConfigInfl.fieldbyname(属性编码).asstring +
':' + cdsViewCPDConfigInfl.fieldbyname(属性值).asstring;
INC(iRow);
end
else //分组换列
begin
if iRow>Max then
Max :=iRow+1; ---获取最大的行值
if iCol>3 then ----判断列值,当列为4,进行换行
begin
tRow :=Max; ----换行时,首先获取最新组名的起始行
iCol :=0; ----同时将列置为0
end;
iRow :=tRow+1; ----设置新组名属性信息的起始行
eclapp2.WorkSheets[i].cells[tRow, iCol+1].value := cdsViewCPDConfigInfl.fieldbyname('GROUPNAME').asstring ;//写组名称
eclapp2.WorkSheets[i].cells[iRow, iCol+1].value := cdsViewCPDConfigInfl.fieldbyname('ATTR_NUMBER').asstring +
':' + cdsViewCPDConfigInfl.fieldbyname('ATTR_VALUE').asstring; //写属性名跟属性值
INC(iRow); ----行数叠加
INC(iCol); -----列数叠加
end ;
cdsViewCPDConfigInfl.Next;
end;
注:在换列时,起初由于单纯的以为只需要进行列数叠加,使得除第一列以外的所有列均少了一行属性信息。INC(iRow)是必须的;在列达到3换行时,所以将icol设置为0,是考虑到不换行时iCol为加一。
在此附上Dephi以及VB编写的主要源码,见附件。我想关于下面的代码,也许有待于改善,请提出意见或建议