错误消息试图打开.xls文件

时间:2017-05-04 05:16:07

标签: c# excel console

我正在创建一个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文件时,我收到:

enter image description here

我在SO Post检查了一个找到的解决方案,但无法使其正常工作。我尝试过<x:DisplayAlerts>False</x:DisplayAlerts>,但没有工作。

2 个答案:

答案 0 :(得分:2)

如果您要创建和发送的文件不必完全采用“.xls”格式..如果您对“.xlsx”格式感到满意......我想您可能想尝试使用{{ 3}}库,如前所述[{3}}。正如我所说,你必须使用“.xlsx”(你可以使用其他excel格式,但是当你打开文件时,你会得到关于文件格式的相同信息)。因此,您可以使用DataTable作为带有EPPlus的临时文件夹创建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;
        }
    }

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

答案 1 :(得分:1)

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

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

最佳解决方案是使用Excel库以xls(旧Excel文件格式)或xlsx(新Excel文件格式)保存真实Excel文件。

您可以选择NPOIEPPlus等免费图书馆或EasyXLS等商业图书馆。其中一些只保存xls文件,其他只保存xlsx文件,其中一些文件支持两种文件格式。