我有一个使用OpenXML 2构建的Excel文件,我想将其作为电子邮件附件发送.例如
System.IO.MemoryStream stream = new System.IO.MemoryStream();
SpreadsheetDocument package = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook))
AddParts(package); //created using document reflector
Run Code Online (Sandbox Code Playgroud)
使用将电子表格保存到临时文件
stream.WriteTo(new System.IO.FileStream(@"c:\test.xlsx", System.IO.FileMode.Create));
Run Code Online (Sandbox Code Playgroud)
工作良好.但是尝试直接将流作为电子邮件附件发送失败 - 当我这样做时,只需在电子邮件中附加一个空文件
System.Net.Mail.Attachment file = new System.Net.Mail.Attachment(stream, "MobileBill.xlsx", "application/vnd.ms-excel");
Run Code Online (Sandbox Code Playgroud)
有人知道怎么做吗?
小智 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";
Run Code Online (Sandbox Code Playgroud)
另外,我发现在创建它之后没有立即发送我的,并且其原因是"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();
}
Run Code Online (Sandbox Code Playgroud)
祝好运!
考虑负载:附件类是否希望从提供的流中的当前位置读取?如果是这种情况,您可能必须“寻找”回到流的开头,然后再将其提供给附件构造函数:
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");
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4142 次 |
最近记录: |