Отправка почтового вложения в использовании памяти OpenXML

Я бы использовал слово « r etur n », чтобы помнить, что r стоит перед n.

5
задан 25 June 2009 в 13:48
поделиться

3 ответа

Обдумывание нагрузки: может быть, класс 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");
0
ответ дан 14 December 2019 в 04:45
поделиться

В случае проблемы с "нечитаемым содержимым" обязательно сохраните () ваши рабочие книги и рабочие листы и включите свой 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 =  ...
1
ответ дан 14 December 2019 в 04:45
поделиться

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

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

Удачи!

5
ответ дан 14 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: