2009-06-25 11 views
4

OpenXML 2を使用して作成されたExcelファイルがあり、電子メールの添付ファイルとして送信したいとします。例えばOpenXMLを使用してメモリに電子メールの添付ファイルを送信する

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

が正常に動作します使用して一時ファイルにスプレッドシートを保存する

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

。しかし、電子メールの添付ファイルとして直接ストリームを送信しようとすると、失敗した - 私は

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

Anbodyはこれを行う方法を知っているときだけ、メールに添付空のファイルを取得しますか?

答えて

0

考えられる負荷:Attachmentクラスは、提供されているストリームの現在の所在からの読み取りを期待していますか? (、あなたの「コンテンツ読めない」問題について

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

感謝を取得していません。そこに着く - 添付ファイルのサイズが増えているのがわかるように、今までにデータを送信しています。しかし、Excelは内容が判読できないと訴えている。 –

+0

添付ファイルを保存することができますか、あなたのstream.WriteTo()の例に保存されているものと同じファイルで何らかのdiffを実行できますか?新しいファイルは完全にガベージであるか、または期待されるデータの一部を含んでいますか?いくら?どの部分? –

1

保存してください:この場合は、おそらく添付ファイルのコンストラクタにそれを供給する前に、バックストリームの先頭に「模索」しなければなりません)ワークシートとワークシートを作成し、SpreadsheetDocumentをusingステートメントで囲んで、すべてのパッケージとZIPストリームがフラッシュされ、閉じられていることを確認します。

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]を、私はいくつかの努力を通して、この作業を得た。私は私が私がそれらを作成した直後に送信されていなかった、そしてその理由は、「スタンドアロン= yes」のすべてのXML宣言に追加されていなかったであることが判明し、また

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"; 

:ストリームを作成するにはページは、私のAddParts機能のため、部品を追加した後、私はこの機能にそれらを渡さ:

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

幸運を!

2

は、次の操作を行います。

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

を明らかにメモリストリームがフラッシュか何か

関連する問題