起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: dragonsoft

【搞定】带分组的表格文档 导出为 excel??**

[复制链接]
 楼主| 发表于 2007-4-6 20:48:19 | 显示全部楼层
明天呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-9 08:52:17 | 显示全部楼层
今天要解决呀..
不然客户那边顶不住了..
回复 支持 反对

使用道具 举报

发表于 2007-4-9 11:10:43 | 显示全部楼层
资源包已经在邮箱中收到了,不过今天应该给不了结果了,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-9 11:37:15 | 显示全部楼层
那明天上午能否给个结果?这边用户催的很紧,快顶不住了。。。
另外,该报表最后一列“电话”,另存为excel文件,则无法显示,在程序窗口能显示,请一并解决这个问题,谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-10 08:58:10 | 显示全部楼层
今天可以给结果吗,用户早上又在催啦,希望能尽快解决。很急.........
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-11 10:08:23 | 显示全部楼层
楼长,问题解决的怎样啊,客户急着等交代。什么时候可以答复啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-12 09:39:47 | 显示全部楼层
up
今天周四了,该bug处理的如何了?管理员能否给个答复?啥时候能解决?
回复 支持 反对

使用道具 举报

发表于 2007-4-12 10:15:20 | 显示全部楼层
现在给不了一个准确的答复,我们现在已经在跟踪了,一有进展马上跟贴告知

但问题的解决是需要双方配合的,且是有计划安排的,3.27给的资源包,4月6号才给我们反馈,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-12 11:13:23 | 显示全部楼层
你们4月6号收到邮件,不也是到今天也没给一个明确答复?既然需要双方配合,那就不要互相责怪啦。但是你如果无法给个明确答复,至少得尽快给个大概的答复,我们这边也好答复客户。毕竟我们这个项目非常赶,不能再拖了,拜托你们了!呵呵
回复 支持 反对

使用道具 举报

发表于 2007-4-13 17:53:29 | 显示全部楼层
unit SHEETDOCLIB;

interface

uses
  Business.System, Business.Model, Business.Forms, Business.Data;

type
  TSHEETDOCLIB = class(TBizLibrary)
  private
    static procedure InitExpr(ASheet: TSheet; AArea: TSheetArea; AStatistician: TDBSheetStatistician);
  public
    {public declarations}
    static procedure CopySheet(ASrcDoc: TSheetDoc; ADstSheet: TSheet); overload;
    static procedure CopySheet(ASrcDoc, ADstDoc: TSheetDoc); overload;
    static procedure CopySheet(ASrcDocView, ADstDocView: TDocView); overload;

    static procedure CopySheetToExcel(ASrcDoc: TSheetDoc; AFileName: string); overload;
    static procedure CopySheetToExcel(ASrcDocView: TDocView; AFileName: string); overload;

    static procedure CopySheetToExcel(ASrcDoc: TSheetDoc; AFileName: string; const AOutDisplayText: Boolean); overload;
    static procedure CopySheetToExcel(ASrcDocView: TDocView; AFileName: string; const AOutDisplayText: Boolean); overload;

    static procedure CopyArea(ASrcSheet, ADstSheet: TSheet; AArea: TSheetArea; const ALeft, ARight: Integer; var ARowOffset: Integer);
    static procedure CopyAreaSection(ASrcSheet, ADstSheet: TSheet; ARect: TRect; const ALeft, ATop, ARowOffset: Integer);
  end;

  TGroupValue = class(TObject)
  public
    FieldName: string;
    OldValue: string;
    NewValue: string;
    Left, Right, Top, Bottom: integer;
    Offset: integer;
    Statistician: TDBSheetStatistician;
  end;


implementation


static procedure TSHEETDOCLIB.InitExpr(ASheet: TSheet; AArea: TSheetArea; AStatistician: TDBSheetStatistician);
var
  I, J: integer;
begin
  AStatistician.InitAreaCells(AArea);
  for I := AArea.Left to AArea.Right - 1 do
    for J := AArea.Top to AArea.Bottom - 1 do
      if ASheet.PeekCells[I, J] is TExprCell then
        TExprCell(ASheet.PeekCells[I, J]).Statistician := AStatistician;
