Announcement

Collapse
No announcement yet.

probleme eine binärdatei zu öffnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • probleme eine binärdatei zu öffnen

    Guten Tag <br>
    ich habe folgendes Problem:<br>
    ich möchte eine MS Office Datei (*.doc,*.xls,*.ppt) öffnen und eine Volltextsuche darauf anwenden<br>
    Wenn ich eine doc - Datei mittels TStringList.ReadFromFile öffne (was für Textdateien hervorragend funktioniert), bekomme ich nur ein paar steuerzeichen.<br>
    Ich bin für jeden Tip in die richtige Richtung dankbar.

    Raimund Fiedler

  • #2
    Hy,
    das mit den Steuerzeichen ist doch auch OK schau dir doch mal ne Datei im Editor an. Die Datei hat doch einen relativ große Header. Speicher Doch im RTF Format und suche darin

    Gruß Joachi

    Comment


    • #3
      danke, das war der fingerzeig in die richtige richtun

      Comment


      • #4
        Hy,
        noch ein kleiner Fingerzeig habe ich gerade gefunden.

        Zitat aus einer anderen Mail !!!

        Gruß Joachim

        Hallo Patrizia,
        der folgende Code öffnet die Arbeitsmappe Mappe1.xls aus dem Programmverzeichnis und sortiert A1:G27 auf Arbeitsblatt "Tabelle1" entweder aufsteigend o. absteigend.


        unit Unit1; interface uses
        Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
        StdCtrls, OleServer, Excel2000; type
        TForm1 = class(TForm)
        ExcelApplication1: TExcelApplication;
        Button1: TButton;
        ExcelWorkbook1: TExcelWorkbook;
        ExcelWorksheet1: TExcelWorksheet;
        Button2: TButton;
        ComboBox1: TComboBox;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure ComboBox1Change(Sender: TObject);
        private
        { Private-Deklarationen }
        FLCID : Integer;
        FSortDir : Integer;
        public
        { Public-Deklarationen }
        end; var
        Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject);
        begin
        FLCID := GetUserDefaultLCID;
        ExcelApplication1.Connect;
        ExcelApplication1.Visible[FLCID] := True;
        ExcelApplication1.UserControl := True;
        FSortDir:=xlAscending;
        ComboBox1.ItemIndex:=0;
        end; procedure TForm1.FormDestroy(Sender: TObject);
        begin
        ExcelWorksheet1.Disconnect;
        ExcelWorkbook1.Close(True); // Schließen und speichern
        ExcelWorkbook1.Disconnect;
        ExcelApplication1.Quit;
        ExcelApplication1.Disconnect;
        end; procedure TForm1.Button1Click(Sender: TObject);
        var
        sXLS_FileName : String;
        begin
        sXLS_FileName := ExtractFilePath(Application.EXEName) + 'Mappe1.xls';
        ExcelApplication1.Workbooks.Open(sXLS_FileName, False, False,
        EmptyParam,'',False,False,EmptyParam,
        EmptyParam,false,false,EmptyParam,false,0);
        ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveW orkBook);
        ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Sheets.It em['Tabelle1'] AS _WorkSheet);
        ExcelWorksheet1.Activate;
        end; procedure TForm1.Button2Click(Sender: TObject);
        var
        R : Range;
        begin
        R:=ExcelWorksheet1.Range['A2','A2'];
        ExcelWorksheet1.Range['A1','G27'].Sort(R, // Key1: OleVariant;
        FSortDir, // Order1: XlSortOrder;
        EmptyParam, // Key2: OleVariant;
        EmptyParam, // Type_: OleVariant;
        FSortDir, // Order2: XlSortOrder;
        EmptyParam, // Key3: OleVariant;
        FSortDir, // Order3: XlSortOrder;
        xlGuess, // Header: XlYesNoGuess;
        1, // OrderCustom: OleVariant;
        False, // MatchCase: OleVariant;
        xlTopToBottom, // Orientation: XlSortOrientation;
        0); // SortMethod: XlSortMethod; end; procedure TForm1.ComboBox1Change(Sender: TObject);
        begin
        Case ComboBox1.ItemIndex of
        0 : FSortDir:=xlAscending;
        1 : FSortDir:=xlDescending;
        end;
        end; end.

        Quelle: Entwickler 3/2001 Excel 2000 Markorecorder / VBA Hilfe
        Ich verwende die Office 2000 Serverkomponenten. Dieses Beispiel sollte aber auch mit den Office 97 Komponenten laufen.
        Jens Schuman

        Comment


        • #5
          Sorry wurde leider beim Kopieren etwas deformatiert

          Comment


          • #6
            Hallo Raimund,<br>du kannst die Office-Dateien in einen TFileStream laden, und diesen dann nach der Zeichenkette durchsuchen. Auf die schnelle ist mir der folgende Code eingefallen. <br>
            <pre><font size="1" face="Verdana">
            unit Unit1;

            interface

            uses
            Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
            Buttons, StdCtrls, ComCtrls;

            type
            TForm1 = class(TForm)
            edtOfficeFile: TEdit;
            SpeedButton1: TSpeedButton;
            OpenDialog: TOpenDialog;
            edtSearch: TEdit;
            Button1: TButton;
            PB: TProgressBar;
            Label1: TLabel;
            procedure SpeedButton1Click(Sender: TObject);
            procedure Button1Click(Sender: TObject);
            private
            { Private-Deklarationen }
            function SearchInOfficeFile(const Filename,SearchStr : String) : Boolean;
            public
            { Public-Deklarationen }
            end;

            var
            Form1: TForm1;

            implementation

            {$R *.DFM}

            function TForm1.SearchInOfficeFile(const Filename, SearchStr: String): Boolean;
            var
            F : TFileStream;
            SrLen : Integer; // Länge des Suchtextes
            SrBytes : Integer; // Anzahl gelesener Bytes
            aByte : Byte;
            CheckStr : String;
            begin
            Result:=False;
            SrLen:=Length(SearchStr);
            PB.Position:=0;
            SrBytes:=0;
            F:=TFileStream.Create(Filename,fmOpenRead);
            Try
            PB.Max:=F.Size;
            While F.Position&lt;(F.Size) do
            begin
            F.Read(aByte,SizeOf(aByte)); // Lese den Stream byteweise
            Inc(SrBytes); // Zähle die gelesenen Bytes mit
            If AnsiUpperCase(Char(aByte))=AnsiUpperCase(SearchStr[SrBytes]) then
            begin
            {
            Wenn das gelesene Byte gleich dem Zeichen an der Stelle SrBytes in
            SearchStr ist, dann muß das Zeichen CheckStr hinzugefügt werden.
            }
            CheckStr:=CheckStr+AnsiUpperCase(Char(aByte));
            If CheckStr=AnsiUpperCase(SearchStr) then
            begin // Wenn gefunden, dann raus und True zurückliefern
            Result:=True;
            Exit;
            end;
            end
            else
            begin
            CheckStr:='';
            SrBytes:=0;
            end;
            PB.Position:=F.Position;
            Application.ProcessMessages;
            end; // While F.Position&lt;(F.Size) do
            Finally
            F.Free;
            PB.Position:=0;
            end;
            end;

            procedure TForm1.SpeedButton1Click(Sender: TObject);
            begin
            If Not OpenDialog.Execute then Exit;
            edtOfficeFile.Text:=OpenDialog.Filename;
            end;

            procedure TForm1.Button1Click(Sender: TObject);
            begin
            If SearchInOfficeFile(edtOfficeFile.Text,edtSearch.Te xt) then
            ShowMessage(edtSearch.Text+' in '+#13#10+edtOfficeFile.Text+' gefunden')
            else
            ShowMessage(edtSearch.Text+' nicht in '+#13#10+edtOfficeFile.Text+' gefunden');
            end;

            end.
            </font></pre><br>Die Laufzeit des Codes kann sicher noch verbessern, aber es scheint zuklappen. Begriffe, die irgendwie unterbrochen sind (z.B. mit Return oder Trennzeichen), werden wahrscheinlich nicht gefunden. Aber das kannst Du ja testen. Vorteil an der Stream ist, das Du auf Automation verzeichten kannst.<br>Jens Schuman

            Comment


            • #7
              Hallo Joachim,<br>um hier im Forum auf andere Beiträge zu verweisen eignen sich Links sehr gut. http://entwickler-forum.de\webx?14@@.ee86b9f/0 <br> ;-) Jens Schuman

              Comment

              Working...
              X