Забыли пароль?

Экспорт отчета в FastReport.OpenSource

Dmitriy Fedyashov

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.

Похожие статьи:

назад