导出时,先不要显示excel(MSExcel.Visible := False),结束时再显示(MSExcel.Visible := True;)

解决方案 »

  1.   


    这种方式我试过,如果在导出过程中,打开另一个EXCEL,导出的这个EXCEL就会显示出来,而且也有可能会报错。
      

  2.   

    应该是这一句MSExcel.Visible := True;的原因,我刚试了一下我刚做的一个导出程序,切换到其他的EXCEL或打开新的EXCEL都不会出现你说的问题
      

  3.   


    你是用的什么版本的Delphi和Excel??好像版本不同,出现的问题也不同。之前是用Delphi 7操作Excel,好像问题不多,而后来用Delphi 2010操作Excel,限制就多了。
      

  4.   


    这种方式我试过,如果在导出过程中,打开另一个EXCEL,导出的这个EXCEL就会显示出来,而且也有可能会报错。
    那改用NativeExcel。这种效率更高,不是调用MS或WPS提供的COM服务,几万条几秒就搞定。需要显示时,再调用Com服务打开。
      

  5.   


    这种方式我试过,如果在导出过程中,打开另一个EXCEL,导出的这个EXCEL就会显示出来,而且也有可能会报错。
    那改用NativeExcel。这种效率更高,不是调用MS或WPS提供的COM服务,几万条几秒就搞定。需要显示时,再调用Com服务打开。很感谢,我研究研究看,NativeExcel还不会用。
      

  6.   

    nativeExcel能动态处理格式化数据吗
      

  7.   


    代码不长,主要是从数据库中读数据来显示,数据库中记录数比较多,所以花费时间比较长。function TMainfrm.DBGrid2Excel(ADO: TDataset; DBGrid: TDBGrid; Title: String; PrintHide: Boolean = False;PageSize: String = 'A4';Orientation: Integer = 1): Variant;
    var
      MSExcel: Variant;
      i, j, Col: Integer;
      ColName, Str: String;
    begin
      if (ADO.Active = False) or (ADO.RecordCount = 0) then
      begin
        Mainfrm.ShowCustWarning('劑豢ㄐㄐㄐㄐ', GetSysMessage(ADOLog, 'ERRO00000019', SelectLanguage), False);
        Result := 0;
        Abort;
      end;
      try
        MSExcel := CreateOleObject('Excel.Application');
        MSExcel.Caption := Title;
        MSExcel.WorkBooks.Add;
        MSExcel.Visible := True;
        //MSExcel.ActiveSheet.Columns['R: R'].ColumnWidth := 10;
        i := 1;
        MSExcel.ActiveSheet.Cells[i, 1].Value := Title;
        i := 3;
        Col := 1;
        for j := 0 to DBGrid.Columns.Count - 1 do
          if (DBGrid.Columns[j].Visible = True) or (PrintHide) then
          begin
            MSExcel.ActiveSheet.Cells[i, Col].Value := DBGrid.Columns[j].Title.Caption;
            Inc(Col);
          end;
        ColName := GetCol(Col-1);    MSExcel.ActiveSheet.Range['a1', ColName + '1'].VerticalAlignment := xlCenter;
        MSExcel.ActiveSheet.Range['a1', ColName + '1'].HorizontalAlignment := xlCenter;
        MSExcel.ActiveSheet.Range['A1', ColName + '1'].MergeCells := True;    i := i + 1;
        Col := 1;
        ADO.First;
        while not ADO.Eof do
        begin
          for j := 0 to DBGrid.Columns.Count - 1 do
            if (DBGrid.Columns[j].Visible = True) or (PrintHide) then
            begin
              if ADO.FieldByName(DBGrid.Columns[j].FieldName).DataType IN [ftFloat, ftAutoInc, ftInteger, ftCurrency, ftSmallint, ftBCD] then
                 MSExcel.ActiveSheet.Cells[i, Col].Value := Trim(ADO.FieldByName(DBGrid.Columns[j].FieldName).AsString)
              else if ADO.FieldByName(DBGrid.Columns[j].FieldName).DataType IN [ftDateTime] then
              begin
                if ADO.FieldValues[DBGrid.Columns[j].FieldName] = Null then
                  MSExcel.ActiveSheet.Cells[i, Col].Value := Trim(ADO.FieldByName(DBGrid.Columns[j].FieldName).AsString)
                else if FormatDateTime('yyyy/mm/dd', ADO.FieldByName(DBGrid.Columns[j].FieldName).AsDateTime) < '1901/01/01' then
                  MSExcel.ActiveSheet.Cells[i, Col].Value := FormatDateTime('hh:mm', ADO.FieldByName(DBGrid.Columns[j].FieldName).AsDateTime)
                else
                  MSExcel.ActiveSheet.Cells[i, Col].Value := Trim(ADO.FieldByName(DBGrid.Columns[j].FieldName).AsString);
              end
              else
              begin
                MSExcel.ActiveSheet.Cells[i, Col].NumberFormatLocal := CellFormat;
                MSExcel.ActiveSheet.Cells[i, Col].Value := Trim(ADO.FieldByName(DBGrid.Columns[j].FieldName).AsString);
              end;
              Inc(Col);
            end;
          Col := 1;
          i := i + 1;
          ADO.Next;
        end;
        //氝樓遺盄
        Str := ColName + IntToStr(i - 1);
        MSExcel.ActiveSheet.Range['a3', Str].HorizontalAlignment := xlCenter;
        MSExcel.ActiveSheet.Range['a3', Str].VerticalAlignment := xlCenter;
        //MSExcel.ActiveSheet.Range['a3', Str].WrapText := True;
        MSExcel.ActiveSheet.Rows['3:3'].RowHeight := 30;
        MSExcel.ActiveSheet.Rows['4' + ':' + IntToStr(i)].RowHeight := 26;
        MSExcel.ActiveSheet.Range['a3', Str].Borders.LineStyle := xlContinuous;
        MSExcel.ActiveSheet.Range['a3', Str].Borders.Weight := xlThin;
        MSExcel.ActiveSheet.Range['a1', Str].Font.Size := 10;
        MSExcel.ActiveSheet.Range['a1', Str].Font.Name := 'Times New Roman';
        MSExcel.ActiveSheet.Range['a1', ColName + '1'].Font.Size := 14;
        MSExcel.ActiveSheet.Range['a1', ColName + '1'].Font.Bold := True;    MSExcel.ActiveSheet.Columns['A:' + ColName].EntireColumn.AutoFit;    MSExcel.ActiveSheet.PageSetup.LeftMargin := 0.5 / 0.035; //扢离酘晚擒峈1CM, 1執脹衾0.035CM
        MSExcel.ActiveSheet.PageSetup.RightMargin := 0.5 / 0.035; //扢离衵晚擒峈1CM, 1執脹衾0.035CM
        MSExcel.ActiveSheet.PageSetup.TopMargin := 1.0 / 0.035; //扢离階晚擒峈1CM, 1執脹衾0.035CM
        MSExcel.ActiveSheet.PageSetup.BottomMargin := 0.5 / 0.035;
        MSExcel.ActiveSheet.PageSetup.FooterMargin := 0.5 / 0.035;
        MSExcel.ActiveSheet.PageSetup.CenterFooter := '菴 &P 珜ㄛ僕 &N 珜';
        if Orientation = 0 then
          MSExcel.ActiveSheet.PageSetup.Orientation := xlPortrait;
        if Orientation = 1 then
          MSExcel.ActiveSheet.PageSetup.Orientation := xlLandscape;
        MSExcel.ActiveSheet.PageSetup.PaperSize := xlPaperA4;
        if UpperCase(PageSize) = 'A4' then
          MSExcel.ActiveSheet.PageSetup.PaperSize := xlPaperA4;
        if UpperCase(PageSize) = 'A3' then
          MSExcel.ActiveSheet.PageSetup.PaperSize := xlPaperA3;
        MSExcel.ActiveSheet.PageSetup.PrintTitleRows := '$1:$3';
        MSExcel.ActiveWorkBook.Saved := True;
        //MSExcel.Visible := True;
        ADO.First;
        Result := MSExcel;
      except
        on E: Exception do
        begin
          Mainfrm.ShowCustWarning('劑豢ㄐㄐㄐㄐ', E.Message, False);
          MSExcel.ActiveWorkBook.Saved := True;
          MSExcel.Visible := True;
          MSExcel.Quit;
        end;
      end;
    end;
      

  8.   

    不要用MSExcel.ActiveSheet,要在MSSheet:= MSExcel.WorkBooks.Add;
    MSExcel.ActiveSheet会受到用户操作的干扰
      

  9.   


    你是用的什么版本的Delphi和Excel??好像版本不同,出现的问题也不同。之前是用Delphi 7操作Excel,好像问题不多,而后来用Delphi 2010操作Excel,限制就多了。
    也有可能,我是D7+Office2003环境,基本最稳定的组合