2016-01-17 3 views
1

Привет, У меня есть проблема с возвратом файла с правильным кодированием.return Копирование файла (поток памяти)

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"); 
     */ 
    } 
+1

Если вы решили свои собственные проблемы, нет ничего плохого в том разместить свой собственный ответ вопрос и маркировка его приняты. (Пожалуйста, отметьте его принятым после того, как прошло 2-дневный период ожидания, если у вас нет вашего вопроса, он будет постоянно продвигаться на первую страницу в качестве вопроса без принятого ответа) –

ответ

1

ANSI не обеспечивает действительную кодировку Č, č, š, Š, Ž вы должны искать более подходящие кодировок, как UTF-8, UTF-16, UTF-32, и т.д .. ..

byte[] bytes = Encoding.UTF8.GetBytes(str.ToString()); 
string finalString = Encoding.UTF8.GetString(bytes); 

Вы пытались работать с помощью Office Interop? Было бы легче и правильно работать с 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"; 
} 

Вы можете использовать SetData метод для печати таблиц Excel файлов.

Простая инструкция:

  1. Создать экземпляр класса;
  2. Инициализировать мировое приложение, позвонив по номеру public void Initialize(bool visible) Визуальный контроль над видимостью окна Excell.
  3. Создайте новую книгу по телефону CreateWorkbok;
  4. И рабочий лист от CreateWorksheet;
  5. Работы с рабочим листом SetData - принты таблицы DataTable;
  6. Работа с текстом SetText.

Для сохранения и использования используйте SaveCurrentWorksheet и CloseCurrentWorksheet.

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

Результат звонков:

enter image description here

Или вы можете использовать Open XML SDK for Office, чтобы поддерживать многозадачную в вашем веб-приложений.

+0

UTF8Encoding encode = new UTF8Encoding(); - Это тоже не работает, любая следующая идея, пожалуйста? –

+1

Офисный интерфейс [не поддерживается] (https://support.microsoft.com/en-us/kb/257757) для использования внутри ASP.NET. Чтобы @MiroslavSiska, если вы можете переключиться на новый стандарт 'xlsx', который был выпущен, вы можете использовать [Open XML SDK for Office] (https://msdn.microsoft.com/en-us/library/office/bb448854.aspx) - это то, что Microsoft выпустила для замены взаимодействия, чтобы манипулировать файлами Office 2007 и более новыми. –

+0

Спасибо за информацию! –

1

я смог решить после того, как один день - CSV и вкладки решения .txt файл: (работающие под ядром CLR)

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

Вы должны написать свой ответ здесь, вместо того, чтобы менять «вопрос» и ссылаться на него отсюда. –

+0

Я пошел вперед и отвел свой ответ в ответ. Раздел вопросов - только для вопросов, а раздел ответа - только для ответов. – NathanOliver

Смежные вопросы