我重写了TDBGridEhExportAsXLS.WriteTitle函数,到合并单元格的时候不会写了(技术有点洼),思路也有了,请大家帮我完善一下,相信对大家都有用的。谢谢!
procedure TDBGridEhExportAsXLS.WriteTitle(ColumnsList: TColumnsEhList);
var
 i, k,m: Integer;
  TitleStr:String;
  Function GetTitleRow:Integer;//获取表头最大层数
  var
   i, k,m: Integer;
    MaxRow,Row:Integer;
  begin
    MaxRow:=1;
    for i:=0 to ColumnsList.count-1 do
      begin
        Row:=1;
        m:=0;
        for j:=0 to Length(ColumnsList[i].Title.caption)-2 do
          begin
            if (ColumnsList[i].Title.Caption[j]='|') and ((j-m)>0) and
              (ColumnsList[i].Title.Caption[j+1]<>'|') then
              begin
                Inc(Row);
                m:=j+1;
              end;
          end;
        if MaxRow<Row then
          MaxRow:=Row;
      end;
    Result:=MaxRow;
  end; 
begin
 if (DBGridEh.UseMultiTitle=false) or (GetTitleRow=1) then
   begin
    for i := 0 to ColumnsList.Count - 1 do
      begin
       WriteStringCell(ColumnsList[i].Title.Caption);
      end;
   end
  else
    begin
      for i:=0 to ColumnsList.Count-1 do
        begin
          Frow:=0;
          TitleStr:='';
          m:=0;
          for j:=0 to Length(ColumnsList[i].Title.caption)-2 do//写表头
          begin
            if (ColumnsList[i].Title.Caption[j]='|') and ((j-m)>0) and //写非最后一行表头
              (ColumnsList[i].Title.Caption[j+1]<>'|') then
              begin
                WriteStringCell(TitleStr);
                if i=ColumnsList.count-1 then
                  begin
                    Fcol:=i;
                  end
                else
                  begin
                    Fcol:=Fcol-1;
                    Inc(Frow);
                  end;
                m:=j+1;
                TitleStr:='';
              end
            else
              begin
                TitleStr:=TitleStr+ColumnsList[i].Title.Caption[j];
              end;
          end;
          Frow:=GetTitleRow-1;
          TitleStr:=TitleStr+ColumnsList[i].Title.Caption[j];
          WriteStringCell(TitleStr); //写最后一行表头         
        end;
      
      begin
        //此处为:按行从左到又合并相临的不为空的内容相同的单元格
      end;
      begin
        //此处为:按列从下到上将内容不为空的单元格和它上面内容为空的单元格合并
      end;
      Fcol:=0;
      Frow:=GetTitleRow;
    end;
end;

解决方案 »

  1.   

    不好意思,还是不打明白你要做什么,
    合并,一般是你计算后得到一个 range ,让后 range.select
    然后,range.merge 就可合并了
      

  2.   

    我的意思是要解决DBGRIDEH导出到EXCEL时的多表头问题,它自带的功能不能解决复杂表头,而是导出到一个单元格中。不知道这样大家明白了吗?
      

  3.   

    xinling195(闲趣)
    让我看那个是什么意思,给我100000000000000个号也解决不了我的问题啊,别来捣乱!!
      

  4.   

    你是不是要用  把显示出来的记录导出来啊   你可以DBGridEh 这个控件  这个控件 在EHLIB   是不是把这些记录导成到EXECL里面啊 我有例子  如果想要的话 就给我发个消息 不知道好不好  我的QQ:303773235  邮箱:[email protected]