end;

static procedure TSHEETDOCLIB.CopySheet(ASrcDoc: TSheetDoc; ADstSheet: TSheet);
var
  I: Integer;
  lDstSheet, lSrcSheet: TSheet;
  lArea: TSheetArea;
  lRowOffset: Integer;
  lMiddleTop, lMiddleBottom, lLeft, lRight: Integer;
begin
    lSrcSheet := ASrcDoc.Sheet;
    lDstSheet := ADstSheet;

    lDstSheet.RowCount := lSrcSheet.RowCount;
    lDstSheet.ColCount := lSrcSheet.ColCount;
    for I := 0 to lSrcSheet.ColCount - 1 do
      lDstSheet.ColWidths[I] := lSrcSheet.ColWidths[I];

    lRowOffset := 0;
    lMiddleTop := 0;
    lLeft := 0;
    lRight := lSrcSheet.ColCount - 1;
    for I := 0 to lSrcSheet.Areas.Count - 1 do
    begin
      lArea := lSrcSheet.Areas.Items[I];
      lMiddleBottom := lArea.Top - 1;
      CopyAreaSection(lSrcSheet, lDstSheet, Types.Rect(lLeft, lMiddleTop, lRight + 1, lMiddleBottom + 1),
        lLeft, lMiddleTop, lRowOffset);
      CopyArea(lSrcSheet, lDstSheet, lArea, 0, lSrcSheet.ColCount - 1, lRowOffset);
      lMiddleTop := lArea.Bottom;
    end;
    lMiddleBottom := lSrcSheet.RowCount - 1;
    CopyAreaSection(lSrcSheet, lDstSheet, Types.Rect(lLeft, lMiddleTop, lRight + 1, lMiddleBottom + 1),
      lLeft, lMiddleTop, lRowOffset);
end;

static procedure TSHEETDOCLIB.CopySheet(ASrcDoc, ADstDoc: TSheetDoc);
var
  I: Integer;
  lDstSheet, lSrcSheet: TSheet;
  lArea: TSheetArea;
  lRowOffset: Integer;
  lMiddleTop, lMiddleBottom, lLeft, lRight: Integer;
begin
    lSrcSheet := ASrcDoc.Sheet;
    lDstSheet := ADstDoc.Sheet;

    lDstSheet.RowCount := lSrcSheet.RowCount;
    lDstSheet.ColCount := lSrcSheet.ColCount;
    for I := 0 to lSrcSheet.ColCount - 1 do
      lDstSheet.ColWidths[I] := lSrcSheet.ColWidths[I];

    lRowOffset := 0;
    lMiddleTop := 0;
    lLeft := 0;
    lRight := lSrcSheet.ColCount - 1;
    for I := 0 to lSrcSheet.Areas.Count - 1 do
    begin
      lArea := lSrcSheet.Areas.Items[I];
      lMiddleBottom := lArea.Top - 1;
      CopyAreaSection(lSrcSheet, lDstSheet, Types.Rect(lLeft, lMiddleTop, lRight + 1, lMiddleBottom + 1),
        lLeft, lMiddleTop, lRowOffset);
      CopyArea(lSrcSheet, lDstSheet, lArea, 0, lSrcSheet.ColCount - 1, lRowOffset);
      lMiddleTop := lArea.Bottom;
    end;
    lMiddleBottom := lSrcSheet.RowCount - 1;
    CopyAreaSection(lSrcSheet, lDstSheet,Types.Rect(lLeft, lMiddleTop, lRight + 1, lMiddleBottom + 1),
      lLeft, lMiddleTop, lRowOffset);
end;
static procedure TSHEETDOCLIB.CopySheet(ASrcDocView, ADstDocView: TDocView);
var
  I: Integer;
  lDstSheet, lSrcSheet: TSheet;
  lArea: TSheetArea;
  lRowOffset: Integer;
  lMiddleTop, lMiddleBottom, lLeft, lRight: Integer;
