Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Vorhandene Excelliste bearbeiten (https://www.delphipraxis.net/114144-vorhandene-excelliste-bearbeiten.html)

Lill Jens 20. Mai 2008 14:11


Vorhandene Excelliste bearbeiten
 
Hey DP'ler :)

Ist es möglich eine bereits vorhandene Excelliste so zu bearbeiten das meine Einträge von meinem Grid ans Ende angehängt werden?

Gruß LJ

Lill Jens 21. Mai 2008 09:38

Re: Vorhandene Excelliste bearbeiten
 
Keiner ne Idee?

:wall:

Der.Kaktus 21. Mai 2008 09:47

Re: Vorhandene Excelliste bearbeiten
 
Hallo,

also ich nutze XLSWrite..da gibt es eine Funktion
Delphi-Quellcode:
...Workbook.Sheets[0].Rows.count;
mit der Du die letzte Zeile erhalten kannst.

In der OLE-Funktionen wird es sicher auch so etwas ähnliches geben.

Lill Jens 21. Mai 2008 13:21

Re: Vorhandene Excelliste bearbeiten
 
Ich schau jetzt schon den Ganzen Tag konnte aber noch nichts finden.

Hat jemand sowas schon mal verwendet?

Gruß LJ

Olli73 21. Mai 2008 13:28

Re: Vorhandene Excelliste bearbeiten
 
Geht es Dir um den Zugriff auf Excel per OLE generell oder speziell um das Ermitteln der letzten (gefüllten) Zeile des Excel-Sheets?

Lill Jens 21. Mai 2008 13:35

Re: Vorhandene Excelliste bearbeiten
 
Ob der Zugriff über OLE oder über andere Komponenten(kostenlose) ist, ist mir im prinzip egal.

Das Projekt an dem ich sitze und so gut wie fertig ist soll eine Exceltabelle immer wieder erweitern.

Somit muss ich in eine Zeile unter der letzten gefüllten Zeile springen und dort meine neuen "Datensätze" eintragen.

In eine bereits vorhandene gefüllte Exceltabelle neue Einträg zu schreiben...hab ich noch nie gemacht und finde leider auch nix...

Gruß LJ

Olli73 21. Mai 2008 13:49

Re: Vorhandene Excelliste bearbeiten
 
Eine Suche nach "CreateOleObject" und "Excel" liefert zahlreiche Treffer.
Einen guten Einstieg findest duhier.

Lill Jens 21. Mai 2008 13:57

Re: Vorhandene Excelliste bearbeiten
 
Mhh Excel hab ich schon mehere male eingegeben in der suche...mein problem ist eine Exceltabelle zu öffnen oder eine Taballe zu erzeugen mit meinen Grideinträgen...das problem ist nur in die letzte zeile zu gelangen und dort anzusetzten.

Trotzdem danke für den link ;)

Reinhardtinho 21. Mai 2008 14:04

Re: Vorhandene Excelliste bearbeiten
 
Hi,

nach langer Zeit bietet sich für mich mal wieder die Gelegenheit dir bei Excel-Problemen zu helfen :P


Mit
Delphi-Quellcode:
WS.UsedRange[LCID].Rows.Count;
kann man an die verwendeten Zeilen rankommen.

WS ist das aktuelle Worksheet.

Du kannst also den Wert abfragen und dann in der nächsten Zeile mit der Befüllung des Excel-Dokuments fortfahren.


MFG
Lorenz

Lill Jens 21. Mai 2008 14:20

Re: Vorhandene Excelliste bearbeiten
 
Zitat:

Zitat von Reinhardtinho
Hi,

nach langer Zeit bietet sich für mich mal wieder die Gelegenheit dir bei Excel-Problemen zu helfen :P


Yeah mein Held ;)

Bekomme folgende Fehlermeldung bei deinem code

Delphi-Quellcode:
[DCC Fehler] unitMain.pas(1609): E2029 '(' erwartet, aber ']' gefunden
steh gerade iwie aufm schlauch hab ich iwas noch übersehen?

Reinhardtinho 21. Mai 2008 14:23

Re: Vorhandene Excelliste bearbeiten
 
Wie greifst du aktuell denn drauf zu?

Und zeig mal bitte die aktuelle Zeile.

Lill Jens 21. Mai 2008 14:28

Re: Vorhandene Excelliste bearbeiten
 
Delphi-Quellcode:
procedure TFMain.Excellfuellen(Sender: TObject);
var Workbook, Worksheet, Filename, Excel: OleVariant;
    OpenDialog:TOpenDialog;
