Thema: Delphi Excel beenden

Einzelnen Beitrag anzeigen

Nicodius

Registriert seit: 25. Apr 2003
Ort: Graz
2.234 Beiträge
 
Delphi 2006 Architect
 
#7

Re: Excel beenden

  Alt 8. Mai 2004, 18:28
Delphi-Quellcode:
function StringGridToExcelSheet(Grid: TStringGrid; SheetName, FileName: string;
  ShowExcel: Boolean): Boolean;
const
  xlWBATWorksheet = -4167;
var
  SheetCount, SheetColCount, SheetRowCount, BookCount: Integer;
  XLApp, Sheet, Data: OLEVariant;
  I, J, N, M: Integer;
  SaveFileName : String;
begin
  //notwendige Sheetanzahl feststellen
  SheetCount := (Grid.ColCount div 256) + 1;
  if Grid.ColCount mod 256 = 0 then
     SheetCount := SheetCount - 1;
  //notwendige Bookanzahl feststellen
  BookCount := (Grid.RowCount div 65536) + 1;
  if Grid.RowCount mod 65536 = 0 then
     BookCount := BookCount - 1;

  //Create Excel-OLE Object
  Result := False;
  XLApp := CreateOleObject('Excel.Application');
  try
    //Excelsheet anzeigen
    if ShowExcel = false then
       XLApp.Visible := False
    else
       XLApp.Visible := True;
    //Workbook hinzufügen
    for M := 1 to BookCount do
    begin
        XLApp.Workbooks.Add(xlWBATWorksheet);
        //Sheets anlegen
        for N := 1 to SheetCount - 1 do
        begin
          XLApp.Worksheets.Add;
        end;
    end;
    //Sheet ColAnzahl feststellen
    if Grid.ColCount <= 256 then
       SheetColCount := Grid.ColCount
    else
       SheetColCount := 256;
    //Sheet RowAnzahl feststellen
    if Grid.RowCount <= 65536 then
       SheetRowCount := Grid.RowCount
    else
       SheetRowCount := 65536;

    //Sheets befüllen
    for M := 1 to BookCount do
    begin
        for N := 1 to SheetCount do
        begin
          //Daten aus Grid holen
          Data := VarArrayCreate([1, Grid.RowCount, 1, SheetColCount], varVariant);
          for I := 0 to SheetColCount - 1 do
            for J := 0 to SheetRowCount - 1 do
              if ((I+256*(N-1)) <= Grid.ColCount) and ((J+65536*(M-1)) <= Grid.RowCount) then
                Data[J + 1, I + 1] := Grid.Cells[I+256*(N-1), J+65536*(M-1)];

          XLApp.Worksheets[N].Select;
          XLApp.Workbooks[M].Worksheets[N].Name := SheetName + IntToStr(N);
          //Zellen als String Formatieren
          XLApp.Workbooks[M].Worksheets[N].Range[RefToCell(1, 1), RefToCell(SheetRowCount,
            SheetColCount)].Select;
          XLApp.Selection.NumberFormat := '@';
          XLApp.Workbooks[M].Worksheets[N].Range['A1'].Select;
          //Daten dem Excelsheet übergeben
          Sheet := XLApp.Workbooks[M].WorkSheets[N];
          Sheet.Range[RefToCell(1, 1), RefToCell(SheetRowCount,SheetColCount)].Value := Data;
        end;
    end;
    //Save Excel Worksheet
    try
      for M := 1 to BookCount do
      begin
          SaveFileName := Copy(FileName,1,Pos('.',FileName)-1) + IntToStr(M) +
          Copy(FileName,Pos('.',FileName),
          Length(FileName)-Pos('.',FileName)+1);
          XLApp.Workbooks[M].SaveAs(Filename);
      end;
      Result := True;
    except
      // Error?
    end;
  finally
    //Excel beenden
    if (not VarIsEmpty(XLApp)) and (ShowExcel = false) then
    begin
      XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
    end;
  end;
end;
function GenerateUniqueFileName(FileName: String): String;
var count: integer;
begin
  if not FileExists(FileName) then
  begin
    result := FileName;
    exit;
  end;
  count:=1;
  while FileExists(ChangeFileExt(FileName, '')+'-'+IntToStr(count)+
  ExtractFileExt(FileName)) do
    Inc(Count);
  result := ChangeFileExt(FileName,'')+'-'+IntToStr(count)+ExtractFileExt(FileName);
end;

procedure TForm1.Gewinner(Spieler: String);
var i, j : Integer;
    Data : String;
    datei : TStringlist;
begin
  LCID := GetUserDefaultLCID ;
  Datei := TStringlist.Create;
  Datei.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Spiele\Datei.txt');
  for I := 0 to StringGrid1.ColCount - 1 do
    for J:= 0 to StringGrid1.RowCount - 1 do
      If Stringgrid1.Cells[i,j] = 'then Stringgrid1.Cells[i,j] := '-';
 // Data := GenerateUniqueFileName(ExtractFilePath(ParamStr(0)) + 'Spiele\' +Spieler + 'Sieg');
  //StringGrid-Inhalt in Excel exportieren
  //Grid: StringGrid, SheetName: Stringgrid Print,
  //Pfad: c:\Test\ExcelFile.xls, Excelsheet anzeigen
  StringGridToExcelSheet(StringGrid1, Spieler + ' Sieg', ExtractFilePath(ParamStr(0)) + 'Spiele\' +Spieler + 'Sieg' + Datei[0],True);
 // Excel.Quit;
  //Excel := Unassigned;
  Showmessage(Spieler + ' gewinnt');
  Label1.caption := 'Spielstand: ' + IntToStr(Pkt1) + ':' + IntToStr(Pkt2);
  for I := 0 to StringGrid1.ColCount - 1 do
    for J:= 0 to StringGrid1.RowCount - 1 do
      Stringgrid1.Cells[i,j] := '';
  Zug := 0;
  Datei[0] := IntToStr(StrToInt(Datei[0])+1);
  Datei.SaveToFile(ExtractFilePath(ParamStr(0)) + 'Spiele\Datei.txt');

end;
Nico Müller
  Mit Zitat antworten Zitat