begin
    lSrcSheet := TSheetDoc(ASrcDocView.Doc).Sheet;
    lDstSheet := TSheetDoc(ADstDocView.Doc).Sheet;

    lDstSheet.RowCount := lSrcSheet.RowCount;
    lDstSheet.ColCount := lSrcSheet.ColCount;
    for I := 0 to lSrcSheet.ColCount - 1 do
      lDstSheet.ColWidths[I] := lSrcSheet.ColWidths[I];

    lRowOffset := 0;
    lMiddleTop := 0;
    lLeft := 0;
    lRight := lSrcSheet.ColCount - 1;
    for I := 0 to lSrcSheet.Areas.Count - 1 do
    begin
      lArea := lSrcSheet.Areas.Items[I];
      lMiddleBottom := lArea.Top - 1;
      CopyAreaSection(lSrcSheet, lDstSheet, Types.Rect(lLeft, lMiddleTop, lRight + 1,lMiddleBottom + 1),
        lLeft, lMiddleTop, lRowOffset);
      CopyArea(lSrcSheet, lDstSheet, lArea, 0, lSrcSheet.ColCount - 1, lRowOffset);
      lMiddleTop := lArea.Bottom;
    end;
    lMiddleBottom := lSrcSheet.RowCount - 1;
    CopyAreaSection(lSrcSheet, lDstSheet, Types.Rect(lLeft, lMiddleTop, lRight + 1,lMiddleBottom + 1),
      lLeft, lMiddleTop, lRowOffset);
end;

static procedure TSHEETDOCLIB.CopySheetToExcel(ASrcDoc: TSheetDoc; AFileName: string);
var
  lDstSheet: TSheet;
  lExcelExp: TExcelExporter;
begin
  lDstSheet := TSheet.Create(nil);
  lExcelExp := TExcelExporter.Create(lDstSheet);
  try
    CopySheet(ASrcDoc, lDstSheet);
    lExcelExp.ExportToFile(AFileName);
  finally
    lExcelExp.Free;
    lDstSheet.Free;
  end;
end;

static procedure TSHEETDOCLIB.CopySheetToExcel(ASrcDocView: TDocView; AFileName: string);
var
  lDstSheet: TSheet;
  lExcelExp : TExcelExporter;
begin
  lDstSheet := TSheet.Create(nil);
  lExcelExp := TExcelExporter.Create(lDstSheet);
  try
    CopySheet(TSheetDoc(ASrcDocView.Doc), lDstSheet);
    lExcelExp.ExportToFile(AFileName);
  finally
    lExcelExp.Free;
    lDstSheet.Free;
  end;
end;

static procedure TSHEETDOCLIB.CopySheetToExcel(ASrcDoc: TSheetDoc; AFileName: string; const AOutDisplayText: Boolean);
var
  lDstSheet: TSheet;
  lExcelExp: TExcelExporter;
begin
  lDstSheet := TSheet.Create(nil);
  lExcelExp := TExcelExporter.Create(lDstSheet);
  try
    CopySheet(ASrcDoc, lDstSheet);
    {老版本如果编译不过下面此语句,先注释掉
    但会有:Sheet导出到Excel表现和Sheet表现不一致。(200610032001)。}
    lExcelExp.OutDisplayText := AOutDisplayText;
    lExcelExp.ExportToFile(AFileName);
  finally
    lExcelExp.Free;
    lDstSheet.Free;
  end;
end;

static procedure TSHEETDOCLIB.CopySheetToExcel(ASrcDocView: TDocView; AFileName: string; const AOutDisplayText: Boolean);
var
  lDstSheet: TSheet;
  lExcelExp : TExcelExporter;
begin
  lDstSheet := TSheet.Create(nil);
  lExcelExp := TExcelExporter.Create(lDstSheet);
  try
    CopySheet(TSheetDoc(ASrcDocView.Doc), lDstSheet);
    {老版本如果编译不过下面此语句,先注释掉
    但会有:Sheet导出到Excel表现和Sheet表现不一致。(200610032001)。}
    lExcelExp.OutDisplayText := AOutDisplayText;
    lExcelExp.ExportToFile(AFileName);
  finally
    lExcelExp.Free;
    lDstSheet.Free;
  end;
end;

