如题!导出到EXCEL以后能跟源dbgrideh的多表格头一样.高手请进!

解决方案 »

  1.   

    盒子上的一个解决方案
    把自己的解决法子说一下,虽然解决的不是很完美,缺少单元格合并和字体设置。
    我重写了单元DBGridEhImpExp中的函数TDBGridEhExportAsXLS.WriteTitle
    希望有高手继续完善这个函数,让之最终导出的Excel格式和Elib一样。
    //------------------------------------------------------------------
    procedure TDBGridEhExportAsXLS.WriteTitle(ColumnsList: TColumnsEhList);
    var
      i, k: Integer;
      FPTitleExpArr: TTitleExpArr;
      ListOfHeadTreeNodeList: TList;
      ColSpan, RowSpan: Integer;
      str1:String;
      L: Word;  //writestringcell
    begin
      if ColumnsList.Count = 0 then
        Exit;  if DBGridEh.UseMultiTitle then
      begin
        try
          CreateMultiTitleMatrix(DBGridEh, ColumnsList, FPTitleExpArr, ListOfHeadTreeNodeList);
          //输出除最后一行表头的内容
          for k := ListOfHeadTreeNodeList.Count - 1 downto 1 do
          begin
            for i := 0 to ColumnsList.Count - 1 do
            begin
              if THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[k]).Items[i]) <> nil then
              begin
                CalcSpan(ColumnsList, ListOfHeadTreeNodeList, k, i, ColSpan, RowSpan);
                str1:=THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[k]).Items[i]).Text;
                //=====================================
                L := Length(str1);
                CXlsLabel[1] := 8 + L;
                CXlsLabel[2] := FRow;
                CXlsLabel[3] := FCol;
                CXlsLabel[5] := L;
                StreamWriteWordArray(Stream, CXlsLabel);
                StreamWriteAnsiString(Stream, str1);
                if FCol = ExpCols.Count - 1 then
                begin
                  Inc(FRow);
                  FCol := 0;
                end
                else
                  FCol:=FCol+ColSpan;
                //=====================================
              end;
            end;
          end;
          FRow := ListOfHeadTreeNodeList.Count - 1;
          FCol :=0;
          //输出最后一行表头
          for i := 0 to ColumnsList.Count - 1 do
          begin
            if THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[0]).Items[i]) <> nil then
            begin
              CalcSpan(ColumnsList, ListOfHeadTreeNodeList, 0, i, ColSpan, RowSpan);
              str1:=THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[0]).Items[i]).Text;
              //WriteStringCell(str1);
              //==================================
              L := Length(str1);
              CXlsLabel[1] := 8 + L;
              CXlsLabel[2] := FRow;
              CXlsLabel[3] := FCol;
              CXlsLabel[5] := L*ColSpan;
              StreamWriteWordArray(Stream, CXlsLabel);
              StreamWriteAnsiString(Stream, str1);
              if FCol = ExpCols.Count - 1 then
              begin
                Inc(FRow);
                FCol := 0;
              end
              else
                FCol:=FCol+ColSpan;
              //==================================
            end
            else
            begin
              Inc(FCol);//单云格进一
            end;
          end;
          FRow:=ListOfHeadTreeNodeList.Count;
          FCol:=0;
        finally
          for i := 0 to ListOfHeadTreeNodeList.Count - 1 do
            TList(ListOfHeadTreeNodeList.Items[i]).Free;
          ListOfHeadTreeNodeList.Free;
        end;
      end
      else   //不使用多表头
      begin
        for i := 0 to ColumnsList.Count - 1 do
        begin
          WriteStringCell(ColumnsList[i].Title.Caption);
        end;
      end;
    end;
    //------------------------------------------------------------------
      

  2.   

    我的办法是先导出Excel,然后在Excel中处理
      

  3.   

    3层表头时,如果有某几个字段2层,是第一层占2层,还是第2层占2层,也要考虑,自己写代码在Excel中可以处理的