Я нашел в разных источниках несколько примеров экспорта информации, содержащейся в элементе управления GridView (ASP.NET) или в DataTable , в файл .xls или .xlsx (Excel) из C#.
В другом источнике я нашел следующий фрагмент кода:
/// <summary>
/// Fuente: http://www.codeproject.com/Tips/344604/Export-to-EXCEL-from-Datatable-in-Csharp-Net
/// </summary>
/// <param name="dt"></param>
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:
Но перед просмотром содержимого файла Excel появляется следующее предупреждение:
После нажатия кнопки Да из предыдущего оповещения ; файл отображается корректно.
Чтобы удалить вышеуказанное предупреждение, я попытался:
- Измените расширение файла для создания (.xls, .xlx, .xlsx).
- Используйте тип контента
application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
application/vnd.ms-excel
application/xlsx
application/xls
Согласно источнику ; это функция безопасности; но мне было интересно, есть ли другой способ создать файл Excel из С# на основе информации, хранящейся в одном GridView
или другом, DataTable
который , если возможно, не генерирует этот тип сообщения.
В Excel мы обычно работаем с двумя форматами файлов: новый формат (
XLSX
), который начинается сExcel 2007
и на котором основан,XML
и старый формат (XLS
), который является двоичным (у вас есть больше информации о форматах в этой ссылке)Любая из библиотек ClosedXML и EPPlus подходит для работы с файлами,
XLSX
но они не работают с файлами в старом форматеXLS
.Для работы с файлами в старом формате (
XLS
) я предпочитаю использовать ADO.NET, поскольку он позволяет использовать файл Excel, как если бы он был базой данных.Этот способ работы очень удобен, когда вам нужно работать с большим количеством данных. У этого также есть свои ограничения, потому что вы работаете только с данными, поэтому вы не можете устанавливать форматы, цвета, ширину, ...
В этой статье Microsoft KB они подробно объясняют, как это сделать, и код, который у вас будет, будет более или менее похож на этот ( код, полученный из этого ответа SO на английском языке ):
Кстати, есть еще библиотека под названием NPOI , которая позволяет работать с файлами в обоих форматах, хотя, для работы с новым форматом
XLSX
, я рекомендую любой из двух предыдущих, потому что, насколько я помню, они более эффективны. .Всякий раз, когда вы экспортируете html и хотите увидеть его как excel, у вас будет это сообщение.
Вы должны использовать библиотеки на основе openxml, такие как
ClosedXML — простой способ OpenXML
чтобы excel сгенерировался правильно и вы отправили его в Response
Если вы проанализируете примеры, вы увидите, что вы можете напрямую экспортировать набор данных в Excel.
Добавление DataTable в качестве рабочего листа
Создайте Excel с помощью этой библиотеки и отправьте его в ответе, вы увидите, что это сообщение не должно появляться при просмотре документа.
Мой предпочтительный и самый простой вариант — использовать библиотеку EPPlus . Эта библиотека отвечает за создание собственных файлов Excel, а не просто за создание HTML-документа путем изменения расширения на XLS, чтобы Excel пытался открыть его, что вы и делаете, и причина, по которой Excel отображает это предупреждающее уведомление. С EPPLus код будет таким: