Announcement

Collapse
No announcement yet.

Textdatei in Excel einlesen - Probleme mit OpenText und Parameter FieldInfo

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

  • Textdatei in Excel einlesen - Probleme mit OpenText und Parameter FieldInfo

    Hallo zusammen!
    <p>
    Ich habe folgendes Problem: <br>
    Ich habe eine Textdatei mit Werten die durch Semikolon getrennt sind (also ähnlich einer CSV Datei). Diese Datei wird automatisch erzeugt und ich möchte sie per Delphi-Programm nach Excel einlesen. Dabei soll der gleiche Vorgang ablaufen, wie beim öffnen der Datei in Excel "von Hand", d.h. wenn ich in Excel eine Textdatei öffne, wird automatisch ein Importvorgang gestartet, in dem ich auswählen kann, wie die einzelnen Datensätze getrennt sind (Semikolon) und welches Format die einzelnen Spalten haben sollen, usw. Und genau hier liegt das Problem: Ich habe in der Textdatei ziemlich große Zahlen drin stehen (Bsp.: 4007220317365), die, wenn ich sie nach Excel einlese, als Exponentialzahlen (Bsp.: 4,00722E+12) dargestellt werden. Deshalb muss ich bei dem Importvorgang die Spalten, in denen diese Zahlen stehen, als Text kennzeichnen. Ich habe mir mal ein Makro aufgezeichnet, was bei dem Importvorgang so passiert. Heraus kam folgendes (in Visual Basic):
    <p>

    Workbooks.OpenText FileName:="D:\Test\K000002.TXT", Origin:=xlWindows, _ StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False _ , Space:=False, Other:=False, FieldInfo:=Array(Array(1, 2), Array(2, 2), _ Array(3, 2), Array(4, 2), Array(5, 2), Array(6, 2), Array(7, 2), Array(8, 2), Array(9, 2), _ Array(10, 2), Array(11, 2), Array(12, 2), Array(13, 2), Array(14, 2), Array(15, 2))
    <p>

    Dieses Makro importiert mir die Textdatei exakt so nach Excel, wie ich sie haben möchte! Ich kann dieses auch per Automation aus Delphi heraus anstossen, jedoch muss ich für den Parameter "FieldInfo" ein "EmptyParam" einsetzen, da ich keine Ahnung habe, wie ich diesen Array-Wust von Visual Basic nach Delphi übersetze! Dadurch geht mir aber meine Textkonvertierung der Felder verloren und somit erscheinen wieder die Exponentialzahlen!
    <p>
    Also, lange Rede, kurzer Sinn: Wer von euch kann mir sagen, wie ich dieses Array bei "FieldInfo" in ein Delphi-Array übersetze?
    Hier noch ein paar Infos zum Array: Der erste Parameter gibt immer die Spalte an und der zweite das Format für die Spalte. "2" bedeutet das alle Werte der Spalte als Text dargestellt werden sollen.
    <p>
    So, jetzt seid Ihr dran! Vielleicht weiss ja Herr Kosch auch einen Rat oder jemand hat eine alternative Lösung für mich... Vielen Dank schon einmal im voraus!
    <p>
    MfG <br>
    Veit :-)

  • #2
    Hallo,

    das folgende müsste eigentlich funktionieren, aber mit Excel 2002 wird die Darstellung der Zahlen nicht geändert. Nur wenn ich <i>xlTextFormat</i> austausche, löst Excel eine OLE-Exception aus (also scheint das Variant-Array auch eingelesen zu werden).
    <pre>
    <b>uses</b> Excel_TLB;
    <br>
    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>var</b>
    vFieldInfo : OleVariant;
    aLCID : LCID;
    aExcelApp : _Application;
    <b>begin</b>
    vFieldInfo := VarArrayOf(
    [VarArrayOf([1, xlTextFormat]),VarArrayOf([2, xlTextFormat]),
    VarArrayOf([3, xlTextFormat]),VarArrayOf([4, xlTextFormat])]);
    aLCID := GetUserDefaultLCID;
    aExcelApp := CoExcelApplication.Create;
    aExcelApp.Visible[aLCID] := True;
    aExcelApp.UserControl := True;
    aExcelApp.Workbooks.OpenText(<font color="#9933CC">'C:\Temp\IN\Test.csv'</font>, xlWindows, 1,
    xlDelimited, xlDoubleQuote, False, False, True, False,
    False, False, False, vFieldInfo, True, <font color="#9933CC">','</font>, <font color="#9933CC">'.'</font>, False,
    EmptyParam, aLCID);
    <b>end</b>;
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch! <p>

      Erst einmal danke für den Lösungsansatz.<br>
      Wenn ich versuche o.g. Beispiel zu kompilieren tauchen zwei Probleme auf: <br>
      1.) Der Compiler meckert schon bei "xlTextFormat", dass er dieses nicht kennt (undefinierter Bezeichner). <br>
      2.) Bei dem Aufruf von OpenText gibt er mir an: "Zu viele Parameter". <p>

      Ich habe die "Excel_TLB" eingebunden, allerdings die von Office 97. Kann es daran liegen? Wir nutzen im Moment in der Firma noch Office 97. Was passiert mit dem Programm, wenn wir auf Office 2000 oder 2002 umsteigen? <p>

      Ach, ja und noch was: Was genau meinen Sie damit "...wenn ich xlTextFormat austausche..."? <p>

      Vielen Dank schon einmal im voraus!
      <p>
      MfG <br>
      Veit :-

      Comment


      • #4
        So, habe es endlich geschafft!<p>

        So läuft es wunderbar mit Office 97: <p>

        <PRE>
        uses Excel_TLB; <p>

        TExcel = class(TObject)
        private
        FExcelApp: TExcelApplication;
        FWorkbook: TExcelWorkbook;
        FWorksheet: TExcelWorksheet;
        procedure SetExcelApp(const Value: TExcelApplication);
        procedure SetWorkbook(const Value: TExcelWorkbook);
        procedure SetWorksheet(const Value: TExcelWorksheet);
        public
        property ExcelApp : TExcelApplication read FExcelApp write SetExcelApp;
        property Workbook : TExcelWorkbook read FWorkbook write SetWorkbook;
        property Worksheet : TExcelWorksheet read FWorksheet write SetWorksheet;
        end;
        <p>
        procedure TForm1.TntButton1Click(Sender: TObject);
        var
        vFieldInfo : OleVariant;
        FLCID : LCID;
        Excel : TExcel;

        begin
        //Array für die Spaltenformatierung erzeugen
        vFieldInfo := VarArrayOf([VarArrayOf([1, 2]),VarArrayOf([2, 2]),
        VarArrayOf([3, 1]),VarArrayOf([4, 1]),
        VarArrayOf([5, 1]),VarArrayOf([6, 1]),
        VarArrayOf([7, 2]),VarArrayOf([8, 2]),
        VarArrayOf([9, 2]),VarArrayOf([10, 2]),
        VarArrayOf([11, 2]),VarArrayOf([12, 2]),
        VarArrayOf([13, 2]),VarArrayOf([14, 2]),
        VarArrayOf([15, 2])]);

        try
        Excel := TExcel.Create;
        if assigned(Excel) then
        begin
        with Excel do
        begin
        FLCID := GetUserDefaultLCID;
        ExcelApp := TExcelApplication.Create(nil);
        if assigned(ExcelApp) then
        begin
        ExcelApp.Visible[FLCID] := false;
        ExcelApp.UserControl := true;

        Workbook := TExcelWorkbook.Create(nil);
        if assigned(Workbook) then
        begin
        ExcelApp.Workbooks.OpenText('D:\Test\Eingang.txt', xlWindows, 1,xlDelimited, xlDoubleQuote, False, False, True, False, False, False, False, vFieldInfo, EmptyParam, FLCID);

        Excel.Workbook.ConnectTo (Excel.ExcelApp.ActiveWorkBook);

        WorkSheet := TExcelWorksheet.Create(nil);
        if assigned(Worksheet) then
        begin
        Worksheet.ConnectTo(Workbook.Sheets.Item[1] as _Worksheet);

        Worksheet.Activate;

        ExcelApp.DisplayAlerts[FLCID] := False;
        ExcelApp.UserControl := FALSE;

        Worksheet.Disconnect;

        //wenn schon vorhanden, dann löschen!
        if FileExists('D:\Test\Ausgabe.xls') then
        DeleteFile('D:\Test\Ausgabe.xls');

        // Workbook Speichern und schliessen
        Workbook.SaveAs('D:\Test\Ausgabe.xls', xlNormal, EmptyParam, EmptyParam,
        false, false, xlShared, xlUserResolution,
        false, EmptyParam, EmptyParam, FLCID);

        Workbook.Close;
        Workbook.Disconnect;
        // Excel beenden
        ExcelApp.Quit;
        ExcelApp.Disconnect;

        Worksheet.Free;

        ShowMessage('Fertig!');
        end;
        Workbook.Free;
        end;
        ExcelApp.Free;
        end;
        end;
        Excel.Free;
        end;
        </PRE>
        <p>
        Ich habe die Typbibliothek von Excel 97 eingebunden. Bei Excel 2000 muss man noch ein paar Parameter mehr bei "OpenText" mitgeben. Ferner gibt es bei Excel 97 den Parameter "xlTextFromat" nicht. Hier kann man aber mit 1 für Standard und 2 für Text arbeiten.
        <p>
        Vielen Dank nochmal an Hr. Kosch für die Hilfe beim erstellen dieses Mega-Arrays ;-)
        <p>
        MfG <br>
        Veit

        Comment

        Working...
        X