导出到EXCEL文件时,用的下面的代码:
SaveFileDialog.Options := SaveFileDialog.Options + [ofOverwritePrompt]; //A行
  ...
MSExcel.ActiveWorkBook.SaveAs(FileName);                //B行
但如果导出的文件名已经存在,那在A行的时候就提示文件已存在,是否覆盖。
如果选择是,运行到B行的时候,还是会报文件已存在,是否覆盖?(提示的窗口名是Microsoft Excel),
第一次的提示是正常的,请问如何能够屏蔽第二次的提示,而直接保存呢?

解决方案 »

  1.   

    用if ... then ...去判断一下就可以了!
      

  2.   

    我做的时候是把数据导出到EXCEL,但不能是已经存在了文件,如果已经存在就先把它删了,再创建
      

  3.   

    个人觉得你的方法有问题,如过你A行过了,但B行发生运行错误呢,那岂不把旧文件删除了,新文件又没建立起来,为什么不把导出的XLS放到内存中,导出完后再SAVE 呢,这时候就提醒一次是否覆盖岂不更好.
      

  4.   

    along19811006(饭桶) 的想法固然好,但具体如何实现呢,首先A行里是通过“另存为”对话框来选择或者生成文件名的,如果在这时你用的文件名已经存在,就会提示你是否覆盖。
    还有一个就是你说的“把导出的XLS放到内存中,导出完后再SAVE ”这个过程怎么实现,能不能给一些例子呢,谢谢。
      

  5.   

    DlgSave := TsaveDialog.Create(nil);
      DlgSave.Filter := '*.xls|*.xls';
      if DlgSave.Execute then
      begin
        application.ProcessMessages;
        filename := DlgSave.FileName;
        try
          ExcelApp := CreateOleObject('Excel.Application');
          ExcelApp.Caption := 'Excel-cms2002';
          MyWorkBook := CreateOleobject('Excel.Sheet');
        except
          application.Messagebox('无法打开Xls文件,请确认已 经安装EXCEL.', '',
            mb_OK + mb_IconStop);
          exit;
        end;
        MyworkBook := ExcelApp.workBooks.Add();
        application.ProcessMessages;
        ExcelApp.WorkSheets[1].Activate;
        myworkbook.worksheets[1].Name := 'ABC';
        for i := 1 to a_FiledNo do      //转化字段名;
        begin
          //eclApp.cells(1,i) :=Form3.DBGrid4.Columns[i-1].Title.caption ;
          excelapp.cells(1, i) := DBGrideh1.Fields[i - 1].DisplayLabel;
        end;
        DBGrideh1.DataSource.DataSet.First;
        //  excelapp.cells(2,1):=dbgrid1.Fields [1].Value ;
        for k := 1 to a_recno do    //Form3.a_recno
        begin
          for j := 1 to a_filedNo do  //转化一个记录
          begin
            //excelapp.cells(k+1,j) :=DbGrid1.Fields[j-1].Value ;
            excelapp.cells.item[k + 1, j] :=
              DbGrideh1.Fields[j - 1].AsString;
          end;
          DBGrideh1.DataSource.DataSet.Next;
        end;
        ExcelApp.Columns.AutoFit;
        ExcelApp.ActiveWorkBook.SaveAs(FileName);
        ExcelApp.WorkBooks.Close;
        application.MessageBox('数据导出成....', '数据导出', 0);
        ExcelApp.Quit;
        DlgSave.Destroy;
      

  6.   

    你用我的代码看看
    function TFrm_student.S_IsFileInUse(FileName : string ) : boolean;
    var
      HFileRes : HFILE;
    begin
      Result := false;
      if not FileExists(FileName) then
        exit;
      HFileRes := CreateFile(pchar(FileName), GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
      Result := (HFileRes = INVALID_HANDLE_VALUE);
      if not Result then
        CloseHandle(HFileRes);
    end;
      
    procedure TFrm_student.suiButton11Click(Sender: TObject);
    Var
      ExcelApp:Variant;
      SaveDialog1: TSaveDialog;
      i,j,row,column:integer;
    begin
      //dm.Apps.Get_Seek_Result(querystr,1);
      with dm.ClientDataSet1 do begin
      querycount:=RecordCount;
       close;open;
      if dm.ClientDataSet1.IsEmpty then
      begin
        ShowMessage('没有数据需要存盘!');//test
        Exit;
      end;
      SaveDialog1:= TSaveDialog.Create(nil);
      SaveDialog1.Filter := 'Excel 文件 (*.xls)|*.xls';
      SaveDialog1.Title:='确定另存为excel的文件名';
      if savedialog1.Execute Then
        begin
          while S_IsFileInUse(savedialog1.FileName) do
          begin
            case Application.MessageBox(PChar('无法存盘,'+string(ExtractFileName(savedialog1.FileName))+'正在使用中'), '请确认', MB_ICONQuestion+MB_ABORTRETRYIGNORE+MB_DEFBUTTON2) of
              IDAbort:
                begin
                  SaveDialog1.Free;
                  Exit;
                end;
              IDRetry:
                begin
                  continue;
                end;
              IDIgnore:
                begin
                  if Not savedialog1.Execute then break;
                end;
            end;
          end;
        end
      else
        begin
          SaveDialog1.Free;
          exit;
        end;//if
       try
        ExcelApp:=CreateOleObject('Excel.Application');//首先创建 Excel 对象,使用ComObj
       except
        Application.Messagebox('Excel没有安装!','Hello',MB_ICONERROR + mb_Ok);
        Abort;
       end;//end try
      try
        ExcelApp.Visible := False;//显示当前窗口
        ExcelApp.Caption := '应用程序调用 Microsoft Excel';//更改 Excel 标题栏
        ExcelApp.WorkBooks.Add;//添加新工作簿:
        ExcelApp.WorkSheets[ 'Sheet1' ].Activate;//设置第1个工作表为活动工作表
        ExcelApp.ActiveSheet.Rows[1].Font.Size:=10;
        ExcelApp.ActiveSheet.Rows[1].Font.Bold := True;
        row:=1;
        column:=1;
        for j:= 0 to dm.ClientDataSet1.FieldCount-1 do
          begin
            ExcelApp.Cells[row,column].Value:=dm.ClientDataSet1.Fields[j].DisplayLabel;
            column:=column+1;
          end;
        row:=2;
        while (Not dm.ClientDataSet1.Eof) and (Not dm.ClientDataSet1.IsEmpty) do
        begin
          column:=1;
          for i:=1 to dm.ClientDataSet1.FieldCount do
            begin
              ExcelApp.Cells[row,column].Value:=dm.ClientDataSet1.fields[i-1].AsString;
              column:=column+1;
            end;
          dm.ClientDataSet1.Next;
          row:=row+1;
        end;
        if Not S_IsFileInUse(savedialog1.FileName) then
          try
            ExcelApp.ActiveWorkBook.SaveAs(savedialog1.filename);
          except
            SaveDialog1.Free;
            ExcelApp.WorkBooks.Close;
            ExcelApp.Quit;
            ExcelApp:= Unassigned;
            exit;
          end;
        SaveDialog1.Free;
        ExcelApp.WorkBooks.Close;
        ExcelApp.Quit;
        ExcelApp:= Unassigned;
        Application.MessageBox('Excel文件导出成功!','成功',MB_OK);
      except
        SaveDialog1.Free;
        ExcelApp:= Unassigned;
      end;
      end;
    end;
      

  7.   

    zdq801104的办法才是比较常用的办法,这个方法比删除要好
      

  8.   

    你也要看一下这个:
    procedure myclass.ExportToExcel(DataSet: TDataSet;filename:string;SheetName:string;VisibleExcel:bool;pbr:tProgressbar);
    var
      myexcel:Variant;
      mysheet:Variant;
      range:variant;
      i,j:integer;
      //****************************
    begin
     try
        myexcel:=createoleobject('excel.application');
        myexcel.Visible :=VisibleExcel;
        myexcel.Workbooks.Add;//新建EXCEL文件
    //    myexcel.Workbooks[1].WorkSheets[1].Name:= '报表测试';
        // myexcel.Workbooks[1].WorkSheets[2].delete;
        // myexcel.Workbooks[1].WorkSheets[3].delete;
        // mySheet:= v.Workbooks[1].WorkSheets['报表测试'];//等效下面的语句
        mysheet:= myexcel.Workbooks[1].WorkSheets[1];
             //添加单元格内容
        with dataset do
        begin      pbr.Min :=0;
          pbr.Max:=recordcount;
          //列出字段名称。
          for j:=0 to FieldCount-1 do mysheet.cells[1,j+1]:=Fields[j].FieldName ;      for i:=0 to recordcount-1 do
          begin
            pbr.Position:=i;  //显示进度。
            for j:=0 to fieldcount-1 do
            begin
            
               mysheet.cells[2+i,1+j]:=dataset.Fields[j].AsString;
    //           mysheet.cells[2+i,1+j]:=vartostr(fields[j].Value );
               application.ProcessMessages ;
            end;
            next;
          end;
        end;
       { //*********************************设置报表外观 开始*******************************************
        //设置列标题
        Range := mysheet.Range['A1:O1'];//单元格从A2到M2
        Range.Rows.RowHeight :=25; //设置行高
        Range.Columns.ColumnWidth := 25; // 设置列宽
        Range.Borders.LineStyle := 1; //加边框
        //Range.FormulaR1C1 := '合并区';
        Range.HorizontalAlignment := 3;//xlCenter(水平对齐方式)
        Range.VerticalAlignment := 2;//xlCenter(垂直对齐方式)
        Range.Characters.Font.Name := '楷体';//字体
        Range.Characters.Font.FontStyle:= '加粗';
        Range.Characters.Font.Size := 15;
        Range.Characters.Font.OutlineFont := False;//是否有下划线
        Range.Characters.Font.ColorIndex := 1;//xlAutomatic//颜色
        //设置字段
        Range := mysheet.Range['A2:O'+inttostr(i)];//单元格从A2到M2
        Range.Rows.RowHeight :=15; //设置行高
        Range.Columns.ColumnWidth := 25; // 设置列宽
        Range.Borders.LineStyle := 0; //加边框
        Range.Characters.Font.Name := '宋体';//字体
        Range.Characters.Font.Size := 12;
        Range.Characters.Font.ColorIndex :=0;//xlAutomatic//颜色    //**********************************设置报表外观 结束**************************************** }//   myexcel.visible:=true;
        myexcel.WorkBooks[1].Close(True, filename);//取文件名退出
        myexcel.Quit;//退出EXCEL  Except
       //错误处理
        Showmessage('导出时出现错误!!!');
        myexcel.DisplayAlerts := false;//是否提示存盘
        myexcel.Quit;//退出EXCEL
        exit;
      end;
    //  Application.Restore;
    //  Application.BringToFront ;end;