2017-10-02 5 views
1

Lors de l'utilisation de la bibliothèque DocX, je génère le document docx sur le serveur, puis le télécharge..Net C# DocX librairy: comment sérialiser un document DocX?

Pour cela, j'ai besoin de convertir mon document en un tableau d'octets.

Pour ce faire, je gardais previousloy le document comme un fichier physique comme celui-ci:

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

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

mais je préférerais ne pas le faire. Est-il possible de sérialiser cet objet pour le télécharger sans l'enregistrer physiquement?

Je l'ai déjà essayé:

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(); 
    } 
} 

Avec:

return this.ObjectToByteArray(document); 

Mais évidemment, DOCX ne met pas en œuvre ISerializable.

EDIT: le code ci-dessous ne fonctionne pas non plus

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

est-ce un serveur Web et interne à votre organisation? –

+0

oui c'est un serveur privé, géré par une équipe dédiée –

+1

Jetez un coup d'oeil à cela alors et cela devrait vous donner ce dont vous avez besoin (sauf si vous utilisez MVC, qui sera une réponse différente, mais je peux en coder un plus tard si vous besoin) mais ... cela devrait fonctionner https://stackoverflow.com/questions/18477398/asp-net-file-download-from-server –

Répondre

0

Il n'y avait aucun moyen de le faire via la bibliothèque DocX d'origine.

Il est dommage que cette bibliothèque utilise un MemoryStream pour gérer les données.

Pour résoudre mon problème j'ai simplement ajouté une nouvelle propriété publique en lecture seule pour exposer la variable MemoryStream privée, alors je l'ai utilisé ce code simple:

code ajouté dans le projet DocX:

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

code dans ma fonction principale:

return document.DocumentMemoryStream.ToArray(); 
1

Essayez cela, remplacer mon c: \ temp ... chemin avec l'emplacement de votre document et cela obtenir et écrire le fichier pour vous à partir du tableau d'octets

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

Merci de votre attention, mais je ne veux pas enregistrer le fichier test2.csv sur le disque. J'ai trouvé un moyen de m'en sortir en changeant la bibliothèque DocX, voir mon article pour plus de détails.Merci –

+0

c'était juste un exemple de comment vous pourriez faire ce que vous devez faire, vous n'avez pas à enregistrer un fichier csv –

+0

Ce n'est pas ce que je dois faire parce que vous commencez avec un byte [] à partir d'un fichier physique, et je avoir un DocX pour commencer, en mémoire, pas sur le disque. –