(*******************************原函数**********************************************
static procedure TSHEETDOCLIB.CopyArea(ASrcSheet, ADstSheet: TSheet; AArea:TSheetArea;
  const ALeft, ARight: Integer; var ARowOffset: Integer);
var
  I: Integer;
  lUpsBottom, lDownsTop: Integer;
  lDataAreaHeight: Integer;
  lDataSet: TDataSet;
  lOutRecCount: Integer;
  lMiddleTop, lMiddleBottom: Integer;
  lArea: TSheetArea;
begin
  {数据集区域输出}
  if Business.Forms.jsGrids.AreaClass2Type(AArea) = TAreaType.atDBArea then
  begin
    lDataset := TDataSheet(ASrcSheet).FindDataSet(TDataSheetArea(AArea).DataSetDefID);
    lUpsBottom := AArea.Top + AArea.HeaderRows + AArea.PageHeaderRows + AArea.GroupHeaderRows + 1;
    CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, AArea.Top, ARight,lUpsBottom),
      ALeft, AArea.Top, ARowOffset);
    if TDataSheetArea(AArea).PrintRange = TAreaPrintRange.aprAll then
    begin
      lOutRecCount := lDataSet.RecordCount;
      lDataSet.First;
    end
    else if TDataSheetArea(AArea).PrintRange = TAreaPrintRange.aprTopN then
    begin
      lOutRecCount := TDataSheetArea(AArea).TopNRecords;
      lDataSet.First;
    end
    else if TDataSheetArea(AArea).PrintRange = TAreaPrintRange.aprCurrent then
      lOutRecCount := 1
    else
      lOutRecCount := 0;
    lDataAreaHeight := TDataSheetArea(AArea).ClientHeight;
    repeat
      lMiddleTop := AArea.Top + AArea.HeaderRows + AArea.PageHeaderRows + AArea.GroupHeaderRows;
      for I := 0 to AArea.SubAreas.Count - 1 do
      begin
        lArea := AArea.SubAreas.Items[I];
        lMiddleBottom := lArea.Top ;
        CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, lMiddleTop, ARight, lMiddleBottom),
          ALeft, lMiddleTop, ARowOffset);
        CopyArea(ASrcSheet, ADstSheet, lArea, ALeft, ARight, ARowOffset);
        lMiddleTop := lArea.Bottom;
      end;
      lMiddleBottom := AArea.Bottom;
      CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, lMiddleTop, ARight, lMiddleBottom),
        ALeft, lMiddleTop, ARowOffset);

      lDataSet.Next;
      ARowOffset := ARowOffset + lDataAreaHeight;
      ADstSheet.RowCount := ASrcSheet.RowCount + ARowOffset;
      Dec(lOutRecCount);
    until lDataSet.Eof or (lOutRecCount < 1);
    ARowOffset := ARowOffset - lDataAreaHeight;
    ADstSheet.RowCount := ASrcSheet.RowCount + ARowOffset;

    lDownsTop := AArea.Bottom-AArea.FooterRows-AArea.PageFooterRows-AArea.GroupFooterRows;
    CopyAreaSection(ASrcSheet,ADstSheet,Types.Rect(ALeft,lDownsTop,ARight,AArea.Bottom),
      ALeft, lDownsTop,ARowOffset);
  end;
  {决策区域输出}
  if Business.Forms.jsGrids.AreaClass2Type(AArea) = TAreaType.atDCArea then
  begin
    //决策数据集区域会遇到列偏移的问题
    raise Exception.Create('暂不支持决策数据集区域的输出!');
  end;
  {矩形区域输出}
  if Business.Forms.jsGrids.AreaClass2Type(AArea) = TAreaType.atRect then
  begin
    lMiddleTop := AArea.Top;
    for I := 0 to AArea.SubAreas.Count - 1 do
    begin
      lArea := AArea.SubAreas.Items[I];
      lMiddleBottom := lArea.Top - 1;
      CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, lMiddleTop, ARight + 1, lMiddleBottom + 1),
        ALeft, lMiddleTop, ARowOffset);
      CopyArea(ASrcSheet, ADstSheet, lArea, ALeft, ARight, ARowOffset);
      lMiddleTop := lArea.Bottom;
    end;
    lMiddleBottom := AArea.Bottom;
    CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, lMiddleTop, ARight + 1, lMiddleBottom + 1),
      ALeft, lMiddleTop, ARowOffset);
  end;
