2017-10-02 3 views
1

Wenn ich die DocX librairy verwende, erzeuge ich das docx Dokument auf dem Server und lade es herunter..Net C# DocX librairy: Wie wird ein DocX-Dokument serialisiert?

Dafür muss ich mein Dokument in einem Array von Bytes konvertieren.

, das zu tun, i previousloy wurde das Dokument als eine physische Datei wie folgt zu speichern:

// Save all changes to this document. 
document.SaveAs(GENERATED_DOCX_LOCATION); 

return System.IO.File.ReadAllBytes(GENERATED_DOCX_LOCATION); 

, aber ich würde lieber nicht tun. Ist es möglich, dieses Objekt zu serialisieren, um es herunterzuladen, ohne es physisch zu speichern?

Ich habe bereits versucht, dass:

private byte[] ObjectToByteArray(object obj) 
{ 
    if (obj == null) 
     return null; 
    BinaryFormatter bf = new BinaryFormatter(); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     bf.Serialize(ms, obj); 
     return ms.ToArray(); 
    } 
} 

mit:

return this.ObjectToByteArray(document); 

Aber offensichtlich hat DocX nicht ISerializable implementieren.

EDIT: der folgende Code nicht entweder

byte[] byteArray = null; 
using (var stream = new MemoryStream()) 
{ 
    document.SaveAs(stream); 
    byteArray = stream.ToArray(); 
} 
return byteArray; 
+0

ist dies ein Webserver und intern zu Ihrer Organisation? –

+0

ja es ist ein privater Server, von einem engagierten Team verwaltet –

+1

Werfen Sie einen Blick auf diese dann und das sollte Ihnen geben, was Sie brauchen (es sei denn, Sie MVC verwenden, die eine andere Antwort sein wird, aber ich kann für Sie später eine Codierung brauche) aber ... das sollte funktionieren https://stackoverflow.com/questions/18477398/asp-net-file-download-from-server –

Antwort

0

Es gab keine Möglichkeit, dies über die ursprüngliche DocX-Bibliothek zu tun.

Es ist eine Schande, da diese Bibliothek einen MemoryStream verwendet, um die Daten zu manuplizieren.

mein Problem zu lösen ich einfach eine neue öffentliche Nur-Lese-Eigenschaft hinzugefügt, um den privaten Memory Variable zu belichten, dann habe ich diesen einfachen Code:

-Code im DocX Projekt hinzugefügt:

public MemoryStream DocumentMemoryStream { get { return this.memoryStream; } } 

-Code in Meine Hauptfunktion:

return document.DocumentMemoryStream.ToArray(); 
1

Try this funktioniert, ersetzen meine c: \ temp ... Pfad mit Ihrem Dokument Standort und dies wird die Datei für Sie erhalten und schreiben aus dem Bytearray

void Main() 
{ 
    byte[] bytes = System.IO.File.ReadAllBytes(@"C:\temp\test.csv"); 

    using (var bw = new BinaryWriter(File.Open(@"C:\temp\test2.csv", FileMode.OpenOrCreate))) 
    { 
     bw.Write(bytes); 
     bw.Flush(); 
    } 

} 
+0

Vielen Dank für Ihre Berücksichtigung, aber ich möchte die Datei test2.csv auf der Festplatte nicht speichern. Ich habe einen Weg gefunden, dies zu ändern, indem ich die DocX-Bibliothek ändere, siehe meinen Post für weitere Details.Danke –

+0

Dies war nur ein Beispiel dafür, wie Sie tun könnten, was Sie tun müssen, müssen Sie nicht eine CSV-Datei speichern –

+0

Es ist nicht das, was ich tun muss, weil Sie mit einem Byte [] aus einer physischen Datei beginnen, und ich haben Sie ein DocX, mit dem Sie beginnen, im Speicher, nicht auf der Festplatte. –

Verwandte Themen