Delphi-PRAXiS

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)

Chriss 26. Apr 2003 09:46


Excel-Tabelle in Stringgrid einlesen!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi @ all!!

Ich habe folgendes vor:

Ich habe ein Excel-Tabelle mit vorgegebenen Werten (so weit, so gut).
DIESE tabelle soll nun mit Start des Programms in ein Stringrid eingelesen werden! und zwar OHNE die Spaltenüberschriften! WICHTIG ist auch, dass die Formate beibehalten werden müssen!
Ich habe die Tabelle angehängt, damit ihr damit auch was anfangen könnt! (Die rote zeile gibt es später nicht)
Ich habe schon mit memos und so weiter alles durchprobiert, funktionieren tuts, aber ich will hinterher mit den zahlen aus der tabelle auch noch rechnen!!

DANKE

CHRISS

Touchdown 26. Apr 2003 10:03

Möglich ist es auf jeden Fall, ich selbst hab mal sowas gemacht.

Damals hat mir googeln nach 'Delphi' und 'Excel' vollkommen ausgereicht ...

Auch wenn man sich in die Materie etwas einarbeiten muss, es gibt recht brauchbare Hilfen im Internet.

Dir alles zu erklären ist viel zu aufwendig, Detailfragen könnten wir hier sicher klären.

Chriss 26. Apr 2003 10:13

hab ich teils schon versucht, das ergebnis war genau das gegenteil: von einem stringgrid in eine tabelle!!

ich möchte auch nur wissen, wie ich es anstelle, dass die zeilen und spalten in die stringgrid übernommen werden!

Darty 26. Apr 2003 10:39

Ich habe es zwar noch nicht ausprobiert, aber vielleicht hilft Dir dieses Posting Daten von Excel nach Delphi und Feldformatierungen für den Start weiter ... Oder dieses Posting in der auch einige Urls drin sind Text im StringGrid formatieren ...

Chriss 26. Apr 2003 10:45

hmm, hat mehr mit der gestaltung zu tun....
ich guck mal weiter

toms 26. Apr 2003 10:46

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;

Chriss 26. Apr 2003 11:11

UFF *platt sei* :coder:
da braucht man ja nen doktor für... erstmal danke, mal gucken, was sich damit anstellen lässt *fg*!
:coder: :coder:

stoxx 30. Jan 2007 19:12

wenn in der Excel Datei Worksheets enthalten sind, die bis zur letzten Zeile ( 65536) gefüllt sind, stürzt der Code ab bei:

Delphi-Quellcode:
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

Mit der Meldung: " Die Activate-Methode des Range-Objektes konnte nicht ausgeführt werden."

Weiß jemand warum ?
besten Dank!

Hansa 30. Jan 2007 19:17

Re: Excel-Tabelle in Stringgrid einlesen!
 
Zahlentyp integer hört da auf. Hast Delphi-Version leider vergessen anzugeben. Wird wohl heutzutage als ShortInt deklariert sein. 8)

stoxx 30. Jan 2007 19:24

Re: Excel-Tabelle in Stringgrid einlesen!
 
Zitat:

Zitat von Hansa
Zahlentyp integer hört da auf. Hast Delphi-Version leider vergessen anzugeben. Wird wohl heutzutage als ShortInt deklariert sein. 8)


hmm .. versteh ich jetzt nich ganz, bis zu dieser Zeile wird doch noch gar nix mit integern gemacht ..
Sind ja nur 4 effektive Zeilen mit Excel ....

D2006 hab ich.


Delphi-Quellcode:
  XLApp := CreateOleObject('Excel.Application');
  try
    XLApp.Visible := False;
    XLApp.Workbooks.Open(AXLSFile);
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

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:54 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