C# 返回文件(内存流)编码
嗨,我有问题返回正确的编码文件C# 返回文件(内存流)编码,c#,asp.net-mvc,C#,Asp.net Mvc,嗨,我有问题返回正确的编码文件 finalString仅用于控制编码并显示正确的字符串,但返回的excel文件不包含正确的捷克字符。。。有人能帮我吗 byte[] bytes = encode.GetBytes(str.ToString()); string finalString = encode.GetString(bytes); 下面是完整的课程: public async Task<IActionResult> ExportExcel() { //
finalString
仅用于控制编码并显示正确的字符串,但返回的excel文件不包含正确的捷克字符。。。有人能帮我吗
byte[] bytes = encode.GetBytes(str.ToString());
string finalString = encode.GetString(bytes);
下面是完整的课程:
public async Task<IActionResult> ExportExcel()
{
// List<Material> obj = new List<Material>();
// obj = await _context.Material.ToListAsync();
StringBuilder str = new StringBuilder();
str.Append("<table border=`" + "1px" + "`b>");
str.Append("<tr>");
str.Append("<td><b>Id</b></td>");
str.Append("<td><b>Name</b></td>");
str.Append("</tr>");
// foreach (Material val in obj)
// {
str.Append("<tr>");
str.Append("<td>" + "0" + "</td>");
str.Append("<td>" + Česnek + "</td>");
str.Append("<td><font face=Arial Narrow size=" + "14px" + ">" + val.Name.ToString() + "</font></td>");
str.Append("</tr>");
// }
str.Append("</table>");
string uc = Configuration.UserCulture;
int codepage = 1250; // _cultureDataProvider.GetAnsiCodePage(uc);
Encoding encode = Encoding.GetEncoding(codepage);
byte[] bytes = encode.GetBytes(str.ToString());
string finalString = encode.GetString(bytes);
MemoryStream stream = new MemoryStream(bytes);
return File(stream, "application/vnd.ms-excel", "excel.xls");
/*
HttpContext.Response.Headers.Add("content-disposition", "attachment; filename=Information" + DateTime.Now.Year.ToString() + ".xls");
this.Response.ContentType = "application/vnd.ms-excel";
byte[] temp = System.Text.Encoding.ASCII.GetBytes(str.ToString());
return File(temp, "application/vnd.ms-excel");
*/
}
public异步任务ExportExcel()
{
//List obj=新列表();
//obj=wait_context.Material.toListSync();
StringBuilder str=新的StringBuilder();
str.Append(“”);
str.Append(“”);
str.Append(“Id”);
str.Append(“名称”);
str.Append(“”);
//foreach(对象中的物料值)
// {
str.Append(“”);
str.Append(“+”0“+”);
str.Append(“+Česnek+”);
str.Append(“+val.Name.ToString()+”);
str.Append(“”);
// }
str.Append(“”);
字符串uc=Configuration.UserCulture;
int codepage=1250;//_cultureDataProvider.GetAnsiCodePage(uc);
Encoding encode=Encoding.GetEncoding(代码页);
byte[]bytes=encode.GetBytes(str.ToString());
string finalString=encode.GetString(字节);
MemoryStream stream=新的MemoryStream(字节);
返回文件(流,“application/vnd.ms excel”、“excel.xls”);
/*
HttpContext.Response.Headers.Add(“内容处置”,“附件;文件名=信息”+DateTime.Now.Year.ToString()+”.xls”);
this.Response.ContentType=“应用程序/vnd.ms excel”;
byte[]temp=System.Text.Encoding.ASCII.GetBytes(str.ToString());
返回文件(temp,“application/vnd.ms excel”);
*/
}
ANSI没有为č、č、š、Ž、Ž提供有效的编码
您应该寻找更合适的代码页,如UTF-8、UTF-16、UTF-32等
byte[] bytes = Encoding.UTF8.GetBytes(str.ToString());
string finalString = Encoding.UTF8.GetString(bytes);
您是否尝试使用Office互操作?使用Excel会更简单、更正确
这是一个简单的工作表管理器
public class ExcelManager
{
public ExcelManager()
{
ItsApplication = null;
ItsWorkbook = null;
ItsWorksheet = null;
AppInitialization = false;
WrbInitialization = false;
WrsInitialization = false;
}
/*////////////////////////////////////////////////////*/
public void Initialize(bool visible)
{
try
{
if (ItsApplication == null)
{
ItsApplication = new Microsoft.Office.Interop.Excel.Application();
ItsApplication.SheetsInNewWorkbook = 1;
ItsApplication.Visible = visible;
AppInitialization = true;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error!!!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
public void CreateWorkbook()
{
try
{
if (ApplicationInitialized)
{
ItsWorkbook = ItsApplication.Workbooks.Add(MissingValue);
WrbInitialization = true;
}
else
MessageBox.Show(
"Couldnot create workbook!\n" +
"App instance didnot initialized!",
"Error!!!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error!!!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
public void CreateWorksheet()
{
try
{
if (WorkbookInitialized)
{
ItsWorksheet = ItsWorkbook.Worksheets.Add(MissingValue,
MissingValue, MissingValue, MissingValue);
WrsInitialization = true;
CurrentRow = 1;
}
else
MessageBox.Show(
"Couldnot create worksheet!\n" +
"Workbook didnot created!",
"Error!!!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error!!!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
public void SetText(string text,int bold,int italic,int cells_offset)
{
try
{
if (WorksheetInitialized)
{
ArrayList lines_list = new ArrayList();
string curr_line = "";
for (int i = 0; i < text.Length; i++)
{
if (text[i] == '\n' || (i == text.Length - 1))
{
lines_list.Add(curr_line);
curr_line = "";
}
curr_line += text[i];
}
CurrentRow += cells_offset;
foreach (object line in lines_list)
{
Range text_range =
ItsWorksheet.get_Range("A" + CurrentRow, "A" + CurrentRow);
text_range.Font.Bold = bold;
text_range.Font.Italic = italic;
text_range.Value2 = line;
text_range.WrapText = false;
CurrentRow++;
}
}
else
MessageBox.Show(
MessageBox.Show(
"Cannot output any text!\n" +
"Worksheed didnot created!",
"Error!!!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error!!!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
public void SetData(System.Data.DataTable table, int bold, int italic,int rows_offset)
{
try
{
if (WorksheetInitialized)
{
CurrentRow += rows_offset;
int TableRows = table.Rows.Count;
int TableCols = table.Columns.Count;
char ACol = 'A';
Range TableRange = ItsWorksheet.get_Range("A" + CurrentRow,
((char)((int)ACol + TableCols - 1)).ToString() + (CurrentRow + TableRows).ToString());
TableRange.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
for (int i = 0; i < TableCols; i++)
{
Range names_range = ItsWorksheet.get_Range(((char)((int)ACol + i)).ToString() + CurrentRow,
((char)((int)ACol + i)).ToString() + CurrentRow);
names_range.Value2 = table.Columns[i].ColumnName;
}
for (int i = 1; i < TableRows + 1; i++)
{
for (int j = 0; j < TableCols; j++)
{
Range cell_range = ItsWorksheet.get_Range(((char)((int)ACol + j)).ToString() + (CurrentRow + i),
((char)((int)ACol + j)).ToString() + (CurrentRow + i));
cell_range.Value2 = table.Rows[i - 1].ItemArray[j];
cell_range.Font.Bold = bold;
cell_range.Font.Italic = italic;
}
}
CurrentRow += TableRows;
}
else
MessageBox.Show(
"Cannot output any text!\n" +
"Worksheed didnot created!",
"Error!!!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error!!!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
public void SaveCurrentWorksheet(string filename)
{
try
{
ItsWorksheet.SaveAs(filename,
MissingValue,
MissingValue,
MissingValue,
MissingValue,
MissingValue,
MissingValue,
MissingValue,
MissingValue,
MissingValue);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error!!!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
public void CloseCurrentWorksheet()
{
if (WorkbookInitialized)
{
ItsWorkbook.Close(MissingValue,
MissingValue,
MissingValue);
ItsApplication.Quit();
WrbInitialization = false;
WrsInitialization = false;
AppInitialization = false;
}
}
public bool ApplicationInitialized
{
get
{
return AppInitialization;
}
}
public bool WorkbookInitialized
{
get
{
return WrbInitialization;
}
}
public bool WorksheetInitialized
{
get
{
return WrsInitialization;
}
}
////////////////////////////////////////////////////////
private _Application ItsApplication;
private _Worksheet ItsWorksheet;
private _Workbook ItsWorkbook;
// Initialization flags
private bool AppInitialization;
private bool WrbInitialization;
private bool WrsInitialization;
// Positioning text in rows
private int CurrentRow;
////////////////////////////////////////////////////////
// Define static members of class
private static object MissingValue = System.Reflection.Missing.Value;
private static object EndOfDocument = "\\endofdoc";
}
通话结果:
或者,您可以使用,来支持web应用程序中的多任务。一天后我就能够解决它-csv和tab.txt文件解决方案:(在核心CLR下工作)
公共异步任务导出(字符串类型)
{
string _OuputType=type.ToLower().Trim();
string _delimiter=_OuputType.Contains(“csv”)?“;”:string.Empty;
_delimiter=\u OuputType.Contains(“txt”)?:\u delimiter;
IEnumerable data=wait_context.Material.Include(m=>m.Unit).toListSync();
StringBuilder str=新的StringBuilder();
//文件名
字符串fileName=“Material-”+DateTime.Now.ToString(“dd_-MM_-yyyy-H_-MM_-ss”);
//头
str.Append(“名称”+_分隔符+“\t”);
str.Append(“自动规划”+_分隔符+“\t”);
str.Append(“QuantityMinStock”+_分隔符+“\t”);
str.Append(“QuantityMaxStock”+_分隔符+“\t”);
str.Append(“QuantityPurchase”+_分隔符+“\t”);
str.Append(“单位”+_分隔符+“\t”);
str.Append(“\r\n”);
//资料
foreach(数据中的物料m)
{
str.Append(m.id+_分隔符+“\t”);
str.Append(m.Name+_分隔符+“\t”);
str.Append(m.AutoPlan+_分隔符+“\t”);
str.Append(m.QuantityMinStock+_分隔符+“\t”);
str.Append(m.QuantityMaxStock+_分隔符+“\t”);
str.Append(m.QuantityPurchase+_分隔符+“\t”);
str.Append(m.Unit.LocalizedCode+_分隔符+“\t”);
str.Append(“\r\n”);
}
//int codepage=_cultureDataProvider.GetAnsiCodePage(Configuration.UserCulture);==这是我获取代码页的服务(例如:1250或1252等)
Encoding encode=Encoding.GetEncoding(_cultureDataProvider.GetAnsiCodePage(Configuration.UserCulture));
byte[]bytes=encode.GetBytes(str.ToString());
如果(_OuputType==“txt”){返回文件(字节,“text/plain”,fileName+“.txt”);}
返回文件(字节,“应用程序/msexcel”,文件名+“.csv”);
}
UTF8Encoding encode=新的UTF8Encoding();-这不太管用,有什么下一步的想法吗?用于ASP.NET内部的Office互操作。对于@MiroslavSiska,如果您可以切换到随发布的较新的xlsx
标准,您可以使用microsoft发布的来取代interop来操作Office 2007和更新的文件。请参阅UPDATE-1-这在核心CLR下工作。它现在的快速解决方案(传递到导出(字符串类型)参数:txt或csv,操作将返回.csv或.txt文件)…@Miroslav Siska:Glad可以帮助您!)祝你好运如果你解决了自己的问题,那么发布自己的答案并将其标记为已接受并没有什么错。(请在2天等待期结束后将其标记为已接受,如果您不接受,您的问题将继续作为未接受答案的问题升级到头版)此代码中有一些IDisPobles需要处理,否则您可能会造成内存泄漏您应该在此处发布答案,而不是更改您的“问题”从这里开始,我把你的答案移到了答案中。问题部分仅用于提问,回答部分仅用于回答。
ExcelManager excel_manager = new ExcelManager()
excel_manager.Initialize(true);
excel_manager.CreateWorkbook();
excel_manager.CreateWorksheet();
excel_manager.SetText("Česnek!", 1, 0, 0);
excel_manager.SetData(systemTable, 0, 0, 2);
excel_manager.SetText("Лог консолі!", 1, 0, 3);
public async Task<IActionResult> Export(string type)
{
string _OuputType = type.ToLower().Trim();
string _delimiter = _OuputType.Contains("csv") ? ";" : String.Empty;
_delimiter = _OuputType.Contains("txt") ? "" : _delimiter;
IEnumerable<Material> data = await _context.Material.Include(m => m.Unit).ToListAsync();
StringBuilder str = new StringBuilder();
//file name
string fileName = "Material-" + DateTime.Now.ToString("dd_MM_yyyy-H_mm_ss");
//head
str.Append("Name" + _delimiter + "\t");
str.Append("AutoPlan" + _delimiter + "\t");
str.Append("QuantityMinStock" + _delimiter + "\t");
str.Append("QuantityMaxStock" + _delimiter + "\t");
str.Append("QuantityPurchase" + _delimiter + "\t");
str.Append("Unit" + _delimiter + "\t");
str.Append("\r\n");
//data
foreach (Material m in data)
{
str.Append(m.id + _delimiter + "\t");
str.Append(m.Name + _delimiter + "\t");
str.Append(m.AutoPlan + _delimiter + "\t");
str.Append(m.QuantityMinStock + _delimiter + "\t");
str.Append(m.QuantityMaxStock + _delimiter + "\t");
str.Append(m.QuantityPurchase + _delimiter + "\t");
str.Append(m.Unit.LocalizedCode + _delimiter + "\t");
str.Append("\r\n");
}
// int codepage = _cultureDataProvider.GetAnsiCodePage(Configuration.UserCulture); == This is my service to get code page (example: 1250, or 1252 etc...)
Encoding encode = Encoding.GetEncoding(_cultureDataProvider.GetAnsiCodePage(Configuration.UserCulture));
byte[] bytes = encode.GetBytes(str.ToString());
if (_OuputType == "txt"){return File(bytes, "text/plain", fileName + ".txt");}
return File(bytes, "application/msexcel", fileName + ".csv");
}