错误信息wile试图打开.xls文件..如何解决?

我正在创build一个Excel文件,用于在电子邮件中发送附件。 下面提供了相关的代码片段(这是一个控制台应用程序)

public static void SendEmailWithExcelAttachment(DataTable dt) { try { string smptHost = smptTuple.Item1; MailMessage mailMsg = new MailMessage(); ............................................. ............................................. byte[] data = GetData(dt); //save the data to a memory stream System.IO.MemoryStream ms = new System.IO.MemoryStream(data); mailMsg.Attachments.Add(new System.Net.Mail.Attachment(ms, attachmentName, "application/vnd.ms-excel")); .................................... .................................... //send email smtpClient.Send(mailMsg); } catch (Exception ex) { throw ex; } } private static byte[] GetData(DataTable dt) { string strBody = DataTable2ExcelString(dt); byte[] data = Encoding.ASCII.GetBytes(strBody); return data; } private static string DataTable2ExcelString(System.Data.DataTable dt) { string excelSheetName = "Sheet1"; StringBuilder sbTop = new StringBuilder(); sbTop.Append("<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" "); sbTop.Append("xmlns=\" http://www.w3.org/TR/REC-html40\"><head><meta http-equiv=Content-Type content=\"text/html; charset=windows-1252\">"); sbTop.Append("<meta name=ProgId content=Excel.Sheet ><meta name=Generator content=\"Microsoft Excel 9\"><!--[if gte mso 9]>"); sbTop.Append("<xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>" + excelSheetName + "</x:Name><x:WorksheetOptions>"); sbTop.Append("<x:Selected/><x:ProtectContents>False</x:ProtectContents><x:ProtectObjects>False</x:ProtectObjects>"); sbTop.Append("<x:ProtectScenarios>False</x:ProtectScenarios></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets>"); sbTop.Append("<x:ProtectStructure>False</x:ProtectStructure><x:ProtectWindows>False</x:ProtectWindows></x:ExcelWorkbook></xml>"); sbTop.Append("<![endif]-->"); sbTop.Append("</head><body><table>"); string bottom = "</table></body></html>"; StringBuilder sbHeader = new StringBuilder(); //Header sbHeader.Append("<tr>"); for (int i = 0; i < dt.Columns.Count; i++) { sbHeader.Append("<td>" + dt.Columns[i].ColumnName + "</td>"); } sbHeader.Append("</tr>"); //Items for (int x = 0; x < dt.Rows.Count; x++) { sbHeader.Append("<tr>"); for (int i = 0; i < dt.Columns.Count; i++) { sbHeader.Append("<td>" + dt.Rows[x][i] + "</td>"); } sbHeader.Append("</tr>"); } string data = sbTop.ToString() + sbHeader.ToString() + bottom; return data; } 

这工作,但是当我试图从附件打开Excel文件,我收到 在这里输入图像说明

我检查了SO Post中的一个解决scheme,但无法使其工作。 我尝试像<x:DisplayAlerts>False</x:DisplayAlerts>但没有奏效。

帮忙请求。 提前谢谢了。

如果您要创build和发送的文件不必完全是“.xls”格式,并且您对“.xlsx”格式感到满意…我想您可能想尝试使用EPPlus库,因为它在这里被提到。 正如我所说的,你必须使用“.xlsx”(你可以使用其他的excel格式,但是当你打开文件的时候你会得到相同的文件格式信息)。 因此,您可以使用DataTable作为sorce在EPPlus中创build临时文件夹中的Excel文件,并通过电子邮件发送临时文件…例如:

 public static void SendEmailWithExcelAttachment(DataTable dt) { try { string smptHost = smptTuple.Item1; MailMessage mailMsg = new MailMessage(); string temp = Path.GetTempPath(); // Get %TEMP% path string file = "fileNameHere.xlsx"; string path = Path.Combine(temp, file); // Get the whole path to the file FileInfo fi = new FileInfo(path); using (ExcelPackage pck = new ExcelPackage(fi)) { ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Table"); ws.Cells["A1"].LoadFromDataTable(dt, true); pck.Save(); } mailMsg.Attachments.Add(new System.Net.Mail.Attachment(path, "application/vnd.ms-excel")); try { //send email smtp.Send(mailMsg); } catch (Exception) { //do smth.. } finally { File.Delete(path); } } catch (Exception ex) { throw ex; } } 

我创build了一个简单的DataTable,以“.xlsx”格式发送给自己,并能够在没有任何“格式警告”的情况下打开它。 我希望有帮助。

对警告/错误的解决scheme“您尝试打开的文件格式与文件扩展名指定的格式不同”

原因:

发生这种情况是因为在传统的“导出到Excel”方法中,首先将GridView转换为HTMLstring,然后将该HTMLstring导出到Excel。 因此,最初它不是Excel文件,因此Excel应用程序会抛出警告/错误“您尝试打开的文件与文件扩展名指定的文件格式不同”。

解答:

此问题的解决scheme是使用封闭在DocumentFormat.OpenXml库上的ClosedXML库。

相关性:OpenXml SDK 2.0必须安装在系统中

你可以在这里得到更多的帮助:)

该警告是由MS Excel应用程序显示,因为您的文件不是一个真正的Excel文件。 这是一个带XLS扩展名的HTML。 XLS文件是一个二进制文件。 MS Excel识别HTML文件,并在其电子表格网格中显示该文件。

MS Excel将显示来自外部来源(如电子邮件或互联网)的文件的安全警告。

最好的解决scheme是使用Excel库,以xls(旧的Excel文件格式)或xlsx(新的Excel文件格式)保存真实的Excel文件。

您可以selectNPOI , EPPlus等免费图书馆或EasyXLS等商业图书馆。 其中一些只保存xls文件,其他只有xlsx文件,其中一些文件格式支持。