![]() |
Excel Automation
Hallo zusammen,
ich müsste von Delphi aus Excel Spreadsheets auslesen, also nicht jeden Wert, sondern zu bestimmten Zellen springen usw... Ich weiß das dieses Thema schon öfter behandelt wurde, aber nach Benutzung der Suchfunktion klicke ich bereits auf der 10.ten Seite rum und finde keine Einführung oder Grundlagen, wie ich Excel ansteuern kann. Was ich bräuchte wäre vielleicht eine Rumpfapplikation wo ich sehen kann, wie man auf Excel zugreift. Kennt einer so etwas? |
AW: Excel Automation
Wie wäre es mit einem
![]() |
AW: Excel Automation
Zitat:
Auf der 2. Seite beim Thema "Daten an Excel übergeben" muckt der Compiler bei folgender Anweisung...
Code:
mit der Fehlermeldung ..."Operator ist auf diesen Operandentyp nicht anwendbar!" Ausserdem steht im Tutorial ExcelWorkbook1 (siehe Fettdruck), was ja wohl auch falsch ist.
ExcelWorksheet.ConnectTo([B]ExcelWorkbook[/B].Sheets.Item[1] as ExcelWorkSheet);
Kann mir jemand weiterhelfen oder hat einer noch einen anderen Vorschlag ? |
AW: Excel Automation
Vielleicht hilft Dir das weiter:
(ist alles anderes als optimal aber lauffähig)
Delphi-Quellcode:
Gruß
(* Liest Exceldatei *)
function LIESEXCEL(const datei:string;const sheet:integer; var startzeile,endzeile,startspalte,endspalte:integer; const fontinfo:boolean=false; const colorinfo:boolean=false):tstringlist; const DELIMMITERLINE='........'; var maxZeil, maxSpal : integer; ll : tstringlist; i,j : integer; excel : variant; zelle : ansistring; {!! shortstring=Begrenzung ; kann auch ansistring sein!} begin ll:=tstringlist.Create; maxZeil:=0; maxSpal:=0; try excel:=createoleobject('EXCEL.APPLICATION'); except showmessage('Excel kann nicht gestartet werden!'); exit; end; excel.visible:=true; { visible nur für test-zwecke } excel.workbooks.Open(Filename:=datei); excel.activeworkbook.sheets[sheet].activate; { 1. Worksheet} {-- Excel zählt von 1..x } maxZeil:=excel.activesheet.usedrange.rows.count; maxSpal:=excel.activesheet.usedrange.columns.count; if StartZeile=0 then Startzeile:=1; if StartSpalte=0 then StartSpalte:=1; {---------------------} if endZeile>maxzeil then endZeile:=maxZeil; if endSpalte>maxspal then endSpalte:=maxSpal; for i:=startZeile to endZeile do begin for j:=startSpalte to endSpalte do begin zelle:=excel.activesheet.cells[i,j]; { Lese Wert } excel.activesheet.cells[i+1,j+1].select; if fontinfo then zelle:=zelle+'|'+excel.selection.font.name; if excel.activesheet.cells[i+1,j+1].font.Strikethrough=True then Zelle:=zelle+'(gestrichen)'; if colorinfo then zelle:=zelle+'Farbe:'+inttostr(excel.activesheet.cells[i+1,j+1].font.colorindex); ll.Add(zelle); end; ll.add(DELIMITERLINE); end; excel.ActiveWorkbook.Close; excel.quit; result:=ll; end; K-H |
AW: Excel Automation
Hallo,
Zitat aus dem Tutorial (was eigentlich wirklich einfach und verständlich geschrieben ist) Nicht vergessen: Wer keine Komponenten hat muss die Variablen deklarieren und erzeugen (ExcelWorkbook:TExcelWorkbook; ExcelWorkSheet:TExcelWorksheet). Also: Entweder Komponente auf dein Form ziehen, oder halt selbst "createn" Ciao Frank |
AW: Excel Automation
Zitat:
|
AW: Excel Automation
Zitat:
Eine kleine Sache wäre da noch: Bei deinem Beispiel fragt Excel am Schluss immer ob die Datei gespeichert werden soll. Kann ich diese Meldung irgendwie unterdrücken? |
AW: Excel Automation
Jo, selbst speichern.
Excel.ActiveWorkbook.SaveAs(Dateiname); oder Excel.ActiveWorkbook.Save; wenn der alte Name beibehalten bleinen soll. Ciao Frank |
AW: Excel Automation
Das ist aber eigentlich nicht so fein... falls die Excel Sheets beispielsweise in einem Verzeichnis mit ungenügenden Schreibrechten liegen, kracht's jedesmal. Gibt's denn keine Möglichkeit die Anzeige des Dialogs zu unterdrücken ? Ich lese aus den Sheets ja nur aus.
|
AW: Excel Automation
Hi,
Zitat:
Grüße |
AW: Excel Automation
Zitat:
|
AW: Excel Automation
Zitat:
Ich habe leider kein Excel zur Hand, aber es müßte einen Parameter "NoSave" oder so ähnlich geben. Schau doch mal in die VBA-Hilfe, da solltest Du eigentlich alles notwendige finden. Gruß K-H Edith: @Lemmy Es sieht wirklich nach einem Tippfehler aus:
Delphi-Quellcode:
Edith2:
procedure TForm1.Button3Click(Sender: TObject);
var sValue, filename: String; begin filename:=ExtractFilePath(ParamStr(0))+'Mappe1.xls'; ExcelWorkbook.ConnectTo(ExcelApplication.Workbooks.Open(filename, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, flcid)); ExcelWorksheet.ConnectTo(ExcelWorkbook1.Sheets.Item[1] as ExcelWorkSheet); sValue:=ExcelWorksheet.Range['B1','B1'].Value; MessageDlg(sValue, mtInformation, [mbOK], 0); end; Hier kann man sich den richtigen Paramer raussuchen: ![]() |
AW: Excel Automation
Hallo,
saveas in einem temporären Verzeichnis (User, sollte da ja Schreibrechte haben) und dann die Datei löschen. Sobald das Sheet mehr als nur ein einfacher Datensammler ist (eingebettete Funktionen etc.), ist immer gleich eine Änderung vorhanden. Ciao Frank |
AW: Excel Automation
Zitat:
Vielen Dank ! |
AW: Excel Automation
Zitat:
Code:
Sehr gut geht es aber auch so (MSExel ist die als 'Excel.Application' eröffnete OleVariant):
Const
wdDoNotSaveChanges = 0; wdSaveChanges = -1; wdPromptToSaveChanges = -2;
Code:
procedure CloseExcel(SaveChanges: Boolean=true);
begin if VarIsEmpty(MSExcel) = false then begin // speichert, wenn SaveChanges = TRUE; // speichert nicht (ohne Rückfrage), wenn SaveChanges = FALSE MSExcel.DisplayAlerts:= SaveChanges; MSExcel.quit; MSExcel:= Unassigned; end; |
AW: Excel Automation
Hallo,
Delphi-Quellcode:
nicht auf TRUE oder FALSE prüfen, dass kann zu Probleme führen.
if VarIsEmpty(MSExcel) = false then
besser:
Delphi-Quellcode:
if not (VarIsEmpty(MSExcel) then
DisplayAlerts wird auf TRUE oder FALSE gestellt, mit SaveChanges hat das nichts zu tun. Excel schließen ohne nachfragen:
Delphi-Quellcode:
Bis bald Chemiker
excel.ActiveWorkBook.Saved:= TRUE;
excel.Workbooks.Close; excel.Quit; excel:= Unassigned; |
AW: Excel Automation
Zitat:
In C/C++ ist klar. Da wird ja in jeder Bibliothek mindestens 10* TRUE und FALSE neu wenn du pech hast mit FALSE=0; TRUE=1 neu definiert. Zitat:
Delphi-Quellcode:
schließen und die Rückfrage vermeiden.
FWorkBook.Close(SaveChanges:=False);
|
AW: Excel Automation
Hallo Bernhard,
mach doch mal
Delphi-Quellcode:
Gruß
if boolean(4) then showmessage('4 ist true');
if boolean(4)=true then showmessage(inttostr(integer(true)) ist gleich 4'); K-H |
AW: Excel Automation
Hallo,
Zitat:
![]() Bis bald Chemiker |
AW: Excel Automation
Zitat:
Aber wer macht auch solche fehleranfälligen Konstrukte. :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz