C# 试图打开.xls文件时出现错误消息

C# 试图打开.xls文件时出现错误消息,c#,excel,console,C#,Excel,Console,我正在创建一个excel文件,以便在电子邮件中发送附件。下面提供了相关的代码片段(它是一个控制台应用程序) 公共静态void sendmailwithExcelAttachment(数据表dt) { 尝试 { 字符串smptHost=smptTuple.Item1; MailMessage mailMsg=新邮件(); ............................................. ...........................................

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

公共静态void sendmailwithExcelAttachment(数据表dt)
{
尝试
{
字符串smptHost=smptTuple.Item1;
MailMessage mailMsg=新邮件();
.............................................
.............................................
字节[]数据=获取数据(dt);
//将数据保存到内存流中
System.IO.MemoryStream ms=新的System.IO.MemoryStream(数据);
mailMsg.Attachments.Add(新的System.Net.Mail.Attachment(ms,attachmentName,“application/vnd.msexcel”);
....................................
....................................
//发送电子邮件
smtpClient.Send(mailMsg);}
捕获(例外情况除外)
{
掷骰子;
}
}
私有静态字节[]GetData(数据表dt)
{
字符串strBody=DataTable2ExcelString(dt);
byte[]data=Encoding.ASCII.GetBytes(strBody);
返回数据;
}
专用静态字符串DataTable2ExcelString(System.Data.DataTable dt)
{
字符串excelSheetName=“Sheet1”;
StringBuilder sbTop=新的StringBuilder();
sbTop。追加(“”);
sbTop。追加(“”);
sbTop。追加(“”);
字符串底部=”;
StringBuilder sbHeader=新的StringBuilder();
//标题
sbHeader.追加(“”);
对于(int i=0;i
这是可行的,但当我试图从附件中打开excel文件时,我收到:


我检查了一个,在中找到了一些解决方案,但无法使其工作。我尝试使用
False
,但没有成功。

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

MS Excel为来自外部源(如电子邮件或internet)的文件显示安全警告

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


您可以在免费库(如)和商业库(如)之间进行选择。其中一些仅保存xls文件,其他仅保存xlsx文件,其中一些文件同时支持这两种文件格式。

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

MS Excel为来自外部源(如电子邮件或internet)的文件显示安全警告

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

您可以在免费库(如)和商业库(如)之间进行选择。其中一些仅保存xls文件,其他仅保存xlsx文件,少数支持两种文件格式

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

原因: 这是因为在传统的导出到Excel方法中,GridView首先转换为HTML字符串,然后将该HTML字符串导出到Excel。因此,最初它不是Excel文件,因此Excel应用程序抛出警告/错误“您试图打开的文件的格式与文件扩展名指定的格式不同”

解决方案: 这个问题的解决方案是使用ClosedXML库,它是DocumentFormat.OpenXml库的包装器

依赖项:系统中必须安装OpenXml SDK 2.0

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

原因: 这是因为在传统的导出到Excel方法中,GridView首先转换为HTML字符串,然后将该HTML字符串导出到Excel。因此,最初它不是Excel文件,因此Excel应用程序抛出警告/错误“您试图打开的文件的格式与文件扩展名指定的格式不同”

解决方案: 这个问题的解决方案是使用ClosedXML库,它是DocumentFormat.OpenXml库的包装器

依赖项:系统中必须安装OpenXml SDK 2.0


如果要创建和发送的文件不必完全采用“.xls”格式。。如果您对“.xlsx”格式感到满意。。。我想你们可能想试试图书馆,正如前面提到的。正如我所说,您必须使用“.xlsx”(您可以使用其他excel格式,但在打开文件时,您会收到关于文件格式的相同消息)。因此,您可以使用EPPlus在temp文件夹中创建Excel文件,使用
DataTable
作为备份,并通过电子邮件发送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;
        }
    }

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

如果您要创建和发送的文件不一定是“.xls”格式。。如果你感到安慰
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;
        }
    }