begin
  OpenDialog:=TOpenDialog.Create(Self);
  try
    OpenDialog.InitialDir:=ExtractFilePath(Application.ExeName);
    OpenDialog.Filter:='xls|*.xls';
    if OpenDialog.Execute then begin
      try
        Excel := CreateOleObject('Excel.Application');
        Excel.Visible := true;  { für die testphase sinnvoll }

        Filename:=OpenDialog.FileName;
        Workbook:=Excel.Workbooks.Open(filename,
                                       emptyParam, emptyParam, emptyParam,
                                       emptyParam, emptyParam, emptyParam,
                                       emptyParam, emptyParam, emptyParam,
                                       emptyParam, emptyParam, emptyParam);
        // Excel.Workbooks.Add;
        Excel.ActiveWorkBook.Saved := True;  // ... verhindert unliebsame Dialoge
        //Workbook.Worksheet.UsedRange[LCID].Rows.Count;


      except
        ShowMessage('Excel konnte nicht gestartet werden !');
      end;
    end
  finally
    OpenDialog.free;
  end;
end;

Steig noch nicht so ganz durch hab mein excel sonst immer anders angesprochen:

Delphi-Quellcode:
procedure TFMain.DBGridToExcel(DBGrid:TDBGrid; StartSpalte, StartZeile:integer);
type TSpalten = array[1..256] of string;
// Funktion für das exportieren der Datensätze in Excel
  function CreateSpalten:TSpalten;
  var i, j, x:integer;
      abbruch:boolean;
  begin
    x:=1;
    abbruch:=false;
    j:=0;
    while (j <= 26) and not abbruch do begin
      i:=1;
      while (i <= 26) and not abbruch do begin
        if j = 0 then
          Result[x]:=chr(i+64)
        else
          Result[x]:=chr(j+64)+chr(i+64);
        inc(i);
        inc(x);
        abbruch:=(x > 256);
      end;
      inc(j);
    end;
  end;

var Excel:TExcelApplication;
    i, Zeile, lcid:integer;
    Workbook:_Workbook;
    Sheet, Zelle, Inhalt:Variant;
    Spalten:TSpalten;
begin
  if    assigned(DBGrid)
     and assigned(DBGrid.DataSource)
     and assigned(DBGrid.DataSource.DataSet) then
  begin
    if DBGrid.DataSource.DataSet.Active then begin
      Excel:=TExcelApplication.Create(nil);
      try
        lcid:=GetUserDefaultLCID;
        Excel.Connect;
        Excel.Visible[lcid]:=true;
        Excel.UserControl:=true;

        Workbook:=Excel.Workbooks.Add(EmptyParam, lcid);

        Spalten:=CreateSpalten;
        Zeile:=StartZeile;
        for i:=43 to DBGrid.FieldCount do begin
          Inhalt:=DBGrid.Fields[i-1].DisplayName;
          Zelle:=Excel.Cells.Range[
            Spalten[i+StartSpalte-1]+inttostr(Zeile),
            Spalten[i+StartSpalte-1]+inttostr(Zeile)
          ];
          Zelle.Value:=Inhalt;
          Zelle.Font.Bold:=true;
        end;

        DBGrid.DataSource.DataSet.First;
        while not DBGrid.DataSource.DataSet.Eof do begin
          inc(Zeile);
          for i:=1 to DBGrid.FieldCount do begin
            Inhalt:=DBGrid.DataSource.DataSet.FieldByName(
              DBGrid.Fields[i-1].FieldName
            ).AsString;
            Zelle:=Excel.Cells.Range[
              Spalten[i+StartSpalte-1]+inttostr(Zeile),
              Spalten[i+StartSpalte-1]+inttostr(Zeile)
            ];
            Zelle.Value:=Inhalt;
          end;
          DBGrid.DataSource.DataSet.Next;
        end;

        Sheet:=Workbook.ActiveSheet;
        Sheet.Columns[
          Spalten[StartSpalte]+':'+Spalten[StartSpalte+DBGrid.FieldCount]
        ].EntireColumn.AutoFit;

      finally
        Excel.Disconnect;
        Excel.free;
      end;
    end;
  end;
end;

Reinhardtinho 21. Mai 2008 15:09

Re: Vorhandene Excelliste bearbeiten
 
Dann füge nochmal folgendes hinzu, dass du auf ein Worksheet zugreifen kannst.

Delphi-Quellcode:
       
var
  WS : _WorkSheet;
  ...
begin
  ...

  WS := Workbook.ActiveSheet as _Worksheet;
  WS.UsedRange[LCID].Rows.Count;

end;

Lill Jens 21. Mai 2008 15:44

Re: Vorhandene Excelliste bearbeiten
 
Das der Code fehlt macht Sinn aber es kommt leider die Gleiche Fehlermeldung wie zuvor :gruebel:

Chemiker 22. Mai 2008 09:42

Re: Vorhandene Excelliste bearbeiten
 
Hallo Reinhardtinho,

mit Rows.Count ermittelt man die letzte Zeile von Excel, das ist 65536. Ich Denke das Lill Jens die letzte belegte Zelle in einer Zeile meint.

Beispiel in VBA:

Sub LetztebelegteZelle()
strAntwort = MsgBox(Rows.Count)
End Sub

Bis bald Chemiker

RWarnecke 22. Mai 2008 10:10

Re: Vorhandene Excelliste bearbeiten
 
