ZYD*_*ZYD 7 c# email excel attachment
我有一个Excel文件(Excel 2003中/ XLS格式),我想通过电子邮件与C#来发送.我的代码成功发送,但是当我尝试打开响应文件时,它似乎编码错误.
例如,这里是响应文件名:
= _utf-8_B_RWxzesOhbW9sw6FzXzIwMTJfMTBfMTZf.dat
这是响应文件本身:
?= UTF-8乙VEdWdmJIWmhjMkZ1Wk1Pelh6UXlYekZmPz0NCiA9P3V0Zi04P0I/VGtW =\\ = UTF-8乙TlgwZFRXaTU0YkhNPT89 ="内容传输编码:???????的base64 Content-Disposition的:附着
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAA AQAAAAAAAAAAEAAAIwAAAAEAAAD + //// AAAAAAAAAAD ///////////////////// //////////////////// //////////////////////////////////////////// ////// //////////////////////// ....
这是我的代码片段:
...
var attachment = new Attachment(WriteFileToMemory("fileFullPath"), "fileName.xls");
attachment.ContentType = new ContentType("application/vnd.ms-excel");
attachmentCollection.Add(attachment);
...
private Stream WriteFileToMemory(string filePath)
{
var memoryStream = new MemoryStream();
_openedStreams.Add(memoryStream);
using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
var bytes = new byte[file.Length];
file.Read(bytes, 0, (int) file.Length);
memoryStream.Write(bytes, 0, (int) file.Length);
file.Close();
}
memoryStream.Position = 0;
return memoryStream;
}
Run Code Online (Sandbox Code Playgroud)
如何设置附件编码类型,以及我应该使用哪些编码与Excel文件?
请帮我解决这个问题.提前致谢.
正如@Magnus指出的那样,你正在使它过于复杂,new Attachment()可以处理FileStreams,所以只需将新的文件流传递给构造函数即可.
...
var attachment = new Attachment(File.Open("fileFullPath", FileMode.Open), "fileName.xls");
attachment.ContentType = new ContentType("application/vnd.ms-excel");
attachmentCollection.Add(attachment);
...
Run Code Online (Sandbox Code Playgroud)
虽然有点警告,但是有点偏离主题,你不能多次发送这样的邮件,因为流不会总是正确地重置自己.
小智 5
如果您想从 DataTable 生成 Excel 并通过邮件发送,您可以按如下方式附加 Excel 文件:
Workbook theWorkbook = new Workbook();
theWorkbook.SetCurrentFormat(WorkbookFormat.Excel2007);
Worksheet theWorkSheet = theWorkbook.Worksheets.Add("Sheet1");
int iRow = 0;
int iColumn = 0;
theWorkSheet.Rows[0].CellFormat.Font.Bold = ExcelDefaultableBoolean.True;
//Titles
foreach (DataColumn column in DataTable.Columns)
{
theWorkSheet.Rows[iRow].Cells[iColumn].Value = column.ColumnName;
iColumn++;
}
//Values
foreach (DataRow row in DataTable.Rows)
{
iColumn = 0;
iRow++;
foreach (var item in row.ItemArray)
{
theWorkSheet.Rows[iRow].Cells[iColumn].Value = item.ToString();
iColumn++;
}
}
System.IO.MemoryStream theStream = new System.IO.MemoryStream();
theWorkbook.Save(theStream);
byte[] byteArr = theStream.ToArray();
System.IO.MemoryStream stream1 = new System.IO.MemoryStream(byteArr, true);
stream1.Write(byteArr, 0, byteArr.Length);
stream1.Position = 0;
message.Attachments.Add(new Attachment(stream1, "filename.xlsx"));
Run Code Online (Sandbox Code Playgroud)
它至少适用于 .NET framework 4 和 Excel 2016。
问候。
我找到了一个解决方案:
...
var attachment = CreateAttachment(WriteFileToMemory(Common.TempPath + excelName), excelName);
attachmentCollection.Add(attachment);
...
private Stream WriteFileToMemory(string filePath)
{
var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
_openedStreams.Add(fileStream);
return fileStream;
}
public static Attachment CreateAttachment(Stream attachmentFile, string displayName)
{
var attachment = new Attachment(attachmentFile, displayName);
attachment.ContentType = new ContentType("application/vnd.ms-excel");
attachment.TransferEncoding = TransferEncoding.Base64;
attachment.NameEncoding = Encoding.UTF8;
string encodedAttachmentName = Convert.ToBase64String(Encoding.UTF8.GetBytes(displayName));
encodedAttachmentName = SplitEncodedAttachmentName(encodedAttachmentName);
attachment.Name = encodedAttachmentName;
return attachment;
}
private static string SplitEncodedAttachmentName(string encoded)
{
const string encodingtoken = "=?UTF-8?B?";
const string softbreak = "?=";
const int maxChunkLength = 30;
int splitLength = maxChunkLength - encodingtoken.Length - (softbreak.Length * 2);
IEnumerable<string> parts = SplitByLength(encoded, splitLength);
string encodedAttachmentName = encodingtoken;
foreach (var part in parts)
{
encodedAttachmentName += part + softbreak + encodingtoken;
}
encodedAttachmentName = encodedAttachmentName.Remove(encodedAttachmentName.Length - encodingtoken.Length, encodingtoken.Length);
return encodedAttachmentName;
}
private static IEnumerable<string> SplitByLength(string stringToSplit, int length)
{
while (stringToSplit.Length > length)
{
yield return stringToSplit.Substring(0, length);
stringToSplit = stringToSplit.Substring(length);
}
if (stringToSplit.Length > 0)
{
yield return stringToSplit;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27106 次 |
| 最近记录: |