我的方法是这样的
procedure ExportToExcelForGroup(Sender1: Tobject;s_Title,s_Info: string);
var
  MsExcel, MsExcelWorkBook, MsExcelWorkSheet: Variant;
  i, j, K: Integer;
  adv: TForm;
  lab: TProgressBar;
  s_RecordGroupOld,s_RecordGroupNew: string;
begin
  if (Sender1 as TCustomADODataSet).Active then
  begin
    try
      MsExcel := CreateOleObject('Excel.Application');
      MsExcelWorkBook := MsExcel.WorkBooks.Add(xlWBATWorksheet);
      MsExcelWorkBook.Title := 'asdfasdfsd';
      MsExcelWorkSheet := MsExcel.WorkSheets[1];
      //MsExcel.Visible := True;
      with (Sender1 as TCustomADODataSet) do
      begin //读取Grid Display Label 放入Execl
        for j := 0 to FieldCount - 3 do //length(Fields[j].DisplayLabel)
          MsExcelWorkSheet.Range[Chr(65+j)+'3'].Value:=Fields[j+1].DisplayLabel;
        first;
        /////////////////
        adv:=TForm.Create(nil);
        lab:=TProgressBar.Create(nil);
        try
          //动态显示进度窗口
          adv.Name:='AdvForm';
          Adv.Position:=poScreenCenter;
          adv.BorderStyle:=bsDialog;
          adv.FormStyle:=fsStayOnTop;
          adv.Height:=120;
          adv.Width:=320;
          adv.caption:='处理进度';
          adv.Visible:=true;          lab.Parent:=adv;
          lab.Top:=adv.Height div 2-20;
          lab.Left:=12;
          lab.Width:=adv.Width-30;
          lab.Visible:=true;
          lab.Max:=100;
          lab.min:=0;
          lab.Position:=0;
          /////////////////
          i := 4;
          s_RecordGroupOld := TCustomADODataSet(Sender1).Fields[0].AsString;
          MsExcelWorkSheet.Range[Chr(65+j)+'3'].Value:=s_RecordGroupOld;
          while not eof do
          begin //读取Grid Data Label 放入Execl
            s_RecordGroupNew := TCustomADODataSet(Sender1).Fields[0].AsString;
            if s_RecordGroupOld <> s_RecordGroupNew then
            begin
              inc(j);
              MsExcelWorkSheet.Range[Chr(65+j)+'3'].Value:=s_RecordGroupNew;
              s_RecordGroupOld := s_RecordGroupNew;
              i:=4;
            end;
            for K := 0 to FieldCount - 3 do //length(Fields[j].AsString)
              MsExcelWorkSheet.Range[Chr(65+K)+IntToStr(i)].Value:=Fields[K+1].AsString;
            MsExcelWorkSheet.Range[Chr(65+j)+IntToStr(i)].Value:=Fields[K+1].AsString;
            Inc(i);
            lab.position:=Longint(Trunc( ((recno+1) * 100) / (RecordCount) ));
            Application.ProcessMessages;
            Next;
          end;
          //合并单元格
          MsExcelWorkSheet.Range['a1',chr(65+j)+'1'].HorizontalAlignment := xlCenter;
          MsExcelWorkSheet.Range['a2',chr(65+j)+'2'].HorizontalAlignment := xlCenter;
          MsExcelWorkSheet.Range['a1',chr(65+j)+'1'].VerticalAlignment := xlBottom;
          MsExcelWorkSheet.Range['a2',chr(65+j)+'2'].VerticalAlignment := xlCenter;
          MsExcelWorkSheet.Range['a1',chr(65+j)+'2'].WrapText := False;
          MsExcelWorkSheet.Range['a1',chr(65+j)+'2'].Orientation := 0;
          MsExcelWorkSheet.Range['a1',chr(65+j)+'2'].AddIndent := False;
          MsExcelWorkSheet.Range['a1',chr(65+j)+'2'].ShrinkToFit := False;
          MsExcelWorkSheet.Range['a1',chr(65+j)+'2'].MergeCells := False;
          MsExcelWorkSheet.Range['a1',chr(65+j)+'2'].Merge(true);
          MsExcelWorkSheet.Range['a1'].Value := s_Title;
          MsExcelWorkSheet.Range['a2'].Value := s_Info;
          first;
        FINALLY
          lab.Free;
          adv.free;
        end;
      end;
    finally
      MsExcel.Visible := True;
    end;
  end;
end;

解决方案 »

  1.   

    Excel列的命名是: A~Z,AA~AZ,BA~BZ..你的程序代码没看出考虑了这一点
      

  2.   

    你的那种程序设计语言我不会写,我只知道你应该判断列号是否大于26,如果大于26,就再做处理.用SQL语句写出来就是这样:
    declare @col intset @col=2 --列号
    --转换处理
    select case when @col>26 then char(64+(@col-1)/26) else '' end
    +char(65+(@col-1)%26)set @col=28 --列号
    --转换处理
    select case when @col>26 then char(64+(@col-1)/26) else '' end
    +char(65+(@col-1)%26)