AW: Excel Sheets
Hallo zusammen,
nach langem Gefummel habe ich jetzt doch tatsächlich einen Code der läuft :thumb: Einen Schönheitsfehler bezüglich Fehlermeldung "Undeklarierter Bezeichner" für After und Name bleibt erhalten, wenn ich das jedoch richtig verstanden habe ist das kein Beinbruch. Es sind einige eurer Tips eingeflossen - Danke dafür - mit folgendem Skript kann ich jetzt eine neue Arbeitsmappe mit 3 Arbeitsblättern anlegen und diese auch benennen.
Delphi-Quellcode:
Ein weiteres Problem wo ich noch keinen Ansatz gefunden habe:
Var ExcelApp : OleVariant;
Function TFormExcel.Excel_Starten(Q,Namen : String; Anz : integer; V : boolean) : boolean; var OK : boolean; N1, N2 : string; I : integer; begin OK := true; try ExcelApp := GetActiveOleObject('Excel.Application'); Except try ExcelApp := CreateOleObject('Excel.Application'); except Showmessage('Excel konnte nicht gestartet werden!'); OK := false; end; end; if (OK) and (not v) then begin ExcelApp.visible := false; ExcelApp.DisplayAlerts:=False; //unterdrückt die Ausgaben von Hinweisen aus Excel end; if Q = '' then //neue Arbeitsmappe anlegen begin ExcelApp.Workbooks.Add(xlWBatWorkSheet); //Eine Arbeitsmappe hat automatisch auch eine Tabelle N1 := Namen; if Pos(';',N1)>0 then begin N2 := Copy(N1,1,Pos(';',N1)-1); Delete(N1,1,Pos(';',N1)); end else N2 := 'Seite 1'; ExcelApp.ActiveWorkbook.ActiveSheet.Name := N2; //soll die Arbeitsmappe mehr als eine Tabelle enthalten dann weitere anlegen if Anz > 1 then begin for I := 2 to Anz do begin if Pos(';',N1)>0 then begin N2 := Copy(N1,1,Pos(';',N1)-1); Delete(N1,1,Pos(';',N1)); end else N2 := 'Seite ' + inttostr(I); ExcelApp.ActiveWorkbook.Worksheets.Add(After := ExcelApp.ActiveWorkbook.Worksheets[I-1]); ExcelApp.ActiveWorkbook.Worksheets[I].Name := N2; end; end else begin //hier Action wenn vorhandene Arbeitsmappe geöffnet werden soll end; end; Result := OK; end; Function TFormExcel.Excel_Arbeitsmappe_speichern(Z: string):boolean; Var OK : boolean; begin OK := true; if Z = '' then Ziel := Quelle else Ziel := Z; if Ziel <> '' then ExcelApp.ActiveWorkbook.saveas(Ziel) else OK := false; Result := OK; end; Procedure TFormExcel.Excel_Schliessen; begin ExcelApp.Quit; ExcelApp := Unassigned; end; procedure TFormExcel.Button1Click(Sender: TObject); begin if Excel_Starten('','Test 1;Test 2;Test 3;',3,false) then begin Excel_Arbeitsmappe_speichern('D:\Eigene Dateien\temp\Test.xlsx'); Excel_Schliessen; end; end; Wie im Beispiel zu sehen gebe ich die Datei-Endung mit .xlsx an, was aber wenn der Anwender noch ein älteres Excel hat welches nur xls unterstützt. Kann ich das irgendwie herausfinden ob xlsx geht oder nicht ?? Gruß Sidi61 |
AW: Excel Sheets
Hallo,
die Excel-Version bekommst du über:
Code:
Das ist ein String, den du dann mal analysieren musst.
Application.Version bzw. bei dir: ExcelApp.Version
Zur generellen Vorgehensweise: Ich würde einfach eine Stringlist, oder TStrings mit den Namen übergeben, dann weißt du zum einen die Anzahl der gewünschten Namen über den Listcount und kannst es dir auch sparen, deinen Namens-String mühsam zu zerlegen, wie du das jetzt machst. Dann kannst du auch folgendes dann machen, um auf einen Schlag ein Workbook mit n leeren Sheets zu erzeugen:
Delphi-Quellcode:
fertig.
AlteSheetZahl:=ExcelApp.SheetsInNewWorkbook
ExcelApp.SheetsInNewWorkbook:=Namensliste.Count wb:=ExcelApp.Workbooks.Add ExcelApp.SheetsInNewWorkbook:=AlteSheetZahl for i:=0 to Namensliste.Count-1 do wb.Worksheets[i+1].Name:=Namensliste[i] |
AW: Excel Sheets
Was passiert wenn du einfach die Endung weglässt? Bei Excel gibt es eine Einstellung wie neue Arbeitsmappen standardmäßig gespeichert werden sollen. Wenn sich der User jetzt explizit einen Datentyp ausgewählt hat und deine Anwendung aber einen anderen verwendet, dann ist das u. U. nicht so gern gesehen.
Vielleicht speichert Excel die Datei dann mit der voreingestellten Endung wenn du sie einfach weglässt. Habe ich bisher aber noch nicht probiert. Die Fehler werden bei mir auch massig in der Fehlerliste angezeigt. Ich habe meine Export Funktionen in eine eigene Unit ausgelagert damit diese nicht die wirklichen Fehler überdecken. Scheint ein Problem mit den Variants zu sein weil Error Insight das nicht richtig auflösen kann. |
AW: Excel Sheets
Zitat:
Gruß K-H |
AW: Excel Sheets
Zitat:
Zitat:
Erstmal die obsoleten Klammern weg (außerdem können Leerzeichen ja soooooooowas von entspannend wirken) Ich werde da immer ganz kirre, wenn ich sinnlos Klammern zählen muß, um zu erkennen was wirklich geklammert ist. (wir schreiben hier doch keine C-Codes, wo immer zuviele Klammern vorkommen und ich die gern mal mit { } verwechsle )
Delphi-Quellcode:
und dann nur noch umdrehn
if NOT VarIsEmpty(oExcel) and NOT VarIsEmpty(oWB1)
and NOT VarIsEmpty(oWS1) and NOT VarIsEmpty(oWS2) then
Delphi-Quellcode:
if NOT (VarIsEmpty(oExcel) or VarIsEmpty(oWB1) or VarIsEmpty(oWS1) or VarIsEmpty(oWS2)) then
Warum NOT groß und IF THEN AND klein? |
AW: Excel Sheets
Hallo p80286,
da hast du wohl recht, werde es dann einfach in die Grundeinstellung des jeweiligen Programms auslagern, das hat den Charme dass der Anwender das Format selbst wählen kann und somit u.U. auch für ältere Excel Versionen auf ggf. vorhandenen Zweit-Rechnern kompatibel sein kann. Gruß Sidi61 |
AW: Excel Sheets
Hallo himitsu,
Zitat:
Ich schreibe seit Turbo Pascal 3.0 NOT und NIL immer groß, es ist für mich leichter lesbar. Kann ja jeder machen wie er will. Deine Abhandlung über die Boolesche Algebra ist ja großartig, allerdings wird durch Deine Umstellung eigentlich mein Anliegen maskiert. Und das sieht man ja beim Beitrag Ersteller, er fragt die Variablen jetzt überhaupt nicht mehr ab und wundert sich später das er noch ein paar Excel – Instanzen offen hat. Bis bald Chemiker |
AW: Excel Sheets
Zitat:
Delphi-Quellcode:
Die Magic-Numbers sollte man natürlich durch ordentlich benamste Konstanten ersetzen.
function ExcelVersion:integer;
begin //ExcelApp.Version liefert sowas wie 14.0 Result:=Trunc(StrToFloat(ExcelApp.Version)) end; //irgendwo in der Speichern-Routine: //ab Version 12.0 gibts meine ich xlsx If ExcelVersion>=12 then //Excel-Version ist neu begin If GewünschteDateiEndung='xlsx' then ExcelApp.SaveAs(GewünschterDateiname) Else //Endung='xls' gewünscht //56=Altes Excel-Format benutzen in neueren Excels ExcelApp.SaveAs(GewünschterDateiname,56) end Else //Excel-Version ist alt begin If GewünschteDateiEndung='xlsx' then showmessage('Altes Excel kann neues Format nicht speichern') Else //Endung='xls' gewünscht ExcelApp.SaveAs(GewünschterDateiname) end; |
AW: Excel Sheets
Zitat:
Gruß K-H |
AW: Excel Sheets
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz