Директива qTableExport
Директива qTableExport позволяет выгрузить данные из таблицы в формате excel.
С чего начать
Установите библиотеку
npm install @diasoft/qpalette-table-addonsИмпортируйте модуль дрективы:
import { QTableExportModule } from '@diasoft/qpalette-table-addons';
imports: [
...
QTableExportModule,
...
]Встройте директиву в тег таблицы и укажите в ней API, в которой хранятся данные для таблицы:
Использование
Для скачивания данных существует два способа:
-
Горячие клавиши Alt + P
-
По кнопке
Реализация данного способа зависит от выбранной настройки скачивания данных, которые рассмотренны в разделеНастройка -> Скачивание по кнопке
Настройка
Фильтры
Чтобы, при выгрузке данных, учитывались значения фильтров из шапки таблицы, сортировка и другие настройки, необходимо их передать через свойство директивыqteSearchParams. Они совместно с переданной API будут использованы в качестве параметров для запроса данных.
ДляqteSearchParamsнеобходимо передать объект, где ключ - наименование фильтра таблицы, значение - подготовленные http-параметры.
export class customersTable {
filters = {
name: 'ci(contains(тест))',
systemName: 'ci(contains(qd))',
sort: 'changeDate,desc',
page: 0
}
}Максимальное количество
Для установки максимального количества данных, которое может экспортировать пользователь, необходимо передать выбранное количество свойствуqteMaxTotalRecordsForExport. По умолчанию данное значение равно 500.
Необходимо отметить, что при увеличении данного параметра, нагрузка на приложение находится в ответственности разработчика.
Выбор стобцов
Для выбора выгружаемых столбцов, необходимо передать массив с их наименованиями свойствуqteCurrentCols.
{{ colsNamesExample }}Поскольку лежащая в основе библиотека не принимает вложенные данные, то директива преобразует их вJSON.
Кастомизация
Самотоятельно подготовленные или кастомизированные данные готовые к экспорту необходимо передать свойствуqteCurrentCols. Формат данных должен представлять массив простых объектов, где ключ - это наименование столбца, а значение является простым типом.
{{ colsDataExample }}Экспорт по кнопке
Для скачивания по кнопке, необходимо использовать метод директивы export(). Если вы передаёте катомизированные данные, то они сразу экспортируются, без показа диалогового окна.
{{ exportButtonTemplateExample }}Если вы передаёте катомизированные данные через свойствоqteCurrentCols, то они сразу экспортируются, без показа диалогового окна.
Пример
<p-card
styleClass="projects-card p-card--no-padding p-card--no-border p-mb-0"
*ngIf="{
table: (tableData$ | async),
loading: (isLoading$ | async)
} as data"
>
<ng-template pTemplate="header">
<div class="q-header p-ai-center p-mb-0 p-p-3">
<h1 class="q-header__title p-pl-0">Проекты</h1>
</div>
<div class="q-header__filter-wrapper">
<form class="projects__filters q-flex q-flex--gap-1" [formGroup]="filtersForm">
<q-filter-wrapper label="Наименование:">
<input pInputText type="text" formControlName="name"/>
</q-filter-wrapper>
<q-filter-wrapper label="Автор:">
<input pInputText type="text" formControlName="author"/>
</q-filter-wrapper>
</form>
<div class="projects__actions">
<button
pButton
class="p-button-text p-button-secondary p-button-icon-only p-button-tiny"
icon="pi pi-cloud-upload"
pTooltip="Выгрузить"
tooltipPosition="left"
(click)="download()"
></button>
</div>
</div>
</ng-template>
<div class="full-view">
<div class="full-view__container">
<div class="table-wrapper">
<p-table
#table
qTableExport="{ { api } }"
[customFilters]="filtersForm.valueChanges | async"
responsiveLayout="scroll"
styleClass="p-datatable-unstriped"
scrollHeight="flex"
[lazy]="true"
[loading]="data.loading ?? false"
[value]="data.table?.data ?? []"
[rows]="rows"
[rowsPerPageOptions]="[5, 10, 30, 50]"
[scrollable]="true"
[columns]="columns"
[paginator]="true"
[totalRecords]="data.table?.totalItems ?? 0"
(onLazyLoad)="loadData($event)"
>
<ng-template pTemplate="header">
<tr>
<th [pSortableColumn]="column.field" *ngFor="let column of columns">
<span>{ { column.header } }</span>
<p-sortIcon *ngIf="column.field !== 'systemName'" [field]="column.field"
[style.margin-left]="'.5rem'"></p-sortIcon>
<p-columnFilter *ngIf="column.field === 'systemName'" type="text" field="systemName" display="menu"
[showOperator]="false" [showAddButton]="false"
[style.margin-left]="'.5rem'"></p-columnFilter>
</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-project>
<tr class="table-body">
<td *ngFor="let column of columns">
<span *ngIf="column.field !== 'changeDate'">{ { project[column.field] ?? "" } }</span>
</td>
</tr>
</ng-template>
<ng-template pTemplate="paginatorleft">
<div class="flex align-items-center justify-content-between">
Итого: { { data.table?.totalItems ?? 0 } } записей.
</div>
</ng-template>
</p-table>
</div>
</div>
</div>
</p-card>