簡體   English   中英

嘗試打開.xls文件的錯誤消息

[英]Error message wile trying to open .xls file

我正在動態創建一個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中發現的一些解決方案,但無法使其正常工作。 我試過像<x:DisplayAlerts>False</x:DisplayAlerts>但是沒有用。

如果您要創建和發送的文件不必完全使用“ .xls”格式,並且對“ .xlsx”格式不滿意...我想您可能想嘗試一下EPPlus庫,因為它在這里被提及。 正如我說過的,您必須使用“ .xlsx”(您可以使用其他excel格式,但是打開文件時會收到有關文件格式的相同消息)。 因此,您可以使用DataTable作為DataTable源,在EPPlus的temp文件夾中創建Excel文件,並通過電子郵件發送該temp文件。例如:

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”格式發送給自己,並且能夠在沒有任何“ Format warnings”的情況下打開它。 希望對您有所幫助。

MS Excel應用程序顯示警告,因為您的文件不是真正的Excel文件。 這是帶有XLS擴展名的HTML。 XLS文件是二進制文件。 MS Excel識別HTML文件,並在其電子表格網格中顯示該文件。

MS Excel為來自外部來源(如電子郵件或Internet)的文件顯示安全警告。

最好的解決方案是使用一個Excel庫,該庫以xls(舊的Excel文件格式)或xlsx(新的Excel文件格式)保存真實的Excel文件。

你可以像免費圖書館之間進行選擇NPOIEPPlus或商業庫像EasyXLS 其中一些僅保存xlsx文件,另一些僅保存xlsx文件,其中一些支持兩種文件格式。

警告/錯誤的解決方案“您要打開的文件格式與文件擴展名指定的格式不同”

原因:

發生這種情況是因為在傳統的“導出到Excel”方法中,首先將GridView轉換為HTML字符串,然后將該HTML字符串導出到Excel。 因此,最初它不是Excel文件,因此Excel應用程序會引發警告/錯誤“您嘗試打開的文件格式與文件擴展名指定的格式不同”。

解決方案:

解決此問題的方法是使用ClosedXML庫 ,該是DocumentFormat.OpenXml庫的包裝器。

相關性:必須在系統中安裝OpenXml SDK 2.0

您可以在這里獲得更多幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM