![]() |
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 |
Re: EXCEL in Delphi.NET
Zitat:
|
Re: EXCEL in Delphi.NET
Zitat:
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:
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.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; Grüsse, Micha |
Re: EXCEL in Delphi.NET
Zitat:
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:
und da Borlande EmptyParam vergessen hat:
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);
Delphi-Quellcode:
var
EmptyParam: TObject; initialization EmptyParam := System.Reflection.Missing.Value; Zitat:
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:
|
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... |
Re: EXCEL in Delphi.NET
Alles klar,
ich beherzige es beim nächsten Mal. Vielen Dank. :) |
Re: EXCEL in Delphi.NET
Hallo.
Zitat:
also bei meinen referenzen steht nichts von microsoft..... wo finde ich das? thx |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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