![]() |
Excel Stringgrid in (vorhandene) Excel abspeichern
Moin zusammen,
ich bin es mal wieder. Ich hatte mir folgende Routine aus dem Netz geholt und etwas überarbeitet. Ich meine auch das sie bereits funktioniert hat, jetzt ist das Programm allerdings etwas größer geworden und nun funktioniert es nicht mehr (Die Daten werden nicht in Excel übernommen). Hat jemand evtl. eine Idee, denn eigentlich dürfte zusätzlicher Programmcode bei lokalen Variablen ja keinen Einfluss haben. Wichtig hierbei: Die Exceldatei wird vorher eingelesen (funktioniert mittlerweile 1A) und in eben diese sollen die Daten zurück geschrieben werden beim drücken auf Speichern, da diese im Stringgrid editiert werden (teilweise automatisch).
Code:
//Excel abspeichern (aus Grid)
procedure TTools.SpeichernFClick(Sender: TObject); var buttonSelected : Integer; logf : textfile; begin // Show a custom dialog buttonSelected := messagedlg('Daten in Excel übetragen und Speichern?',mtCustom, [mbYes,mbCancel], 0); // Show the button type selected if buttonSelected = mrYes then begin //Grid in Excel & Status anzeigen HinweisF.Show; ExcelSheets.Pages[0].Show; StringgridToXLS(DE_XLS, 'DE', ExcelE.Text); HinweisF.Caption := 'DE gespeichert'; ExcelSheets.Pages[ExcelSheets.ActivePageIndex + 1].Show; //... StringgridToXLS(Listen_XLS, 'Filiallisten', ExcelE.Text); HinweisF.Caption := 'Filiallisten gespeichert'; ExcelSheets.Pages[ExcelSheets.ActivePageIndex + 1].Show; StringgridToXLS(CuR_XLS, 'C&R', ExcelE.Text); HinweisF.Caption := 'Alles gespeichert'; ExcelSheets.Pages[0].Show; Timer2.Enabled := true; //Log schreiben assignfile(logf, ExtractFilePath(ParamStr(0)) + '\Log.txt'); reset(logf); append(logf); writeln(logf,DateToStr(Now) + ' - ' + TimeToStr(Now) + ' - ' + split(GetCurrentUserName, '.', 0) + ' - ' + ExcelE.Text + ' - gespeichert'); closefile(logf); LogList.Items.Clear; LogList.Items.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Log.txt'); end; end; //Inhalt eines TStringGrid nach Excel exportieren function TTools.StringgridToXLS(StringGrid : TStringGrid; sheetname : String; AXLSFile : string) : Boolean; var Col : Integer; Data : OleVariant; XLApp : OleVariant; MaxCol : Integer; MaxRow : Integer; Range : OleVariant; Row : Integer; Workbook : OleVariant; Worksheet : OleVariant; Value : OleVariant; begin Result := False; //Verbindung zu Excel herstellen XLApp := CreateOleObject('Excel.Application'); try if not VarIsNull(XLApp) then begin //Workbook öffnen XLApp.Workbooks.Open(AXLSFile); XLApp.Visible := false; if not VarIsNull(Workbook) then begin //Maximalen Bereich bestimmen MaxCol := Min(StringGrid.ColCount, XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[sheetname].Columns.Count); MaxRow := Min(StringGrid.RowCount, XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[sheetname].Rows.Count); if (MaxRow > 0) and (MaxCol > 0) then begin //Worksheet auswählen Worksheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[sheetname]; //Bereich auswählen Range := Worksheet.Range[RefToCell(1, 1), RefToCell(MaxCol, MaxRow)]; if not VarIsNull(Range) then begin //Daten aus Grid holen Data := VarArrayCreate([1, MaxRow, 1, MaxCol], varVariant); for Row := 0 to Pred(MaxRow) do begin for Col := 0 to Pred(MaxCol) do begin Value := StringToVariant(StringGrid.Cells[Col, Row]); Data[Succ(Row), Succ(Col)] := Value end; end; //Daten dem Excelsheet übergeben Range.Value := Data; Range.Columns.AutoFit; Result := True; end; end; end; end; finally if not VarIsEmpty(XLApp) then begin XLApp.DisplayAlerts := False; XLApp.Quit; XLAPP := Unassigned; Value := UnAssigned; Data := UnAssigned; Range := UnAssigned; Workbook := UnAssigned; end; end; end; //Hilfsfunktionen function TTools.StringToVariant(const SourceString : string) : Variant; var FloatValue : Extended; begin if TryStrToFloat(SourceString, FloatValue) then //Result := FloatValue //außer Kraft gesetzt, da ich (aktuell) nur Strings brauche, auch bei Zahlenwerten wegen führender Null Result := SourceString else Result := SourceString; end; |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
if not VarIsNull(Workbook) then
Workbook ist mMn an der Stelle Null weil nicht zugewiesen. Weiter oben hätte es wohl heißen müssen: Workbook:=XLApp.Workbooks.Open(AXLSFile); statt nur XLApp.Workbooks.Open(AXLSFile); ------- In der Folge könnte man dann auch statt: Worksheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[sheetname] einfach schreiben: Workbook.WorkSheets[sheetname] |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
Was mir fehlt, ist eine Speicherung der übergebenen Daten und falls ich es richtig vermute, warum öffnest Du die bereits vorhandene Excel-Datei ein weiteres Mal?
Gruß K-H |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
@Jumpy: Da hast du recht, sehe ich genauso. Das ist aber der Teil, den ich unangetastet gelassen hatte. Aber auch eine Definition dessen ändert leider nichts. (Ein showmessage als Kontrolle, beweist zumindest das er die korrekten Werte ausliest für maxcol und maxrow).
@K-H: Was meinst du mit erneut öffnen? Die Exceldatei wird in die Stringgrids eingelesen (je Sheet ein Stringgrid). Und diese wird dann im Programm bearbeitet (manuell oder automatisch) und soll danach gespeichert werden können (wozu die oben genannte Routine genutzt werden soll). Ich selber vermute, das er nicht die richtigen Daten zum speichern übergibt, kann aber aktuell den Denkfehler nicht finden. ... Problem gefunden: Er übernimmt die richtigen Daten ABER bei der Speicherabfrage nimmt er quasi "nicht speichern". Wie kann ich ihm sagen, das er die Änderungen speichern soll? |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
![]() |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
Dein Hinweis @ Codezwerg hat mir nicht wirklich geholfen, da dort kein Bezug auf das speichern genommen wird.
Habe nun woanders folgenden Code gefunden:
Code:
Damit funktioniert es nun.
Workbook.saveas(AXLSFile, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, False, EmptyParam, EmptyParam, GetUserDefaultLCID);
|
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
In StringgridToXLS machst du das Workbook auf, schreibst den Kram rein und machst es wieder zu wenn du XLApp.Quit aufrufst. Und du hast nirgendwo gespeichert.
Es hilft nicht in der Aufrufendene Prozedur zu speichern, dann ist schon alles wieder weg! Deine Ganze Logik ist irgendwo komisch. Du solltest in der Prozedur in die vom Einlesen noch geöffnete Excel-Datei schreiben und nicht jedes mal fürs reinschreiben die Datei wieder öffnen (die ja wahrscheinlich eh noch geöffnet ist). |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
Zitat:
|
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
@K-H: Bin gerade dabei deinem Tipp zu folgen und Excel bzw. die Datei früh zu öffnen (Programmstart) um sie später nicht immer öffnen und schließen zu müssen. Für das Einlesen der Excel funktioniert dies zwar, aber nicht für das speichern. Entweder bekomme ich die Rückmeldung im laufenden Programm "Ungültige varianten Operation" oder er schmeißt ab dem 2. Tabellenblatt alles falsch in Excel.
Ich habe folgenden Werte global deklariert: XLApp -> Excel AXLSFile -> Exceldatei Workbook -> Arbeitsbuch Und ich musste wegen eines Namenskonflikts auf openxml gehen, dann funktioniert aber meine obige Lösung nicht mehr. Weiß jemand wie ich eine Datei, die mit Openxml geöffnet wurde speicher? |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
Zeig doch mal etwas mehr Code. Vielleicht steht da jetzt noch was mit deiner alten Variante vermischt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 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 by Thomas Breitkreuz