FastReport.OpenSource вызвал не малый интерес у многих разработчиков. Это отличный генератор отчетов с длинной историей. Версия с открытым исходным кодом представляет собой FastReport.Core, появившийся в начале 2018го года, но с некоторыми ограничениями. А именно – урезанный экспорт. Таким образом нам доступны лишь следующие форматы:
HTML, BMP, PNG, JPEG, GIF, TIFF, EMF.
Это, конечно, очень мало. Объект WebReport отображает отчет в html формате, поэтому его и оставили.
Примечательно, что в объекте WebReport, нам доступно сохранение отчета только в формат предварительного просмотра fpx.
Поэтому экспортировать отчет придется из кода приложения. Давайте рассмотрим, как это будет выглядеть на примере.
Я опишу подробно весь процесс создания демонстрационного приложения, чтобы вы могли повторить при желании.
Создаем проект ASP .Net Core 2.0. Далее добавляем пакеты из NuGet хранилища: FastReport.OpenSource и FastReport.OpenSource.Web.
Теперь нужно добавить использование библиотек FastReport в файл Startup.cs
Воспользуемся представлением Index. Изменим его так:
1 2 3 4 5 6 7 8 |
@using (Html.BeginForm("Save", "Home", FormMethod.Get)) { <input id="save" type="submit" value="Save report in HTML" /> } <div> <img src ='@Url.Action("GetImage")'> </div> |
Мы выведем отчет в формате рисунка, а также ссылку на скачивание отчета в HTML формате.
Вначале у нас отобразится кнопка на скачивание, которая инициирует формирование html файла отчета. Затем идет изображение. Но файл для него будет сформирован «на лету» из метода GetImage в контроллере.
Перейдем к контроллеру HomeController.cs. Нам понадобятся библиотеки:
1 2 3 4 5 6 7 8 9 |
using System.IO; using System.Diagnostics; using Microsoft.AspNetCore.Mvc; using OpenSourceReportExport.Models; using FastReport; using FastReport.Export.Image; using FastReport.Export.Html; using System.Data; using Microsoft.AspNetCore.Hosting; |
Чтобы задавать корректные пути к файлам на сервере воспользуемся интерфейсом IHostingEnvironment. Для этого передаем в конструктор контроллера объект типа IHostingEnvironment.
1 2 3 4 5 6 |
public HomeController(IHostingEnvironment hostingEnvironment) { _hostingEnvironment = hostingEnvironment; } private IHostingEnvironment _hostingEnvironment; |
Метод Index оставляем без изменений:
1 2 3 4 |
public IActionResult Index() { return View(); } |
Добавим новый метод для получения отчета в виде изображения. Т.е. экспорт в изображение, например, формат jpeg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public IActionResult GetImage() { // Creatint the Report object using (Report report = new Report()) { string path = _hostingEnvironment.WebRootPath; // Loading a report report.Load(path + "\\App_Data\\Master-Detail.frx"); DataSet data = new DataSet(); data.ReadXml(path + "\\App_Data\\nwind.xml"); //Open xml database report.RegisterData(data, "NorthWind"); //Register data source in the report report.Prepare();// Preparing a report // Creating the Image export using (ImageExport image = new ImageExport()) { image.ImageFormat = ImageExportFormat.Jpeg; image.JpegQuality = 100; // Set up the quality image.Resolution = 100; // Set up a resolution image.SeparateFiles = false; // We need all pages in one big single file using (MemoryStream st = new MemoryStream())// Using stream to save export { report.Export(image, st); return base.File(st.ToArray(), "image/jpeg"); } } } } |
Второй метод – сохранение экспорта отчета в формат html. По сути то же самое, что и в предыдущем.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[HttpGet] public ActionResult Save() { using (Report report = new Report()) { string path = _hostingEnvironment.WebRootPath; // Loading a report report.Load(path + "\\App_Data\\Master-Detail.frx"); DataSet data = new DataSet(); data.ReadXml(path + "\\App_Data\\nwind.xml"); //Open xml database report.RegisterData(data, "NorthWind"); //Register data source in the report report.Prepare();// Preparing a report // Creating the HTML export using (HTMLExport html = new HTMLExport()) { using (FileStream st = new FileStream(path + "\\App_Data\\test.html", FileMode.Create)) { report.Export(html, st); return File("App_Data/test.html", "application/octet-stream", "Test.html"); } } } } |
В этом методе мы получили один файл html. И это значит, что в нем не будет картинок. Чтобы сохранить html файл с картинками, нужно сохранять файлы в цикле. Пример такого экспорта можно посмотреть в документации FastReport Open Source: https://fastreports.github.io/FastReport.Documentation/Exporting.html.
Давайте запустим наше приложение:
Изображение содержит все страницы отчета, потому что мы задали свойство SeparateFiles = false. В противном случае – пришлось бы отображать несколько файлов.
Нажимаем кнопку Save report in HTML:
И файл автоматически загружается браузером.
На этом все. Как видите, реализация экспорта в коде в FastReport Open Source ничем не отличается от FastReport.Core.