AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken excel tabsheet einlesen , OLE fehler
Thema durchsuchen
Ansicht
Themen-Optionen

excel tabsheet einlesen , OLE fehler

Ein Thema von bernhard_LA · begonnen am 23. Nov 2015 · letzter Beitrag vom 23. Nov 2015
Antwort Antwort
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

excel tabsheet einlesen , OLE fehler

  Alt 23. Nov 2015, 11:10
Datenbank: MSSQL • Version: 8 • Zugriff über: ADO
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
Angehängte Grafiken
Dateityp: jpg ole_error.jpg (15,6 KB, 20x aufgerufen)
Dateityp: jpg ole2.jpg (17,1 KB, 14x aufgerufen)

Geändert von bernhard_LA (23. Nov 2015 um 11:22 Uhr)
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
435 Beiträge
 
Delphi 12 Athens
 
#2

AW: excel tabsheet einlesen , OLE fehler

  Alt 23. Nov 2015, 11:22
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.
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: excel tabsheet einlesen , OLE fehler

  Alt 23. Nov 2015, 11:29
was ist die einfachste Möglichkeit für dem Import alle Formeln in feste Wert zu verwandeln ? Save as *.csv ?????
  Mit Zitat antworten Zitat
quaero

Registriert seit: 25. Apr 2013
38 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: excel tabsheet einlesen , OLE fehler

  Alt 23. Nov 2015, 14:37
Kann es sein, dass du in deiner Excel-Tabelle Felder ohne Werte hast und dessen NULL-Werte nicht umgewandelt werden können?
quaero
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: excel tabsheet einlesen , OLE fehler

  Alt 23. Nov 2015, 15:17
ja, wie müsste ich auf diese Null Felder am besten reagieren ?
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: excel tabsheet einlesen , OLE fehler

  Alt 23. Nov 2015, 16:16
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;
Ralph
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: excel tabsheet einlesen , OLE fehler

  Alt 23. Nov 2015, 16:31
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)
  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:
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;
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: excel tabsheet einlesen , OLE fehler

  Alt 23. Nov 2015, 17:45
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:

AGrid.Cells[(row - 1), (col - 1)] := XLApp.WorksheetFunction.Text(Sheet.Cells[row,col].value,Sheet.Cells[row,col].NumberFormat);
Ralph
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: excel tabsheet einlesen , OLE fehler

  Alt 23. Nov 2015, 21:20
die fehler entstanden durch Zellen mit einem div 0 Error in Excel, nach einer Datenbereinigung klappt es jetzt mit dem Import
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 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