我正在尝试将Excel文件作为附件输出到ASP.NET,很难用土耳其语对其进行编码。以下代码是我所做的;我将尝试尝试的行保留为注释:
var collection = Data.Get<Students>()
.Where(t => t.Year == activeYear)
.OrderBy(t => t.Name);
var total = collection.Count();
DataTable dt = collection.ToDataTable();
dt.Columns.Remove("Id");
string htmlCode = "<table>";
//add header row
htmlCode += "<tr>";
htmlCode += "<td>#</td>";
for (int i = 0; i < dt.Columns.Count; i++)
{
htmlCode += "<td>" + dt.Columns[i].ColumnName + "</td>";
}
htmlCode += "</tr>";
//add rows
for (int i = 0; i < dt.Rows.Count; i++)
{
htmlCode += "<tr>";
htmlCode += "<td>" + (dt.Rows.Count-i+1).ToString() + "</td>";
for (int j = 0; j < dt.Columns.Count; j++)
{
htmlCode += "<td>" + dt.Rows[i][j].ToString() + "</td>";
}
htmlCode += "</tr>";
}
htmlCode += "</table>";
////////////////////////////////////
// Encoding part begins here
////////////////////////////////////
var output = htmlCode;
Encoding encoding = new UTF8Encoding(true); //Encoding.UTF8; //new UTF8Encoding(true);
var utf8bytes = encoding.GetBytes(output);
utf8bytes = Encoding.UTF8.GetPreamble().Concat(utf8bytes).ToArray();
byte[] bytes = new UTF8Encoding(true).GetBytes(output);
//MemoryStream stream = new MemoryStream(utf8bytes);
MemoryStream stream = new MemoryStream(bytes);
StreamReader reader = new StreamReader(stream);
Response.Clear();
Response.Buffer = true;
Response.ClearContent();
string attachment = "attachment; filename=" + Utils.Security.RemoveDiacritics(currentLesson + "-" + activeYear) + ".xls";
Response.AddHeader("content-disposition", attachment);
//Response.ContentType = "application/octet-stream";
Response.ContentType = "application/vnd.ms-excel";
Response.ContentEncoding = new UTF8Encoding(true); //Encoding.GetEncoding("windows-1254"); // Encoding.UTF8;
Response.Output.Write(reader.ReadToEnd());
Response.Flush();
Response.End();
如果我使用新的UTF8Encoding(true)或false,则输出始终是没有签名的UTF8。如果我在Notepad2中打开文件并使用签名将其编码为UTF8,则名称将正确显示。
这是下载的Excel文件,并且在Excel中名称不正确:
这是记事本2中经过修改的Excel文件,并且名称在Excel中显示正确:
要更正名称,我用Notepad2打开下载的xls文件,并将编码从UTF8更改为具有签名的UTF8。现在,如何在服务器端执行此操作?
更新:文件之间的区别如下所示,显示在HEX编辑器屏幕快照中,在xls纯文本文件的开头仅添加了3个字节:
如果要使用utf-8和bom发送字节列表,则应将3个字节写在头部。
您可以将三个字节0xEF,0xBB,0xBF
写入您的字节列表头以使字节列表成为带Bom编码的utf-8