Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism EXCEL in Delphi.NET (https://www.delphipraxis.net/56354-excel-delphi-net.html)

micha382 4. Nov 2005 14:08


EXCEL in Delphi.NET
 
Wie kann ich eine EXCEL-Datei in Delphi.NET öffnen und lesen?

Die OLE Befehle versteht der Compiler nicht.
Gibt es ein Tool, das es erlaubt OLE- Automation in Delphi.NET zu nutzen? Wenn ja, wo bekomme ich es?

Grüsse,
micha

Robert_G 5. Nov 2005 12:49

Re: EXCEL in Delphi.NET
 
Zitat:

Zitat von micha382
Die OLE Befehle versteht der Compiler nicht.
Gibt es ein Tool, das es erlaubt OLE- Automation in Delphi.NET zu nutzen? Wenn ja, wo bekomme ich es?

Schonmal probiert, einfach eine Referenz auf eine COM TypeLib zu setzen? :roll:

micha382 18. Nov 2005 09:04

Re: EXCEL in Delphi.NET
 
Zitat:

Schonmal probiert, einfach eine Referenz auf eine COM TypeLib zu setzen? Rolling Eyes
So einfach ist es in .NET dann doch nicht, guter Mann. Da bin ich ja selbst drauf gekommen, doch funktioniert hat es trotzdem nicht...

Doch getreu dem Motto 'Démerdez-vous!' hab ich's nach einigen Wochen doch hinbekommen:

Ich benutze eine Funktion 'GetExcelWorksheet', die meine Datei öffnet und meine gewünschten Datensätze in ein DataSet schreibt.
Delphi-Quellcode:

uses
  System.Reflection, Excel, System.Data.OleDb, ComObj,

  System.Collections, System.ComponentModel,
  System.Data, System.Drawing, System.Web, System.Web.SessionState,
  System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls,
  Borland.Vcl.SysUtils;


function GetExcelWorkSheet(pathName:string; fileName:string; workSheetNumber:integer) : DataSet;
begin
  ExcelConnection := OleDbConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+pathName+'\'+fileName+';Extended Properties=Excel 8.0;');
  ExcelConnection.Open();
  ExcelCommand := OleDbCommand.Create;
  ExcelCommand.Connection := ExcelConnection;

  restrictions[0] := nil;
  restrictions[1] := nil;
  restrictions[2] := nil;
  restrictions[3] := 'TABLE'; // only user tables

  ExcelSheets := ExcelConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, restrictions);
  SpreadSheetName := '['+ExcelSheets.Rows[workSheetNumber]['TABLE_NAME'].ToString()+']';
  ExcelDataSet := DataSet.Create;// DataSet ExcelDataSet = new DataSet();
  ExcelCommand.CommandText := 'SELECT [A], [B], [C] FROM' +SpreadSheetName+ 'WHERE [A]>15 AND [A]>16';
  // Abfrage, die nur bestimmte Datensätze auswählt, funktioniert wie SQL

  ExcelAdapter := OleDbDataAdapter.Create(ExcelCommand);
  ExcelAdapter.Fill(ExcelDataSet);

  ExcelConnection.Close();
  Result := ExcelDataSet;//return ExcelDataSet;

end;

function Get_DataSet : DataSet;
begin
  DataSet := GetExcelWorksheet('C:\abc\def\','ghi.xls',1);
  // Die Ziffer hinter dem letzten Komma bezeichnet die Arbeitsmappe. EXCEL fängt bei 1 an zu zählen. Steht eine 0, wird die letzte Mappe aktiviert.
end;
Trotzdem vielen Dank für die freundliche Unterstützung. Habe gelernt, dass Foren (und nicht nur eures) doch nicht so toll sind wie sie immer denken.

Grüsse,

Micha

Bernhard Geyer 18. Nov 2005 09:38

Re: EXCEL in Delphi.NET
 
Zitat:

Zitat von micha382
Zitat:

Schonmal probiert, einfach eine Referenz auf eine COM TypeLib zu setzen? Rolling Eyes
So einfach ist es in .NET dann doch nicht, guter Mann. Da bin ich ja selbst drauf gekommen, doch funktioniert hat es trotzdem nicht..

Dann machst Du was falsch. Bei mir geht es.

1, Hinzufügen der Referenz auf "Microsoft Excel x.0 Object Library"
2, Uses-Anweisung um System.Reflection, Excel ergänzen
3, Beispielcode um Datei zu laden und neu zu speichern:

Delphi-Quellcode:
var
  Exl: Excel.Application;
begin
  Exl := Excel.ApplicationClass.Create;
  Exl.Workbooks.Open('K:\Entwickler-Tests\AQTest\DataSource\Source-1\Basisdaten\Doku.xls',
                     EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                     EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                     EmptyParam, EmptyParam);
  Exl.ActiveWorkbook.SaveAs('C:\Temp\MyExcel.xls',
                            EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                            EmptyParam, Excel.XlSaveAsAccessMode.xlExclusive, EmptyParam, EmptyParam,
                            EmptyParam, EmptyParam);
und da Borlande EmptyParam vergessen hat:

Delphi-Quellcode:
var
  EmptyParam: TObject;

initialization
  EmptyParam := System.Reflection.Missing.Value;
Zitat:

Zitat von micha382
Doch getreu dem Motto 'Démerdez-vous!' hab ich's nach einigen Wochen doch hinbekommen:

Du verwendest nicht Excel sondern die Fähigkeiten von Access bzw. der JET-Engine Excel-Dateien zu öffnen.
Und da Access von MS in Zukunft geringere Bedeutung hat (JET-Engine ist z.B. unter XP-Embedded nicht unbedingt installiert) ist diese Lösung auch keine 100% Lösung.

Zitat:

Zitat von micha382
Trotzdem vielen Dank für die freundliche Unterstützung. Habe gelernt, dass Foren (und nicht nur eures) doch nicht so toll sind wie sie immer denken.

Die Lösung war doch OK - evtl. etwas zu kurz gehalten für jemand der noch nicht so tief die .NET-Spezialitäten gegenüber Win32 in Delphi kennt. Also war das Problem eher der Fragesteller.

Robert_G 18. Nov 2005 09:52

Re: EXCEL in Delphi.NET
 
Ich erwartete eigentlich ein "nein, habe ich nicht, teste ich gleich mal" oder "ja, habe ich, aber XYZ läuft nicht wirklich..."

Das Referenzieren der TypeLib hielt ich für den StiNo-Weg, den hier :roll: gab's dafür, dass du eben nicht gesagt hast, ob du es versucht hast...

micha382 18. Nov 2005 11:10

Re: EXCEL in Delphi.NET
 
Alles klar,
ich beherzige es beim nächsten Mal.
Vielen Dank. :)

ZeroQool007 21. Mär 2006 13:05

Re: EXCEL in Delphi.NET
 
Hallo.


Zitat:

1, Hinzufügen der Referenz auf "Microsoft Excel x.0 Object Library"

also bei meinen referenzen steht nichts von microsoft..... wo finde ich das? thx


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