Как производить файл .xls или .xlsx с c# без сообщений предупреждения?

Я нашел в различные шрифты какие-то примеры, чтобы экспортировать информацию, содержавшую в контроле GridView (ASP.NET) или в DataTable в файл .xls или .xlsx (Excel) с C#.

В другом шрифте, я нашел следующий фрагмент кода:

/// 
/// Fuente: http://www.codeproject.com/Tips/344604/Export-to-EXCEL-from-Datatable-in-Csharp-Net
/// 
/// 
public void ExportToExcel(DataTable dt, String nombreDelArchivo)
{
    if (dt.Rows.Count > 0)
    {
        StringWriter tw = new StringWriter();
        HtmlTextWriter hw = new HtmlTextWriter(tw);
        DataGrid dgGrid = new DataGrid();
        dgGrid.DataSource = dt;
        dgGrid.DataBind();
        // Get the HTML for the control.
        dgGrid.RenderControl(hw);
        Response.ContentType = "application/xls";
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + nombreDelArchivo + "");
        Response.Write(tw.ToString());
        Response.End();
    }
}

Выполнив предыдущую функциональность, я получаю файл Excel:

Resultado del archivo Excel a partir de un DataTable.

Но до того, как Excel видит контент файла, появляется следующее предупреждение:

Mensaje de advertencia al abrir archivo Excel generado desde C#.

Нажав на кнопку предыдущей бдительности; файл появляется правильно.

Чтобы удалять предыдущую бдительность, я пробовал:

  • Менять расширение файла, которое нужно производить (.xls, .xlx, .xlsx).
  • Использовать Content-Type application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • application/vnd.ms-excel
  • application/xlsx
  • application/xls

Согласно шрифту; это функция безопасности; но я осведомлялся о, существует ли другой способ производить файл Excel с C#, считая базовой информацию, хранившуюся в одном GridView или в одном DataTable что по возможности не произвел этот тип сообщений.

5
задан 06.06.2017, 16:56
3 ответа

Каждый раз, когда ты экспортировал html и хотел увидеть это, как excel у тебя будет это сообщение.

DeberГ-Схвати использовать librerГ-туз, основанный в openxml, как то, чтобы быть

ClosedXML - The easy way to OpenXML

для того, чтобы произвелся excel правильной формы, и пошли это в Response

Si ты анализируешь пример ты увидишь, что ты можешь экспортировать прямо dataset в excel

Аддинг Дататабле, эксперт Ворксеет

Производит excel с этой librerГ - в и ты это посылаешь в Response, края, что это сообщение не deberГ, - чтобы появляться, когда ты отображаешь документ.

4
ответ дан 24.11.2019, 14:55

С Excel мы обычно работаем с двумя форматами файлов новый формат (XLSX) что начался с Excel 2007 и будь основан в XML и старый формат (XLS) что в бинарном (у тебя есть больше информации о форматах в этой ссылке)

Любой из книжных магазинов ClosedXML и EPPlus действительные, чтобы работать с файлами XLSX но они не функционируют с файлами в старом формате XLS.

Чтобы работать с файлами в старом формате (XLS), мой излюбленный выбор - используя ADO.NET, потому что позволяет использовать файл Excel как будто это была база данных.

Этот способ работать - очень подходящий, когда ты имеешь работать с достаточным количеством данных. Также у него есть Ваши ограничения, потому что ты только работаешь с данными а следовательно не могут устанавливаться форматы, цвета, широкие...

В этой статье о KB Microsoft они объясняют в детали, как делать это и код, который у тебя был бы, был бы больше или такие глупцы (код, полученный от этого ответа SO в Английском языке):

//Most of this code was from David Hayden's blog:
// http://www.davidhayden.com/blog/dave/archive/2006/05/26/2973.aspx
static void Main(string[] args)
{
    string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Temp\TestSO1.xls;Extended Properties=""Excel 8.0;HDR=NO;""";
    DbProviderFactory factory =
      DbProviderFactories.GetFactory("System.Data.OleDb");

    using (DbConnection connection = factory.CreateConnection())
    {
        connection.ConnectionString = connectionString;
        using (DbCommand command = connection.CreateCommand())
        {
            connection.Open();  //open the connection

            //use the '$' notation after the sheet name to indicate that this is
            // an existing sheet and not to actually create it.  This basically defines
            // the metadata for the insert statements that will follow.
            // If the '$' notation is removed, then a new sheet is created named 'Sheet1'.
            command.CommandText = "CREATE TABLE [Sheet1$] (F1 number, F2 char(255), F3 char(128))";
            command.ExecuteNonQuery();

            //now we insert the values into the existing sheet...no new sheet is added.
            command.CommandText = "INSERT INTO [Sheet1$] (F1, F2, F3) VALUES(4,\"Tampa\",\"Florida\")";
            command.ExecuteNonQuery();

            //insert another row into the sheet...
            command.CommandText = "INSERT INTO [Sheet1$] (F1, F2, F3) VALUES(5,\"Pittsburgh\",\"Pennsylvania\")";
            command.ExecuteNonQuery();
        }
    }
}

Конечно, также существует книжный магазин названный NPOI, который позволяет работать с файлами в обоих форматах, хотя, чтобы работать с новым форматом XLSX, я рекомендую тебя любая из двух предыдущих, потому что, а следовательно я помню, они работоспособнее.

5
ответ дан 24.11.2019, 14:55

Мой выбор излюбленный и самый простой из всех, он состоит в том, чтобы использовать книжный магазин названный EPPlus. Этот книжный магазин берется за то, чтобы производить родные файлы Excel и не просто maquilar документ HTML меняя ему расширение в XLS для того, чтобы Excel попробовал это открыться, что является тем, что ты делаешь, и разумом, из-за которого Excel достает это объявление предупреждения. С EPPLus код был бы таким:

using (ExcelPackage pck = new ExcelPackage(newFile))
{
  Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
  Response.AppendHeader("Content-Disposition", "attachment; filename=" + nombreDelArchivo + "");
  ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Nombre de la hoja");
  ws.Cells["A1"].LoadFromDataTable(dataTable, true);
  var ms = new System.IO.MemoryStream();
  pck.SaveAs(ms);
  ms.WriteTo(Response.OutputStream);  
}
0
ответ дан 24.11.2019, 14:55