Отправка вложения электронной почты в память с помощью OpenXML

У меня есть файл Excel, созданный с использованием OpenXML 2, и я хочу отправить его как вложение электронной почты. например

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

Кто-нибудь знает, как это сделать?


person Community    schedule 25.06.2009    source источник


Ответы (4)


Хорошо, у меня это работает, хотя и с некоторыми усилиями. Чтобы создать поток:

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

Кроме того, я обнаружил, что мои не отправлялись сразу после того, как я их создал, и причина в том, что "standalone = yes" не добавлялось в объявление xml всех страниц, поэтому в моей функции 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();            
        }

Удачи!

person Aaron McCoy    schedule 05.04.2010

сделай это:

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

Видимо поток памяти не сбрасывается или что-то в этом роде

person Isaac    schedule 18.11.2011

Для решения проблемы «нечитаемое содержимое» не забудьте сохранить () свои рабочие книги и рабочие листы и заключить свой 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 =  ...
person foson    schedule 03.07.2009

Обдумывание нагрузки: может быть, класс Attachment ожидает чтения из текущей позиции в предоставленном потоке? В этом случае вам, вероятно, придется «искать» обратно в начало потока, прежде чем передать его конструктору 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");
person Jørn Schou-Rode    schedule 25.06.2009
comment
благодаря. добираюсь туда - он отправляет данные сейчас, так как я вижу, что размер вложения увеличился. Но Excel жалуется, что содержимое не читается. - person ; 25.06.2009
comment
Можете ли вы сохранить вложение и каким-то образом сравнить его с тем же файлом, который сохранен в вашем примере stream.WriteTo ()? Является ли новый файл полностью мусорным или он содержит некоторые ожидаемые данные? Сколько? Какие части? - person Jørn Schou-Rode; 26.06.2009