5

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

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

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

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

正常に動作します。しかし、電子メールの添付ファイルとしてストリームを直接送信しようとすると失敗します。送信すると、空のファイルが電子メールに添付されます。

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

これを行う方法を知っている人はいますか?

4

4 に答える 4

5

わかりました、私はこれを機能させましたが、多少の努力が必要です。ストリームを作成するには:

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

また、作成した直後に送信されていないことがわかりました。その理由は、すべてのページの xml 宣言に「standalone=yes」が追加されていなかったため、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();            
        }

幸運を!

于 2010-04-05T18:20:00.220 に答える
2

これを行う:

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

どうやらメモリストリームがフラッシュされていないか、何か

于 2011-11-18T14:18:29.130 に答える
1

「コンテンツが読めない」問題については、ワークブックとワークシートを Save() し、SpreadsheetDocument を using ステートメントで囲んで、すべてのパッケージと圧縮されたストリームがフラッシュされ、閉じられていることを確認してください。

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 =  ...
于 2009-07-03T06:21:52.843 に答える
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");
于 2009-06-25T13:58:32.413 に答える