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