Директива 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>