2009-06-25 8 views
4

J'ai un fichier Excel construit avec OpenXML 2 et je veux l'envoyer en pièce jointe. par exemple.Envoyer une pièce jointe en mémoire à l'aide d'OpenXML

System.IO.MemoryStream stream = new System.IO.MemoryStream(); 
    SpreadsheetDocument package = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook)) 
    AddParts(package); //created using document reflector 

Enregistrer la feuille de calcul à un fichier temporaire en utilisant

stream.WriteTo(new System.IO.FileStream(@"c:\test.xlsx", System.IO.FileMode.Create)); 

fonctionne très bien. Mais en essayant d'envoyer le flux directement en tant que pièce jointe ne - simplement obtenir un fichier vide attaché à l'e-mail quand je fais

System.Net.Mail.Attachment file = new System.Net.Mail.Attachment(stream, "MobileBill.xlsx", "application/vnd.ms-excel"); 

anbody savent comment faire cela?

Répondre

0

Réflexion de la charge: est-ce que la classe de pièce jointe peut être lue à partir de la configuration actuelle dans le flux fourni? Si tel est le cas, vous auriez probablement « chercher » revenir au début du cours d'eau, avant de le nourrir au constructeur de la pièce jointe:

AddParts(package); //created using document reflector 
stream.Seek(0, SeekOrigin.Begin); 
System.Net.Mail.Attachment file = new System.Net.Mail.Attachment(stream, "MobileBill.xlsx", "application/vnd.ms-excel"); 
+0

merci. y arriver - il envoie des données maintenant que je peux voir la taille de la pièce jointe a augmenté. Mais Excel se plaint que le contenu est illisible. –

+0

Etes-vous en mesure d'enregistrer la pièce jointe et en quelque sorte diff avec le même fichier, comme enregistré dans votre exemple stream.WriteTo()? Le nouveau fichier est-il complètement vide ou contient-il certaines des données attendues? Combien? Quelles parties? –

1

Pour votre problème « contenu illisible », assurez-vous de Save () vos classeurs et feuilles de calcul et mettez votre SpreadsheetDocument dans une instruction using pour vous assurer que tous les packages et flux compressés sont vidés, fermés, etc.

System.IO.MemoryStream stream = new System.IO.MemoryStream(); 
using (SpreadsheetDocument package = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook))) 
{ 
    AddParts(package); 
    //Save if AddParts hasn't done it 
} 
System.Net.Mail.Attachment file = ... 
4

Ok, j'ai eu ce travail, mais avec quelques efforts. Pour créer le flux:

MemoryStream stream = new MemoryStream(); 

using (SpreadsheetDocument package = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook)) 
{ 
    Excel.CreateSpreadsheet(package, Excel_Methods.CreateSpotQuoteOut(), true); 
} 

stream.Seek(0, SeekOrigin.Begin); 

System.Net.Mail.Attachment attach = new System.Net.Mail.Attachment(stream, "spreadsheet.xlsx"); 

attach.ContentDisposition.CreationDate = DateTime.Now; 
attach.ContentDisposition.ModificationDate = DateTime.Now; 
attach.ContentDisposition.Inline = false; 
attach.ContentDisposition.Size = stream.Length; 
attach.ContentType.MediaType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 

De plus, je trouve que le mien n'étaient pas envoyés juste après que je les ai créés, et la raison est « autonome = oui » n'a pas été ajoutés à la déclaration xml de tous les pages, donc dans ma fonction AddParts, après avoir ajouté les pièces, je les ai passés dans cette fonction:

private static void AddXMLStandalone(OpenXmlPart part) 
     { 
      System.IO.StreamWriter writer = new System.IO.StreamWriter(part.GetStream()); 

      XmlDocument doc = new XmlDocument(); 
      doc.Load(part.GetStream()); 

      doc.InnerXml = doc.InnerXml.Substring(doc.InnerXml.IndexOf("?>") + 2); 
      doc.InnerXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + doc.InnerXml; 

      part.GetStream().SetLength(doc.InnerXml.Length); 
      doc.Save(writer); 
      writer.Flush(); 
      writer.Close();    
     } 

Bonne chance!

2

faire ceci:

System.Net.Mail.Attachment file = new System.Net.Mail.Attachment(new MemoryStream(stream.ToArray()), "MobileBill.xlsx", "application/vnd.ms-excel"); 

Apparemment, le flux de mémoire ne reçoivent pas rincée ou quelque chose

Questions connexes