Excel Buffer Datei direkt Abspeichern ohne öffnen

31. Mai 2022 10:51

Hi Community,

Wie kann ich den Inhalt des Excel Buffers direkt als Datei unter einen definierten (Netzwerk- )Pfad abspeichern, ohne dass das Excel zuvor geöffnet wird?
Hab irgendwie keine passende Funktion gefunden.

Danke schonmal

Re: Excel Buffer Datei direkt Abspeichern ohne öffnen

31. Mai 2022 15:52

SaveToStream sollte klappen
-> den Stream dann in die Datei unter deinem Verzeichnis schießen

Re: Excel Buffer Datei direkt Abspeichern ohne öffnen

31. Mai 2022 16:29

SaveToStream ist DotNet, nicht D365BC, oder?

Nachtrag: Hat sich erledigt, hatte in einer alten Version geschaut wo es die function SaveToStream noch nicht gab...
Zuletzt geändert von enh am 31. Mai 2022 17:57, insgesamt 1-mal geändert.

Re: Excel Buffer Datei direkt Abspeichern ohne öffnen

31. Mai 2022 17:49

Könnte das ungefähr dann so aussehen?

Code:
        ExcelFile.Create(FileName + '.xlsx');
        ExcelFile.CreateOutStream(OutS);
        ExcelBuffer.SaveToStream(OutS, false);

Re: Excel Buffer Datei direkt Abspeichern ohne öffnen

1. Juni 2022 08:15

NAVGATOR hat geschrieben:Könnte das ungefähr dann so aussehen?


sag du es uns :)

Re: BC18: Excel Buffer Datei direkt Abspeichern ohne öffnen

1. Juni 2022 08:37

Ja, es funktioniert einfach nicht ich bekommen immer folgenden Fehler:

E/A-Ausnahme während des Vorgangs


Beim Debuggen kommt dann folgendes:

In T370
Code:
    procedure SaveToStream(var ResultStream: OutStream; EraseFileAfterCompletion: Boolean)
    var
        TempBlob: Codeunit "Temp Blob";
        BlobStream: InStream;
    begin
        FileManagement.BLOBImportFromServerFile(TempBlob, FileNameServer);
        TempBlob.CreateInStream(BlobStream);
        CopyStream(ResultStream, BlobStream);
        if EraseFileAfterCompletion then
            FILE.Erase(FileNameServer);
    end;


und dann in der Funktion FileManagement.BLOBImportFromServerFile scheitert das Ganze an InputFile.Open(FilePath);

Code:
   procedure BLOBImportFromServerFile(var TempBlob: Codeunit "Temp Blob"; FilePath: Text)
    var
        OutStream: OutStream;
        InStream: InStream;
        InputFile: File;
    begin
        IsAllowedPath(FilePath, false);

        if not FILE.Exists(FilePath) then
            Error(FileDoesNotExistErr, FilePath);

        InputFile.Open(FilePath);
        InputFile.CreateInStream(InStream);
        TempBlob.CreateOutStream(OutStream);
        CopyStream(OutStream, InStream);
        InputFile.Close;
    end;


es ist auch völlig egal, ob ich mit CreateBook einen Pfad angebe oder nicht:

Code:
        Clear(ExcelBuffer);
        ExcelBuffer.Reset();
        ExcelBuffer.DeleteAll();
        ExcelBuffer.CreateBook(FileName + 'temp.xlsx', InvoiceLineLbl);


Ich arbeite hier übrigens in einem Docker. Was schon seltsam war:
Wenn ich kein Pfad angebe, wird irgend ein FileNameServer im ExcelBuffer erzeugt, welchen es gar nicht in meinem Docker gibt.
Wenn ich aber einen Pfad angebe, den es definitiv in meinem Docker gibt, kommt auch die E/A Ausnahme

Re: Excel Buffer Datei direkt Abspeichern ohne öffnen

1. Juni 2022 10:04

vergessen wir mal SaveToStream
Code:
codeunit 50032 "Excel Magic"
{
    trigger OnRun()
    begin
        DoSomething();
    end;

    local procedure DoSomething()
    var
        ServTempFileName: Text;
    begin
        ServTempFileName := FileMgt.ServerTempFileName('xlsx');
        ExcelBuffer.CreateBook(ServTempFileName, 'MyBook');
        ExcelBuffer.NewRow();
        ExcelBuffer.AddColumn('hello', false, '', false, false, false, '', ExcelBuffer."Cell Type"::Text);
        ExcelBuffer.WriteSheet('HELLOWORLD', CompanyName(), UserId());
        ExcelBuffer.CloseBook();
        FileMgt.DownloadTempFile(ServTempFileName);
    end;

    var
        ExcelBuffer: Record "Excel Buffer" temporary;
        FileMgt: Codeunit "File Management";
}


anstatt
Code:
    FileMgt.DownloadTempFile(ServTempFileName);


kannst du auch
Code:
    FileMgt.CopyServerFile(ServTempFileName,'<<<<SavingPathWithFullFileName :)>>>>',false);


nutzen, um den FileSave-Dialog garnicht erst für den User sichtbar zu machen (den hab ich nur genutzt, damit ich die Datei auch mal in den Händen halten kann, ohne mich durch den Container "wühlen" zu müssen

Re: Excel Buffer Datei direkt Abspeichern ohne öffnen

1. Juni 2022 10:40

Hallo,

diese Programmierung wird aber wahrscheinlich teuer, weil das nicht Cloud- kompatibel ist.

Besser wäre es den Excel- Buffer in einen Stream zu speichern, und diese dann manuell herunter laden.

Gruß Fiddi

Re: Excel Buffer Datei direkt Abspeichern ohne öffnen

1. Juni 2022 10:49

korrekt, daher mein erster Vorschlag - SaveToStream.
Mein 2. Beipsiel war nur zur Verdeutlichung gedacht