客户已要求我增强其中一个应用,以便发送包含Excel电子表格的电子邮件.他们碰巧有一个旧版的SpreadsheetGear(2009),所以我认为如果我使用它可能会节省时间.
事实上,SpreadsheetGear非常适合实际创建电子表格,但我无法将其作为电子邮件附件发送.只是想知道是否有人这样做过?理论上它应该很简单,我目前的代码如下:
/// <summary>
/// Creates an email attachment based upon the inbound workbook
/// </summary>
/// <param name="workbook">The workbook</param>
/// <returns>an email Attachment</returns>
private static Attachment CreateAttachment(string id, IWorkbook workbook)
{
// Open up a memorystream and save out to it
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
workbook.SaveToStream(memoryStream, SpreadsheetGear.FileFormat.OpenXMLWorkbook);
return new Attachment(memoryStream, id + ".xls", "application/vnd.ms-excel");
}
其中workbook是一个完全填充的SpreadsheetGear工作簿.在此之后,Attachment对象将被推送到System.Net.Mail.MailMessage对象中
MailMessage.Attachments.Add(attachment);
我所看到的是:
>电子邮件已发送正常,并附有正确名称的附件
>但附件是空的
在开发环境中,我将一些调试代码放在那里
workbook.SaveAs("c:\\test.xls", SpreadsheetGear.FileFormat.OpenXMLWorkbook);
它产生了所需的电子表格,作为文件.但很明显,因为我最终只是通过电子方式发送,所以如果可以的话,我会尽快避免写入磁盘.关于我出错的地方的任何指示?
谢谢,
皮特
(应该最后添加升级到最新的SpreadsheetGear不是一个选项,无论是这种方法还是手动执行!环境是VS2008,.net 3.5)
最佳答案 我尝试在你的问题中使用代码.它对我有两个小修改.
1)由于您保存为OpenXMLWorkbook格式,我将扩展名更改为.xlsx而不是.xls.
2)保存workbook.SaveToStream方法后,我添加了以下代码行.
memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
这会将位置设置为流的开头.当我尝试没有它的代码时,我在尝试打开Excel附件时收到错误.
没有这些修改,我得到了错误,但我从来没有得到一个空的附件.我使用的是最新版本的SSG,但我不明白为什么在这种情况下这应该是重要的.