C# 如何修复文件格式和扩展名don';在邮件中发送excel附件时不匹配警报
我已经使用xml代码创建了一个excel文件并通过电子邮件发送,但当我从电子邮件下载打开时,它显示“文件格式和'Repairorder.xls'的扩展名不匹配。该文件可能已损坏或不安全。除非您信任其源,否则不要打开它。是否仍要打开它?” 下面是我的代码C# 如何修复文件格式和扩展名don';在邮件中发送excel附件时不匹配警报,c#,asp.net,C#,Asp.net,我已经使用xml代码创建了一个excel文件并通过电子邮件发送,但当我从电子邮件下载打开时,它显示“文件格式和'Repairorder.xls'的扩展名不匹配。该文件可能已损坏或不安全。除非您信任其源,否则不要打开它。是否仍要打开它?” 下面是我的代码 var attachments = new List<KeyValuePair<string, byte[]>>(); private static string ExcelHeader() {
var attachments = new List<KeyValuePair<string, byte[]>>();
private static string ExcelHeader()
{
// Excel header
var sb = new StringBuilder();
sb.Append(" <?xml version=\"1.0\"?>");
sb.Append("<?mso-application progid=\"Excel.Sheet\"?>");
sb.Append("<Workbook ");
sb.Append(" xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");
sb.Append(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
sb.Append(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
sb.Append(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");
sb.Append(" xmlns:html=\"http://www.w3.org/TR/REC-html40\">");
return sb.ToString();
}
public static string GetStyles()
{
return @" <Styles>
<Style ss:ID=""Default"" ss:Name=""Normal"">
<Alignment ss:Vertical=""Bottom""/>
<Borders/>
<Font/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID=""s27"" ss:Name=""Hyperlink"">
<Font ss:Color=""#0000FF"" ss:Underline=""Single""/>
</Style>
<Style ss:ID=""s24"">
<Font x:Family=""Swiss"" ss:Bold=""1""/>
</Style>
<Style ss:ID=""s25"">
<Font x:Family=""Swiss"" ss:Italic=""1""/>
</Style>
<Style ss:ID=""s26"">
<Alignment ss:Horizontal=""Center"" ss:Vertical=""Bottom""/>
</Style>
</Styles>";
}
public static KeyValuePair<string, byte[]> CreateExcelSingleSheet(List<RepairOrderStatusObject> repairOrderStatusObjects, string componentName, int userId)
{
string xlsFileName = string.Format("RepairOrderStatus_dated_{0}_{1}.xls", componentName, DateTime.Now.ToString("MMMM_dd_yyyy")); // Excel file name.
var strExcelXml = new StringBuilder();
strExcelXml.Append(ExcelHeader());
strExcelXml.Append(GetStyles());
strExcelXml.Append(ConvertHTMLToExcelXML(ExcelWorkSheet(repairOrderStatusObjects, componentName, userId)));
strExcelXml.Append("</Workbook>\n");
var ms = new MemoryStream();
var writer = new StreamWriter(ms, Encoding.Unicode);
writer.Write(strExcelXml.ToString());
writer.Flush();
var buffer = new byte[ms.Length];
ms.Position = 0;
ms.Read(buffer, 0, buffer.Length);
writer.Close();
ms.Close();
return new KeyValuePair<string, byte[]>(xlsFileName, buffer);
}
private static string ExcelWorkSheet(List<RepairOrderStatusObject> repairOrderStatusObjects, string name, int userId)
{
var strExcelXml = new StringBuilder();
strExcelXml.Append("<Worksheet ss:Name=\"Repair Order Status List\"><Table><tr>");
List<ExportToExcelSetup> excelSetupList = ExportToExcelSetup.GetRepairOrderStatusUserFields(userId, repairOrderStatusObjects[0].ComponentType);
var onlySelected = excelSetupList.Where(x => x.IsSelected).ToList();
foreach (ExportToExcelSetup excelSetup in onlySelected)
{
strExcelXml.AppendFormat("<td>{0}</td>", excelSetup.Name);
}
strExcelXml.Append("</tr>");
//var sortingColumn = ExportToExcelSetup.GetRepairOrderStatusUserFieldSortingColum(userId, FokkerComponentType.Schiphol);
//var listsorted = repairOrderStatusObjects.OrderBy(q=> q.GetType().GetProperty(sortingColumn.Replace(" ","").Replace(".", "")).GetValue(q, null));
//string dbSortingColumn = ExportToExcelSetup.GetRepairOrderStatusUserFieldSortingColum(MyFokkerFleetPrincipal.CurrentPrincipal.UserID, FokkerComponentType.Schiphol);
//var sortingColumn = FindSortColumn(dbSortingColumn);
//var listsorted = repairOrderStatusObjects.OrderBy(q=> q.GetType().GetProperty(sortingColumn).GetValue(q, null));
foreach (RepairOrderStatusObject repairOrderStatusObject in repairOrderStatusObjects)
{
strExcelXml.Append("<tr>");
foreach (ExportToExcelSetup excelSetup in onlySelected)
{
object value;
try
{
if (((ExportToExcelFieldsEnum) excelSetup.ID) == ExportToExcelFieldsEnum.Messages)
{
value = repairOrderStatusObject.ComponentType == FokkerComponentType.Schiphol
? SchipholRepairOrderStatus.ShopFindings(repairOrderStatusObject.ID)
: repairOrderStatusObject.ShopFindingsAll;
value = Regex.Replace(value.ToString(), "<.*?>", " "); //Remove HTML-tags from the value
}
else
{
value = repairOrderStatusObject.GetType().GetProperty(
((ExportToExcelFieldsEnum)excelSetup.ID).ToString()).GetValue(repairOrderStatusObject, null);
}
}
catch (Exception)
{
value = "Unknown";
}
strExcelXml.AppendFormat("<td>{0}</td>", value == null?"": System.Web.HttpUtility.HtmlEncode(value.ToString()));
}
strExcelXml.Append("</tr>");
}
strExcelXml.Append("</Table></Worksheet>");
return strExcelXml.ToString();
}
public static string ConvertHTMLToExcelXML(string strHtml)
{
// Just to replace TR with Row
strHtml = strHtml.Replace("<tr>", "<Row ss:AutoFitHeight=\"1\">\n");
strHtml = strHtml.Replace("</tr>", "</Row>\n");
//replace the cell tags
strHtml = strHtml.Replace("<td>", "<Cell><Data ss:Type=\"String\">");
strHtml = strHtml.Replace("</td>", "</Data></Cell>\n");
return strHtml;
}
private static Attachment ConvertXlsToAttachment(string fileName, byte[] fileContents)
{
string directory = Settings.TempPath;
if (!Directory.Exists(directory)) Directory.CreateDirectory(directory);
string xlsFilePath = Path.Combine(directory, fileName);
File.WriteAllBytes(xlsFilePath, fileContents);
var fs = new FileStream(xlsFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
// Make a ContentType indicating that the file data
// that is attached is of a type and is named.
var ct = new ContentType
{
MediaType = "application/vnd.ms-excel",
Name = Path.GetFileName(xlsFilePath)
};
// Attachment.
return new Attachment(fs, ct);
}
private static Attachment ConvertXlsToAttachment(string fileName, byte[] fileContents)
{
string directory = Settings.TempPath;
if (!Directory.Exists(directory)) Directory.CreateDirectory(directory);
string xlsFilePath = Path.Combine(directory, fileName);
File.WriteAllBytes(xlsFilePath, fileContents);
var fs = new FileStream(xlsFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
// Make a ContentType indicating that the file data
// that is attached is of a type and is named.
var ct = new ContentType
{
MediaType = "application/vnd.ms-excel",
Name = Path.GetFileName(xlsFilePath)
};
// Attachment.
return new Attachment(fs, ct);
}
var attachments=新列表();
私有静态字符串ExcelHeader()
{
//Excel标题
var sb=新的StringBuilder();
某人加上(“”);
某人加上(“”);
某人加上(“”);
使某人返回字符串();
}
公共静态字符串GetStyles()
{
返回@”
";
}
public static KeyValuePair CreateExcelSingleSheet(列出repairOrderStatusObjects、字符串组件名称、int userId)
{
string xlsFileName=string.Format(“RepairOrderStatus_dated_{0}{u{1}.xls”),componentName,DateTime.Now.ToString(“MMMM_dd_yyyy”);//Excel文件名。
var strExcelXml=新的StringBuilder();
Append(ExcelHeader());
Append(GetStyles());
Append(ConvertHTMLToExcelXML(Excel工作表(repairOrderStatusObjects,componentName,userId));
strExcelXml.Append(“\n”);
var ms=新内存流();
var writer=newstreamwriter(ms,Encoding.Unicode);
Write(strExcelXml.ToString());
writer.Flush();
var buffer=新字节[ms.Length];
ms.Position=0;
ms.Read(缓冲区,0,缓冲区长度);
writer.Close();
Close女士();
返回新的KeyValuePair(xlsFileName,缓冲区);
}
专用静态字符串Excel工作表(列出repairOrderStatusObjects、字符串名称、int userId)
{
var strExcelXml=新的StringBuilder();
strExcelXml.Append(“”);
List excelSetupList=ExportToExcelSetup.GetRepairOrderStatusUserFields(用户ID,repairOrderStatusObjects[0].ComponentType);
var onlySelected=excelSetupList.Where(x=>x.IsSelected.ToList();
foreach(ExportToExcelSetup excelSetup仅在选定的范围内)
{
AppendFormat(“{0}”,excelSetup.Name);
}
strExcelXml.Append(“”);
//var sortingColumn=ExportToExcelSetup.GetRepairOrderStatusUserFieldSortingColum(userId,FokkerComponentType.Schiphol);
//var listsorted=repairOrderStatusObjects.OrderBy(q=>q.GetType().GetProperty(sortingColumn.Replace(“,”).Replace(“,”).GetValue(q,null));
//字符串dbSortingColumn=ExportToExcelSetup.GetRepairOrderStatusUserFieldSortingColum(myFokkerFoetPrincipal.CurrentPrincipal.UserID,FokkerComponentType.Schiphol);
//var sortingColumn=FindSortColumn(dbSortingColumn);
//var listsorted=repairOrderStatusObjects.OrderBy(q=>q.GetType().GetProperty(sortingColumn.GetValue(q,null));
foreach(RepairOrderStatusObject中的RepairOrderStatusObject RepairOrderStatusObject)
{
strExcelXml.Append(“”);
foreach(ExportToExcelSetup excelSetup仅在选定的范围内)
{
目标价值;
尝试
{
if(((ExportToExcelFieldsEnum)excelSetup.ID)==ExportToExcelFieldsEnum.Messages)
{
value=repairOrderStatusObject.ComponentType==FokkerComponentType.Schiphol
?SchipholRepairOrderStatus.ShopFindings(repairOrderStatusObject.ID)
:repairOrderStatusObject.ShopFindingsAll;
value=Regex.Replace(value.ToString(),“”,“”);//从值中删除HTML标记
}
其他的
{
值=repairOrderStatusObject.GetType().GetProperty(
((ExportToExcelFieldsEnum)excelSetup.ID).ToString()).GetValue(repairOrderStatusObject,null);
}
}
捕获(例外)
{
value=“未知”;
}
AppendFormat(“{0}”,value==null?”:System.Web.HttpUtility.HtmlEncode(value.ToString());
}
strExcelXml.Append(“”);
}
strExcelXml.Append(“”);
返回strExcelXml.ToString();
}
公共静态字符串ConvertHTMLToExcelXML(字符串strHtml)
{
//只是将TR替换为Row
strHtml=strHtml.Replace(“,”\n”);
strHtml=strHtml.Replace(“,”\n”);
//替换单元格标签
strHtml=strHtml.Replace(“,”);
strHtml=strHtml.Replace(“,”\n”);
返回strHtml;
}
私有静态附件ConvertXlsToAttachment(字符串文件名,字节[]文件内容)
{
string directory=Settings.TempPath;
如果(!Directory.Exists(Directory))Directory.CreateDirectory(Directory);
字符串xlsFilePath=Path.Combine(目录,文件名);
writealBytes(xlsFilePath,fileContents);
var fs=new FileStream(xlsFilePath,FileMode.Open,FileAccess.Read,FileShare.Read);
//创建一个ContentType,指示文件数据
//所附加的是一种类型,名为。
var ct=新的ContentType
{
MediaType=“应用程序/vnd.ms excel”,
Name=Path.GetFileName(xlsFilePath)
};
//附件。
返回新附件(fs、ct);
}
私有静态附件ConvertXlsToAttachment(字符串文件)