Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   excel tabsheet einlesen , OLE fehler (https://www.delphipraxis.net/187365-excel-tabsheet-einlesen-ole-fehler.html)

bernhard_LA 23. Nov 2015 11:10

Datenbank: MSSQL • Version: 8 • Zugriff über: ADO

excel tabsheet einlesen , OLE fehler
 
Liste der Anhänge anzeigen (Anzahl: 2)
ich möchte mit dieser Funktion (Quelle http://www.swissdelphicenter.ch/de/showcode.php?id=1728)
ein Excel Arbeitsblatt einlesen .


Delphi-Quellcode:
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;
#1 :
und erhalte diesen OLE Fehler beim Einlesen einer ersten Tabelle, woran liegt es ....???

#2:
Ich habe eine andere *.xls Datei getestet und bekomme den zweiten OLE Fehler

Papaschlumpf73 23. Nov 2015 11:22

AW: excel tabsheet einlesen , OLE fehler
 
Habe die Funktion schnell mal ausprobiert. Sie funktioniert soweit mit einer einfachen Excel-Datei. Möglicherweise enthält deine Datei Formeln mit Berechnungsfehlern. z.B. "A1 DIV 0". Versuche es mal mit einer ganz einfachen Excel-Datei mit zwei, drei Zahlen ohne Berechnungen.

bernhard_LA 23. Nov 2015 11:29

AW: excel tabsheet einlesen , OLE fehler
 
was ist die einfachste Möglichkeit für dem Import alle Formeln in feste Wert zu verwandeln ? Save as *.csv ?????

quaero 23. Nov 2015 14:37

AW: excel tabsheet einlesen , OLE fehler
 
Kann es sein, dass du in deiner Excel-Tabelle Felder ohne Werte hast und dessen NULL-Werte nicht umgewandelt werden können?

bernhard_LA 23. Nov 2015 15:17

AW: excel tabsheet einlesen , OLE fehler
 
ja, wie müsste ich auf diese Null Felder am besten reagieren ?

Jumpy 23. Nov 2015 16:16

AW: excel tabsheet einlesen , OLE fehler
 
Kann man das Ganze nicht gefühlt sauberer eindampfen zu:

Delphi-Quellcode:
function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
var
   XLApp, workbook, Sheet: OLEVariant;
   row, col: Integer;
begin
   Result := False;
   XLApp := CreateOleObject('Excel.Application');
   try
     XLApp.Visible := False;
     Workbook:=XLApp.Workbooks.Open(AXLSFile);
     Sheet := Workbook.WorkSheets[1];

     // Set Stringgrid's row &col dimensions.
     AGrid.RowCount := Sheet.UsedRange.Rows.Count;
     AGrid.ColCount := Sheet.UsedRange.Columns.Count;

     // Define the loop for filling in the TStringGrid
     for row = 1 to Sheet.UsedRange.Rows.Count do
       for col = 1 to Sheet.UsedRange.Columns.Count do
         AGrid.Cells[(row - 1), (col - 1)] := Sheet.Cells[row,col].value;

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

nahpets 23. Nov 2015 16:31

AW: excel tabsheet einlesen , OLE fehler
 
Zwei Möglichkeiten, die helfen könnten:
Delphi-Quellcode:
if VarIsEmpty(RangeMatrix[K, R]) then begin
  AGrid.Cells[(r - 1), (k - 1)] := '<leer>'; // bzw. einfach := '';
end else begin
  AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
end;
oder (unelegant)
Delphi-Quellcode:
  AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R] + '';


Jumpys Variante gefällt mir besser, wenn dort der Fehler weiterhin auftritt, wäre er in der Zeile zu vermuten:
Delphi-Quellcode:
AGrid.Cells[(row - 1), (col - 1)] := Sheet.Cells[row,col].value;
Hier würd' ich erstmal ein Try except drum bauen und in 'ner Fehlermeldung row und col ausgeben und dann mal in der Exceltabelle nachschauen, was denn da drinne steht, eventuell kann man mit dem Wissen ja dann etwas besser für eine sinnvolle Fehlerbehandlung sorgen.
Delphi-Quellcode:
try
  AGrid.Cells[(row - 1), (col - 1)] := Sheet.Cells[row,col].value;
except
  on e : exception do begin
    ShowMessage(Format('row: %d, col: %d',[row,col]));
  end;
end;

Jumpy 23. Nov 2015 17:45

AW: excel tabsheet einlesen , OLE fehler
 
Beim nochmaligen Nachdenken habe ich überlegt, dass es vllt. helfen könnte, denn Zellwert bereits in Excel auf den für das StringGrid benötigten String zu casten, was evtl. mit diesem Trick gehen könnte:

Delphi-Quellcode:
AGrid.Cells[(row - 1), (col - 1)] := XLApp.WorksheetFunction.Text(Sheet.Cells[row,col].value,Sheet.Cells[row,col].NumberFormat);

bernhard_LA 23. Nov 2015 21:20

AW: excel tabsheet einlesen , OLE fehler
 
die fehler entstanden durch Zellen mit einem div 0 Error in Excel, nach einer Datenbereinigung klappt es jetzt mit dem Import


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