数据集导出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;---获取当前记录集中名称值并存放在变量中,以便后期的比较归类
         while not 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编写的主要源码,见附件。我想关于下面的代码,也许有待于改善,请提出意见或建议


 

附:Dephi源码VB源码
posted @ 2008-12-03 10:00  水星人已隐匿  阅读(1676)  评论(0编辑  收藏  举报