Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Excel-Tabelle in Stringgrid einlesen! (https://www.delphipraxis.net/4365-excel-tabelle-stringgrid-einlesen.html)

Hansa 30. Jan 2007 19:55

Re: Excel-Tabelle in Stringgrid einlesen!
 
Zitat:

Zitat von stoxx
hmm .. versteh ich jetzt nich ganz..

Was denn ? Die gelieferten Stichwörter zum suchen, oder was ?

Das hier reicht allemal (zumindest mir) :

Zitat:

Zitat von stoxx
..65536..

Zitat:

Zitat von stoxx
..Sind ja nur 4 effektive Zeilen mit Excel ....

Und die werden nicht gezeigt. "Effektiv" ist zudem relativ.

stoxx 30. Jan 2007 20:17

Re: Excel-Tabelle in Stringgrid einlesen!
 
eigentlich ist da activete des Worksheets ja völlig sinnlos .. Ziel ist ja, das Worksheet in einer Delphi Variant Matrix zu kopieren.

warum geht das nicht so, wie ich möchte ?

Delphi-Quellcode:
RangeMatrix := sheet.Range['A1', 'E5'].Copy(EmptyParam);

Kopieren in die Zwischenablage funktioniert: (würde funktionieren, ist aber nicht sehr schick, die daten dann aus der Zwischenablage zu lesen)

Delphi-Quellcode:
sheet.Range['A1', 'E5'].Copy(EmptyParam);
siehe hier: http://www.dsdt.info/tipps/?id=605

vielleicht gibts ja eine einfache Lösung dafür?

Gelmo 8. Jan 2019 19:48

AW: Excel-Tabelle in Stringgrid einlesen!
 
Hallo zusammen
Ich habe ein Delphi-Programm geschrieben, das aus einer Excel-Datei Vokabeln ausliest und zum Üben verwendet. Ohne den Code von Toms (#6) hätte ich das niemals geschafft, da ich von OLE-Automation keine Ahnung habe. Nun würde ich die Daten lieber in Libre Office Calc übergeben, damit ich sie auf beliebigen PCs auslesen kann, ohne auf das Vorhandensein von MS Office angewiesen zu sein.

// Create Excel-OLE Object
XLApp := CreateOleObject('Excel.Application');

Gibt es inzwischen eine Methode, diesen Code von Toms für LibreOffice Calc anzupassen? Falls ja, könnten die übrigen Befehle übernommen werden oder sind sie für MS Office abgestimmt?
Im Internet habe ich dazu noch nichts gefunden.
Bin für jede Hilfe dankbar!
MfG Gelmo

p80286 8. Jan 2019 22:40

AW: Excel-Tabelle in Stringgrid einlesen!
 
Das Prinzip ist ähnlich,
aber ich an Deiner Stelle würde CSV,JSON oder XML als Speicherformat nutzen. CSV kann von EXCEL und Calc gelesen und geschrieben werden, bei den beiden anderen Formaten bin ich mir nicht sicher.

Gruß
K-H

hoika 9. Jan 2019 07:15

AW: Excel-Tabelle in Stringgrid einlesen!
 
Hallo,
wenn es etwas kosten kann -> TMS hat Komponenten für Xls und Xlsx (kostet extra), die lesen und schreiben können.
Und die arbeiten auch ohne ein installiertes Excel, also ohne die COM-Schnittstelle.

Zum LibreOffice:
Also wenn ich nach LibreOffice Automation suche, finde ich schon eine Menge, z.B. https://api.libreoffice.org/examples/examples.html .

mkinzler 9. Jan 2019 08:04

AW: Excel-Tabelle in Stringgrid einlesen!
 
OpenOffice/LibreOffice:
https://www.winsoft.sk/libre.htm

https://api.libreoffice.org/
https://sourceforge.net/projects/uno-pas-bridge/

Jumpy 9. Jan 2019 08:25

AW: Excel-Tabelle in Stringgrid einlesen!
 
Evtl. wäre das jetzt auch der Zeitpunkt, sich mit Datenbanken zu befassen, um komplett unabhängig zu sein, von irgendwelchen Office-Produkten. Gleichzeitig hat man ein besseres/flexibleres Speichermedium für seine Vokabeln, dass nicht nur aus einer irgendwie gearteten Datei besteht (xls, csv, ...). Und man erhält die Möglichkeit mehr Infos zu speichern, z.B. welche Vokabeln waren schon dran, welche waren falsch, müssen also nochmal präsentiert werden usw.

Moombas 9. Jan 2019 08:35

AW: Excel-Tabelle in Stringgrid einlesen!
 
Ich lese eine Excel CSV in MEHRERE Stringgrids ein (Ein Stringgrid = Ein Tabellenblatt).

Von HolgerX eine .pas: https://www.delphipraxis.net/1399704-post14.html
Kleine Änderungen von mir: https://www.delphipraxis.net/1412808-post14.html

Diese ins Programm einbinden

Im Programm wird es dann so aufgerufen (FXLApp ist nur ein beliebiger Name für die OleVariant):

Laden (für jedes Tabllenblatt:
Delphi-Quellcode:
  OpenExcel(DATEINAME, FXLApp);
  Xls_To_StringGrid(FXLApp, STRINGGRID, TABELLENBLATTNAME);
Falls du die Spaltenbreite auch anpassen willst nach dem befüllen:
Delphi-Quellcode:
GridColWidth(STRINGRID,1,0);
Delphi-Quellcode:
//Stringgrid Spaltenbreite anpassen
procedure GridColWidth(grd:TStringGrid;min,max:word);
var
  Zeile,Spalte,tmp,len: word;
begin
  with grd do begin // für alle Spalten
    for Spalte:=0 to (ColCount -1) do begin
      len:=0;
      for Zeile:=0 to (RowCount-1) do begin // für alle Zeilen
        tmp:=Canvas.TextWidth(Cells[Spalte,Zeile]);
        if tmp>len then len:=tmp // neue max Breite
      end; // for Zeile
      if max>0 then if len>max then len:=max; // Maximalbreite
      if len<min then len:=min; // Minimalbreite
      ColWidths[Spalte]:=len+GridLineWidth+10 // Spalte verbreitern
    end // for Spalte
  end // with
end;
Wieder in Excel Speichern:

Delphi-Quellcode:
SaveExcel(FXLApp)

Gelmo 9. Jan 2019 10:20

AW: Excel-Tabelle in Stringgrid einlesen!
 
Sorry, ich komme mit Eurem Editor noch nicht klar. Habe gerade eine Antwort geschrieben, die während der Vorschau verschwunden ist. Also vielen Dank für die Tipps, schaue mich da mal weiter um.

MfG Gelmo

waterboy 16. Jan 2023 19:45

AW: Excel-Tabelle in Stringgrid einlesen!
 
Zitat:

Zitat von toms (Beitrag 32294)
Hab mal eine Funktion Xls_To_StringGrid() geschrieben:

Code:
uses
  ComObj;

function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  // Create Excel-OLE Object
  XLApp := CreateOleObject('Excel.Application');
  try
    // Hide Excel
    XLApp.Visible := False;

    // Open the Workbook
    XLApp.Workbooks.Open(AXLSFile);

    // Sheet := XLApp.Workbooks[1].WorkSheets[1];
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];

    // In order to know the dimension of the WorkSheet, i.e the number of rows
    // and the number of columns, we activate the last non-empty cell of it

    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    // Get the value of the last row
    x := XLApp.ActiveCell.Row;
    // Get the value of the last column
    y := XLApp.ActiveCell.Column;

    // Set Stringgrid's row &col dimensions.

    AGrid.RowCount := x;
    AGrid.ColCount := y;

    // Assign the Variant associated with the WorkSheet to the Delphi Variant

    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
    //  Define the loop for filling in the TStringGrid
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      AGrid.RowCount := k + 1;
    until k > x;
    // Unassign the Delphi Variant Matrix
    RangeMatrix := Unassigned;

  finally
    // Quit Excel
    if not VarIsEmpty(XLApp) then
    begin
      // XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
    end;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  if Xls_To_StringGrid(StringGrid1, 'C:\Tabelle.xls') then
    ShowMessage('Table exported!');
end;


Sehr beeindruckend! Vielen Dank. habe ich auch gleich mal probiert.

viele Grüße

rainer


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 Uhr.
Seite 2 von 2     12   

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