end;

********************************************************************************************)
//(******************************支持分组融合的新函数***************************************
static procedure TSHEETDOCLIB.CopyArea(ASrcSheet, ADstSheet: TSheet; AArea:TSheetArea;
  const ALeft, ARight: Integer; var ARowOffset: Integer);
var
  I, J, T: Integer;
  lUpsBottom, lDownsTop: Integer;
  lDataAreaHeight: Integer;
  lDataSet: TDataSet;
  lOutRecCount: Integer;
  lMiddleTop, lMiddleBottom: Integer;
  lArea: TSheetArea;

  lChangedGroup, lNonChangedGroup,
  lChangedGroupLine,
  lChangedGroupTop: integer;
  lGroupDefs: TSheetGroupDefs;
  lGroupValue: TGroupValue;
  lGroupValueList: TObjectList;

  lCol, lRow: integer;
  lLeft, lTop, lRight, lBottom,
  lGoupOutCount,
  lGoupOffset: integer;

  lStatistician: TDBSheetStatistician;
begin
  {数据集区域输出}
  if Business.Forms.jsGrids.AreaClass2Type(AArea) = TAreaType.atDBArea then
  begin
    lGroupValueList := TObjectList.Create;
    lStatistician := TDBSheetStatistician.Create(nil);
    lGoupOutCount := 0;
    lGroupDefs := TDataSheetArea(AArea).GroupDefs;
    lStatistician.Sheet := TDataSheet(ASrcSheet);

    lDataset := TDataSheet(ASrcSheet).FindDataSet(TDataSheetArea(AArea).DataSetDefID);
    lUpsBottom := AArea.Top + AArea.HeaderRows + AArea.PageHeaderRows + AArea.GroupHeaderRows;
    CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, AArea.Top, ARight,lUpsBottom),
      ALeft, AArea.Top, ARowOffset);

    if TDataSheetArea(AArea).PrintRange = TAreaPrintRange.aprAll then
    begin
      lOutRecCount := lDataSet.RecordCount;
      lDataSet.First;
    end
    else if TDataSheetArea(AArea).PrintRange = TAreaPrintRange.aprTopN then
    begin
      lOutRecCount := TDataSheetArea(AArea).TopNRecords;
      lDataSet.First;
    end
    else if TDataSheetArea(AArea).PrintRange = TAreaPrintRange.aprCurrent then
      lOutRecCount := 1
    else
      lOutRecCount := 0;
    lDataAreaHeight := TDataSheetArea(AArea).ClientHeight;
    {初始化分组字段值}
    for I := 0 to lGroupDefs.Count - 1 do
    begin
      lGroupValue := TGroupValue.Create;
      lGroupValue.FieldName := lGroupDefs.Items[I].GroupFieldName;
      lGroupValue.OldValue := lDataSet.FieldByName(lGroupValue.FieldName).AsString;
      lGroupValue.NewValue := lDataSet.FieldByName(lGroupValue.FieldName).AsString;;
      lGroupValue.Left := -1;
      lGroupValue.Top := -1;
      lGroupValue.Right := -1;
      lGroupValue.Bottom := -1;
      lGroupValue.Offset := 0;
      lGroupValue.Statistician := lStatistician;
      {仅能处理每个分组的一个融合}
      if lGroupDefs.Items[I].CellUnionDefs.Count > 0 then
      begin
        lGroupValue.Left := AArea.ClientRect.Left + lGroupDefs.Items[I].CellUnionDefs.Items[0].Col;
        lGroupValue.Top := AArea.ClientRect.Top;
        lGroupValue.Right := AArea.ClientRect.Right;
        lGroupValue.Bottom := AArea.ClientRect.Bottom;
      end;
      lGroupValueList.Add(lGroupValue);
    end;
    {初始化分组汇总值计算相关}
    for I := 0 to lGroupDefs.Count - 1 do
      lStatistician.ClearData(AArea, TStatType.stAll, I);
    InitExpr(ASrcSheet, AArea, lStatistician);

    repeat
      lMiddleTop := AArea.Top + AArea.HeaderRows + AArea.PageHeaderRows + AArea.GroupHeaderRows;
      for I := 0 to AArea.SubAreas.Count - 1 do
      begin
        lArea := AArea.SubAreas.Items[I];
        lMiddleBottom := lArea.Top ;
        CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, lMiddleTop, ARight, lMiddleBottom),
          ALeft, lMiddleTop, ARowOffset);
        CopyArea(ASrcSheet, ADstSheet, lArea, ALeft, ARight, ARowOffset);
        lMiddleTop := lArea.Bottom;
      end;

      {分组支持}
      lNonChangedGroup := -1;
      lChangedGroup := -1;
      for I := 0 to lGroupValueList.Count - 1 do
      begin
        lGroupValue := TGroupValue(lGroupValueList[I]);
        lGroupValue.NewValue := lDataSet.FieldByName(lGroupValue.FieldName).AsString;
        if (lGroupValue.NewValue <> lGroupValue.OldValue) and (lNonChangedGroup = -1)then
        begin
          lNonChangedGroup := I;
          lChangedGroup := lGroupValueList.Count - lNonChangedGroup;
        end;
      end;
      if lChangedGroup > 0 then
      begin
        {复制组尾--}
        lChangedGroupLine := 0;
        for I := lNonChangedGroup to lGroupValueList.Count - 1 do
          lChangedGroupLine := lChangedGroupLine + lGroupDefs.Items[I].GroupFooterRows;
        if lChangedGroupLine > 0 then
        begin
          lChangedGroupTop := AArea.Bottom - AArea.FooterRows- AArea.PageFooterRows - lChangedGroupLine;
          CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, lChangedGroupTop, ARight, lChangedGroupTop + lChangedGroupLine),
            ALeft, lChangedGroupTop, ARowOffset - 1);{ -1 ??}
        end;
        ARowOffset := ARowOffset + lChangedGroupLine;
        {--复制组尾}
        if lChangedGroupLine > 0 then
          for I := lNonChangedGroup to lGroupValueList.Count - 1 do
          begin
            lGroupValue := TGroupValue(lGroupValueList[I]);
            lGroupValue.Top := lGroupValue.Top + lGroupValue.Offset;
            lGroupValue.Bottom := lGroupValue.Bottom + lGroupValue.Offset;
            lGroupValue.Offset := 1;
          end;
        {复制组头--}
        lChangedGroupLine := 0;
        for I := lNonChangedGroup to lGroupDefs.Count - 1 do
          lChangedGroupLine := lChangedGroupLine + lGroupDefs.Items[I].GroupHeaderRows;
        if lChangedGroupLine > 0 then
        begin
          lChangedGroupTop := lUpsBottom - lChangedGroupLine;
          CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, lChangedGroupTop, ARight, lChangedGroupTop + lChangedGroupLine),
            ALeft, lUpsBottom, ARowOffset);
        end;
        ARowOffset := ARowOffset + lChangedGroupLine;
        {--复制组头}
        if lChangedGroupLine > 0 then
          for I := lNonChangedGroup to lGroupValueList.Count - 1 do
          begin
            lGroupValue := TGroupValue(lGroupValueList[I]);
            lGroupValue.Top := lGroupValue.Top + lGroupValue.Offset;
            lGroupValue.Bottom := lGroupValue.Bottom + lGroupValue.Offset;
            lGroupValue.Offset := 1;
          end;
        {重置分组汇总初始值}
        for I := lNonChangedGroup to lGroupValueList.Count - 1 do
        begin
          lGroupValue := TGroupValue(lGroupValueList[I]);
          lGroupValue.Statistician.ClearData(AArea, TStatType.stGroup, I);
        end;
      end;
      {分组支持}
      lStatistician.ProcessRecord(AArea);{计算汇总值, 注意需要在分组输出后计算,否则分组的汇总值会出错。}
      lMiddleTop := AArea.ClientRect.Top;
      lMiddleBottom := AArea.ClientRect.Bottom;
      CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, lMiddleTop, ARight, lMiddleBottom),
        ALeft, lMiddleTop, ARowOffset);
      lGoupOutCount := lGoupOutCount + 1;
      Dec(lOutRecCount);
      ARowOffset := ARowOffset + lDataAreaHeight;
      ADstSheet.RowCount := ASrcSheet.RowCount + ARowOffset;

      {分组支持}
      for I := 0 to lGroupValueList.Count - 1 do
      begin
        lGroupValue := TGroupValue(lGroupValueList[I]);
        if (lGroupValue.NewValue = lGroupValue.OldValue) then
        begin
          lCol := lGroupDefs.Items[I].CellUnionDefs.Items[0].Col + AArea.Left;
          lRow := lGroupValue.Top;
          lBottom := lGroupValue.Bottom;
          lLeft := ADstSheet.Cells[lCol, lRow].Bounds.Left;
          lRight := ADstSheet.Cells[lCol, lRow].Bounds.Right;
          ADstSheet.Cells[lCol, lRow].Bounds := Types.Rect(lLeft, lRow, lRight, lBottom + lGroupValue.Offset);
          lGroupValue.Offset := lGroupValue.Offset + 1;
        end
        else
        begin
          for J := I to lGroupValueList.Count - 1 do
          begin
            lGroupValue := TGroupValue(lGroupValueList[J]);
            lGroupValue.OldValue := lGroupValue.NewValue;
            lGroupValue.Top := lGroupValue.Top + lGroupValue.Offset;
            lGroupValue.Bottom := lGroupValue.Bottom + lGroupValue.Offset;
            lGroupValue.Offset := 1;
          end;
          lChangedGroup := lGroupValueList.Count - I;
          break;
        end;
      end;
      {分组支持}
      lDataSet.Next;
    until lDataSet.Eof or (lOutRecCount < 1);
    ARowOffset := ARowOffset - lDataAreaHeight;
    ADstSheet.RowCount := ASrcSheet.RowCount + ARowOffset;

    lDownsTop := AArea.Bottom-AArea.FooterRows-AArea.PageFooterRows-AArea.GroupFooterRows;
    CopyAreaSection(ASrcSheet,ADstSheet,Types.Rect(ALeft,lDownsTop,ARight,AArea.Bottom),
      ALeft, lDownsTop, ARowOffset);
    lGroupValueList.Free;
    lStatistician.Free;
  end;
  {决策区域输出}
  if Business.Forms.jsGrids.AreaClass2Type(AArea) = TAreaType.atDCArea then
  begin
    //决策数据集区域会遇到列偏移的问题
    raise Exception.Create('暂不支持决策数据集区域的输出!');
  end;
  {矩形区域输出}
  if Business.Forms.jsGrids.AreaClass2Type(AArea) = TAreaType.atRect then
  begin
    lMiddleTop := AArea.Top;
    for I := 0 to AArea.SubAreas.Count - 1 do
    begin
      lArea := AArea.SubAreas.Items[I];
      lMiddleBottom := lArea.Top - 1;
      CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, lMiddleTop, ARight + 1, lMiddleBottom + 1),
        ALeft, lMiddleTop, ARowOffset);
      CopyArea(ASrcSheet, ADstSheet, lArea, ALeft, ARight, ARowOffset);
      lMiddleTop := lArea.Bottom;
    end;
    lMiddleBottom := AArea.Bottom;
    CopyAreaSection(ASrcSheet, ADstSheet, Types.Rect(ALeft, lMiddleTop, ARight + 1, lMiddleBottom + 1),
      ALeft, lMiddleTop, ARowOffset);
  end;
end;
//******************************************************************************************************)

static procedure TSHEETDOCLIB.CopyAreaSection(ASrcSheet, ADstSheet: TSheet; ARect: TRect;
  const ALeft, ATop, ARowOffset: Integer);
var
  I: Integer;
begin
    ADstSheet.CopyClientSection(ASrcSheet, ARect, ALeft, ATop + ARowOffset,
      False, False, TOutProp.opAll, False);
    for I := 0 to ARect.Bottom - Arect.Top - 1 do
      ADstSheet.RowHeights[ATop + ARowOffset + I] := ASrcSheet.RowHeights[ATop + I];
end;

end.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-6-23 07:04 , Processed in 0.048173 second(s), 14 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表