Ich habe ein VB-Makro, welches mir aus einer Exceltabelle mit Daten ein SQL-Skript erstellt. Das ist die Schleife, die die komplette Tabelle durcharbeitet.
Code:
    For iWks = 1 To ActiveWorkbook.Worksheets.Count
      Open sPath & "Inhalt-Kostenstellen.sql" For Output As #1
      Set rng = ActiveWorkbook.Worksheets(iWks).Range("A1").CurrentRegion
      Print #1, "delete from kostenstellen where mandant > 0;"
      For iRow = 2 To rng.Rows.Count
         sTxt = sTxt & "INSERT INTO Kostenstellen(Mandant,Abteilung,Kostenstelle,Bezeichnung,CompanyID,Gesellschaft,Title) VALUES ("
         For iCol = 1 To rng.Columns.Count - 1
            If iCol = rng.Columns.Count - 1 Then
              sTxt = sTxt & "'" & ActiveWorkbook.Worksheets(iWks).Cells(iRow, iCol).Value & "'); "
            Else
              If iCol = 1 Then
                sTxt = sTxt & ActiveWorkbook.Worksheets(iWks).Cells(iRow, iCol).Value & ", "
              Else
                sTxt = sTxt & "'" & ActiveWorkbook.Worksheets(iWks).Cells(iRow, iCol).Value & "', "
              End If
            End If
         Next iCol
         Print #1, Left(sTxt, Len(sTxt) - 1)
         sTxt = ""
      Next iRow
      Close #1
    Next iWks
Dieser Teil geht jede Zeile und Spalte durch.

Reinhardtinho 22. Mai 2008 18:21

Re: Vorhandene Excelliste bearbeiten
 
@Chemiker:

Also bei mir erhalte ich die letzte gefüllte Zeile (mit UsedRange[LCID].Rows.Count).

Delphi 5 und die Komponente TExcelApplication.


MFG
Lorenz

Chemiker 22. Mai 2008 21:24

Re: Vorhandene Excelliste bearbeiten
 
Hallo Reinhardtinho,

habe leider UsedRange überlesen.

Wenn man so, den benutzten Bereich anspricht, sollte man nur wissen, dass nicht die letzte mit Daten gefüllte Zeile angesprochen wird. Das Bedeutet das es reicht eine Zelle zu formatieren sagen wir einmal auf eine Uhrzeit, oder man Zellen einfärbt und schon wird diese Zelle zur letzten Zelle.

Bis bald Chemiker

simmi 31. Mai 2008 12:23

Re: Vorhandene Excelliste bearbeiten
 
Hallo,

mein Vorschlag ist zwar recht einfach gestrickt, funktionier jedoch. Mein PC hat bis Zeile 10.000 ca. 6 Sekunden benötigt.

Grüße Simmi

[delphi]
uses ...., ComObj;

var excel: Variant;

function EXCELStarten (var m_EXCEL : Variant): boolean;
begin
try
m_EXCEL := CreateOleObject('Excel.Application');
Result := TRUE;
except
ShowMessage('Excel konnte nicht gestartet werden!');
Result := FALSE;
Exit
end;
end;

Function TForm1.Zeile_Nr: Longword; //Excel 2007 hat mehr als 65535 Zeilen
var i : Longword;
s : string;
begin
excel.workbooks.open(OpenDialog1.FileName);
excel.sheets['Tabelle1'].activate;
i:=1;
repeat
s:=excel.cells[i,Spalte]; //Spalte mit Daten wählen
if s<>'' then inc(i);
until s='';
Zeile_Nr:=i;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if not OpenDialog1.Execute then exit;
if not EXCELStarten (Excel) then exit;
showmessage('Nächste freie Zeile ist '+IntToStr(Zeile_nr));
end;

Chemiker 31. Mai 2008 17:53

Re: Vorhandene Excelliste bearbeiten
 
Hallo simmi,

was passiert, wenn Du innerhalb der Spalte eine Leere Zelle hast, dann hört die Funktion auf zu zählen und gibt ein falsches Ergebnis zurück.

Bis bald Chemiker

simmi 1. Jun 2008 09:12

Re: Vorhandene Excelliste bearbeiten
 
Guten Morgen,

leider kenn ich die Struktur Deiner Tabelle nicht. Bei den Sachen, mit dennen ich mich oft rumschlagen muss, habe ich in 99% aller Fälle in einer Spalte eine laufende Nummer. Wer hindert Dich also daran eine Schummelspalte einzufügen.

Beispiel:
Mit der Funktion Anzahl2 aus Excel zählst Du alle nicht leeren Zellen. Diese Funktion z.B. in der 1. oder letzten Spalte der Tabelle eingefügt, daqnn Spalte ausblenden. Frage dann diese Spalte in Delphi ab und Du findest die nächste freie Zeile.

Grüße Simmi

Chemiker 1. Jun 2008 10:57

Re: Vorhandene Excelliste bearbeiten
 
Hallo simmi,

der Beitrag war nur als Hinweis gedacht, welche Probleme mit Deiner Funktion entstehen könnten.

Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 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