Как использовать FastRerport.Core в приложении Vue.js

30.06.2019

Фреймворк Vue.js сейчас очень популярен и стоит в одном ряду с Angular. Как использовать FastReport.Core в Angular приложении мы уже рассматривали. Теперь посмотрим, как реализовать отображение веб отчета FastReport в одностраничном приложении на Vue.js с бекендом на ASP .Net Core.

Для работы нам потребуется установить Node.js и Net Core SDK 2.0 или более «свежий». По умолчанию dotnet sdk не имеет шаблона приложения vue. Но его можно установить. Для этого создайте каталог, в котором вы хотите разместить ваше будущее приложение и запустите в нем командную строку PowerShell. Это можно сделать из контекстного меню, которое вызывается правым кликом по пустому пространству в папке с зажатой клавишей shift.

В командной строке вводим команду:

dotnet new — install Microsoft.AspNetCore.SpaTemplates::*

После этого вам будет доступен шаблон Vue для генерации демонстрационного приложения.

Воспользуемся им и создадим приложение командой:

dotnet new vue -o FRCoreVue

После создания приложения вы увидите предупреждение, что необходимо выполнить команду:

npm install

Но прежде чем выполнить ее нужно перейти в созданный каталог:

cd FRCoreVue

После установки всех нужных пакетов открываем файл проекта .csproj.

Для работы с FastReport устанавливаем пакеты в менеджере NuGet. Выбираем локальный источник пакетов, расположенный в папке: J:\Program Files (x86)\FastReports\FastReport.Net\Nugets.

Устанавливаем пакеты: FastReport.Core и FastReport.Web.

Чтобы отображать отчеты нам потребуются шаблоны отчетов и источник данных для них. Поэтому в каталоге wwwroot создаем папку App_Data и помещаем туда желаемые шаблоны отчетов и базу данных (если вы используете файловый источник данных).

 

В файле Startup.cs добавим строку кода в метод Configure:

app.UseFastReport();

В папке Controllers откройте файл SampleDataController.cs. В этом классе уже есть несколько демонстрационных методов, они нам не нужны, их можно смело удалять. Вместо них добавим свой метод:

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
30
31
32
33
34
35
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using FastReport.Web;
using Microsoft.AspNetCore.Hosting;
 
namespace FRCoreVue.Controllers
{
 [Route("api/[controller]")]
 public class SampleDataController : Controller
 {
 
 private IHostingEnvironment _env;
 
 public SampleDataController(IHostingEnvironment env)
 {
 _env = env;
 }
 [HttpGet("[action]")]
 public IActionResult DisplayReport(string name)
 {
 var webRoot = _env.WebRootPath;
 WebReport WebReport = new WebReport();
 WebReport.Width = "1000";
 WebReport.Height = "1000";
 WebReport.Report.Load(System.IO.Path.Combine(webRoot, (String.Format("App_Data/{0}.frx", name)))); //Загружаем отчет в объект WebReport
 System.Data.DataSet dataSet = new System.Data.DataSet(); //Создаем источник данных
 dataSet.ReadXml(System.IO.Path.Combine(webRoot, "App_Data/nwind.xml")); //Открываем базу данных xml
 WebReport.Report.RegisterData(dataSet, "NorthWind"); //Регистрируем источник данных в отчете
 ViewBag.WebReport = WebReport; //передаем отчет во View
 
 return View();
 }
}

Метод DisplayReport принимает параметр name, который представляет собой имя отчета. Таким образом этот метод загружает нужный шаблон отчета в объект WebReport. Сделайте правый клик на сигнатуре метода и выберите из меню Add view….

Откроется окно создания представления. Просто нажимаем Ok. Заменяем код в созданном представлении на:

1
@await ViewBag.WebReport.Render()

Теперь перейдем к клиентскому приложению на Vue. В дереве проекта разверните папку ClientApp->components. Здесь размещены компоненты: страницы, меню и др. Мы создадим свой компонент. Добавим папку report. В ней создадим файл report.vue.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<template>
 <div>
 <div id="app">
 <select v-model="report">
 <option>Matrix</option>
 <option>Master-Detail</option>
 <option>Barcode</option>
 </select>
 </div>
 <button v-on:click="Clicked">Show Report</button>
 <div v-if="show">
 <iframe :id="report" height="1000" width="1000" :src="url"></iframe>
 </div>
 </div>
</template>
 
<script src="./report.ts"></script>

В шаблоне страницы будет отображен выпадающий список отчетов. Выбрав значение и нажав кнопку Show Report будет отображен фрейм с отчетом. За отображение фрейма отвечает переменная-флаг show. По умолчанию ее значение false и фрейм не отображается. Но после загрузки отчета, ее значение изменится на true и фрейм будет показан. Теперь реализуем скрипт для обработки шаблона report.ts, который мы добавим в ту же папку report:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import Vue from 'vue';
import { Component } from 'vue-property-decorator';
 
@Component
export default class ReportComponent extends Vue {
 report: string = 'Matrix';
 url: string = '';
 show: boolean = false;
 
 Clicked() {
 if (this.report != null) {
 this.show = true;
 this.url = "api/SampleData/DisplayReport?name=" + this.report;
 }
 }
}

Переменная report имеет значение по умолчанию, для того, чтобы в выпадающем списке оно было выбрано изначально. Функция Clicked формирует ссылку к методу в контроллере с учетом выбранного имени отчета, а также задает значение флага show.

Теперь уберем ненужные ссылки на демонстрационные страницы из бокового меню сайта в файле  navmenu.vue.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<template>
 <div class="main-nav">
 <div class="navbar navbar-inverse">
 <div class="navbar-header">
 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 <span class="sr-only">Toggle navigation</span>
 <span class="icon-bar"></span>
 <span class="icon-bar"></span>
 <span class="icon-bar"></span>
 </button>
 <a class="navbar-brand" href="/">FRCoreVue</a>
 </div>
 </div>
 </div>
</template>
 
<style src="./navmenu.css" />

А также отредактируем файл boot.ts, в котором загружаются компоненты: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import './css/site.css';
import 'bootstrap';
import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
 
const routes = [
 { path: '/', component: require('./components/report/report.vue.html') }
];
 
new Vue({
 el: '#app-root',
 router: new VueRouter({ mode: 'history', routes: routes }),
 render: h => h(require('./components/app/app.vue.html'))
});

Теперь наш компонент будет отображен на главной странице. Запустим приложение:

Мы видим пустую страницу с выпадающим списком и кнопкой. Раскройте выпадающий список:

 

Нам доступно три отчета. Давайте выберем Master-Detail и нажмем кнопку Show Report:

 

И мы получаем отчет. При этом нам доступны все функции из панели инструментов веб отчета. Например, экспорт:

Мы реализовали отображение веб отчета в одностраничном приложении, писанном на Vue.js. Как видите, реализация достаточно проста благодаря настроенной связке Vue + ASP .Net Core.

20 ноября 2024

Локализация и смена языков в FastReport VCL

FastReport VCL поддерживает 40 языков для локализации интерфейса и позволяет изменять язык на лету через меню или код, без перекомпиляции.
1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.