Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回文件(内存流)编码_C#_Asp.net Mvc - Fatal编程技术网

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");
   }