Выравнивание по сетке для выгрузки в Excel
При выгрузке отчета в Excel могут создаваться "лишние" строки и столбцы, которые мешают дальнейшей работе с данными. Они возникают из-за того, что элементы отчета не выровнены по сетке или "пересекаются" друг с другом. Поэтому после завершения разработки отчета рекомендуется выравнивать все созданные объекты по сетке и между собой.
Шаг выравнивания задается в настройках отчета и действует для всех страниц отчета.
Настройка шага выравнивания для отчета.
Выгрузка отчета без выравнивания элементов по сетке, в результате появляется лишняя колонка.
Выгрузка отчета после выравнивания элементов по сетке.
Условное выделение
Часто в общем списке или в таблице значений нужно выделить отдельные элементы, соответствующие каким-либо условиям. Например, отрицательные значения в таблице выделять красным цветом; ячейки, в которых факт превышает план, подсвечивать желтым фоном, и т.п. Для этих целей используется условное выделение.
1. Чтобы настроить условное выделение, кликните мышью по нужному полю или ячейке таблицы и нажмите кнопку Условное выделение на панели инструментов. Откроется окно, в котором можно настраивать одно или несколько условий.
Условное выделение ячейки таблицы
2. Чтобы добавить условие, нажмите кнопку Добавить и в открывшемся окне введите условие (проверочное выражение). В выражении можно обращаться к источникам данных, параметрам отчета, системным переменным, функциям и итогам.
Условное выделение ячейки таблицы
3. После сохранения условия настройте для него стиль выделения — шрифт, фон и пр.
Условное выделение ячейки таблицы
Для обращения к значению полей отчета или ячеек таблицы используйте параметры Value или Text. Обращайте внимание на типы полей и значений.
Например:
•Value > 100 — поле будет выделено, если значение самого поля больше 100;
•ToInt32(Cell21.Value) > ToInt32(Cell32.Value) — поле будет выделено, если значение ячейки 21 больше значения ячейки 32;
•Length(Cell11.Text) > 3 - поле будет выделено, если ячейка 11 содержит больше 3 символов.
Использование нескольких полей в проверочном выражении
Если надо сравнить значения нескольких полей отчета или ячеек таблицы — например, выделить красным фактические значения, если они превышают плановые — надо учитывать порядок заполнения полей и ячеек. К моменту проверки все поля/ячейки, к которым вы обращаетесь в проверочном выражении, должны быть уже сформированы и иметь значения.
Например, для сводной таблицы на скриншоте ниже проверку ToInt32(CellFact.Value) > ToInt32(CellPlan.Value) можно использовать в ячейке CellPlan, но не в CellFact, поскольку к моменту вывода CellFact значение в CellPlan для данной задачи еще не сформировано.
Обращение к ячейкам сводной таблицы
Для сводной таблицы может играть роль также порядок "отрисовки" — свойство Layout. Если Layout = DownThenAcross, то таблица выводится сверху вниз, а если Layout = AcrossThenDown, то слева направо.
Границы ячеек таблицы
При выводе таблицы с прозрачным фоном если для каждой ячейки заданы все границы, границы соседних ячеек накладываются друг на друга и отображаются жирными. Избежать этого можно двумя способами.
I способ
Настроить границы ячеек так, чтобы они не накладывались друг на друга. Например, в заголовке таблицы включить нижнюю границу, а в самой таблице включить у крайней левой ячейки — нижнюю, правую и левую границы (верхнюю не включать), а у остальных ячеек — только нижнюю и правую границы (верхнюю и левую не включать).
Настройка границ для ячеек таблицы
II способ
Сделать заливку (фон) ячеек не прозрачным, а белым или цветным. Тогда границы ячеек не отображаются жирным даже при наложении.
Настройка границ и фона для ячеек таблицы
|
---|
Условное выделение в сводной таблице
В сводной таблице для условного выделения цветом отдельных ячеек используется свойство ячейки Value. Например, если надо выделить красным цветом значения меньше 100, то условие проверки будет выглядеть так:
Value < 100
Если же надо сравнить значения нескольких ячеек — например, выделить красным фактические значения, если они превышают плановые — то необходимо обращаться к ячейке по ее названию. В этом случает выражение вида Cell123.Value возвращает тип "объект", который надо преобразовать к нужному типу, например, так:
ToInt32(CellFact.Value) > ToInt32(CellPlan.Value)
Однако при таким обращении следует учитывать, что к моменту проверки обе эти ячейки должны быть уже сформированы и иметь значения. Например, для таблицы на рисунке ниже такую проверку можно использовать в ячейке CellPlan, а не CellFact, поскольку к моменту вывода CellFact значение в CellPlan для данной задачи TaskName еще не сформировано.
Обращение к ячейкам сводной таблицы
Может играть роль также порядок "отрисовки" сводной таблицы — ее свойство Layout. Если Layout = DownThenAcross, то таблица выводится сверху вниз, а если Layout = AcrossThenDown, то слева направо.
Скрытие\отображение строк и колонок в сводной таблице в зависимости от условий
Иногда требуется скрывать или отображать определенные поля в отчете в зависимости от определенных условий.
Скрытие полей или бэндов отчета
Пример: для подробного отчета отображается бэнд с детализацией данных, а для сокращенного представления этот бэнд скрывается.
Скрытие бэнда с подробными данными в зависимости от выбранного пользователем параметра фильтра
Чтобы управлять отображением и скрытием поля на странице отчета, достаточно присвоить нужное значение свойству Visible:
Data1.Visible = true
или
Data1.Visible = false
Скрытие строк и колонок сводной таблицы
Пример 2: в отчете о трудозатратах пользователь может выбрать, какие данные он хочет просматривать: плановые трудозатраты (план), фактические трудозатраты (факт), остаток (т.е. план — факт). В зависимости от полей, отмеченных пользователем в фильтре, должны скрываться /отображаться колонки таблицы со сводными данными.
Скрытие колонки сводной таблицы в зависимости от выбранного пользователем параметра фильтра
Для строк и колонок сводной таблицы (pivot) использование свойства Visible не дает нужного результата. В этом случае можно использовать изменение ширины колонки или высоты строки:
// видимость колонки "Осталось" в зависимости от выбранной в фильтре детализации
if (Report.GetParameterValue("FilterColumns").ToString().Contains("осталось") == false)
ColumnRest.Width = 0;
else
ColumnRest.Width = 40;
Ширина колонки или высота строки в примере выше указывается в пикселях, но можно использовать и преобразование в сантиметры:
ColumnRest.Width = Units.Centimeters * 2; // 2 см
Обратите внимание, что для корректной работы этого способа скрытия/отображения колонок и строк необходимо следующее:
Отступы (Padding) в нужных колонках и строках должны быть убраны. Для колонок необходимо убрать отступы справа и слева, а для строк — отступы сверху и снизу
Нулевые отступы необходимы для скрытия строки\столбца
У колонок и строк свойство Autosize должно быть равно False. Чтобы отключить Autosize у колонок или строк, необходимо сначала отключить это свойство у всей таблицы. Также у колонок свойство MinWidth должно быть равно 0, а у строк свойство MinHeight должно быть равно 0.
Параметр Autosize для строки/столбца, которые необходимо скрывать, должен быть отключен
Вывод отчета без разбиения на страницы
По умолчанию при выводе отчета он разбивается на страницы. Чтобы отчет выводился без разбиения на страницы, включите для страницы опцию unlimited height. Если в отчете несколько страниц, опции надо включать для каждой из них.
![]() Вывод отчета с разбиением на страницы |
![]() Вывод отчета без разбиения на страницы |
Опцию unlimited width необходимо включать для сводных таблиц (pivot), которые "растут" в ширину.
Вывод матрицы
Таблица в таблице
В дизайнере FastReport таблицы не могут быть вложены одна в другую. Если необходимо вывести отчет вида "таблица в таблице" (см рисунок ниже), то это можно сымитировать с помощью текстовых полей.
Вложенная таблица
В этом отчете средняя часть выводится с помощью таблицы, а колонки слева и справа — с помощью текстовых полей. У текстовых полей есть свойство Duplicates, которое определяет отображение повторяющихся значений. В данном случае у всех текстовых полей этот параметр установлен в значение Merge, что означает объединение повторяющихся значений.
Формирование вложенной таблицы
Спойлеры в отчете
Спойлерами называют элементы дизайна, которые позволяют скрывать часть содержимого и раскрывать его "по запросу".
Пусть в отчете выводится список групп, а по клику на символ + рядом с названием группы выводится список ее участников.
Отчет со спойлером в интерфейсе пользователя
В дизайнере отчетов необходима группировка по названию группы. Для вывода символа свернутой/развернутой группы можно использовать элемент управления "флажок" (CheckBox). По умолчанию он отображается в виде галочки, но можно заменить его свойства CheckedSymbol и UncheckedSymbol на плюс и минус соответственно.
Отчет со спойлером в дизайнере отчетов
Также для флажка нужно настроить гиперссылку — при обработке клика по флажку из нее можно будет получить ID выбранной группы.
Свойство Hyperlink для элемента CheckBox1
Также необходимо настроить автоматизацию: для заголовка группы — обработку события BeforePrint, а для флажка — события Click:
public class ReportScript
{
private void GroupHeader1_BeforePrint(object sender, EventArgs e)
{
string groupId = ToString((Int32)Report.GetColumnValue("Table.GroupID"));
bool groupVisible = expandedGroups.Contains(groupId); // Получаем Id группы
Data1.Visible = groupVisible; // Устанавливаем видимость данных в соответствии с видимостью группы
CheckBox1.Checked = !groupVisible; // Устанавливаем состояние флажка в зависимости от видимости группы
}
private List<string> expandedGroups = new List<string>();
private void CheckBox1_Click(object sender, EventArgs e)
{
string groupId = (sender as CheckBoxObject).Hyperlink.Value; // Получаем Id группы из гиперссылки
if (expandedGroups.Contains(groupId)) // Если список видимых групп содержит выбранную группу
expandedGroups.Remove(groupId); // То удалить из списка видимых групп выбранную
else
expandedGroups.Add(groupId); // Иначе добавить группу в список видимых
Report.Refresh(); // Обновить отчет
}
}
|
---|
Изображения из БД
В "Первой Форме" файлы, вложенные в задачи и в ДП "Файл", хранятся в отдельных файловых БД. Для каждого файлового провайдера создается отдельная БД, ее название можно посмотреть в настройках. В такой БД, как правило, содержится единственная таблица UploadFiles, в которой хранятся загруженные файлы.
Чтобы в отчетах использовать изображения, вложенные в задачу или в ДП "Файл", можно использовать объект "Рисунок" (Picture), а в свойстве DataColumn этого объекта указать поле FileContent из таблицы UploadFiles.
|
---|
Например, файлы, вложенные в задачу, можно получить с помощью такой процедуры (где @TaskID — номер задачи):
ALTER PROCEDURE [dbo].[take_files]
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX), @DB_NAME NVARCHAR(MAX)
-- выбираем файл-провайдера по умолчанию, в нем хранятся файлы, вложенные в задачи
select @DB_NAME = P.Name from dbo.FileProviders P where P.UseToWriteFiles = 1
-- формируем запрос к нужной файловой БД
set @SQL = 'SELECT U.FileContent, T.Description TaskText
FROM dbo.Tasks AS T
INNER JOIN dbo.FileStorageFileToTaskLinks AS FT ON FT.TaskId = T.TaskID
INNER JOIN dbo.FileStorageFileVersions AS FV ON FT.FileId = FV.FileId INNER JOIN ' +
@DB_NAME + '.dbo.UploadFiles AS U ON FV.FileProviderKey = U.id
WHERE (T.TaskID = @TaskID) AND (FT.IsDeleted = 0)'
EXEC (@SQL)
END
Файлы, вложенные в ДП в задаче, можно получить с помощью такой процедуры (где @TaskID — номер задачи, @ExtParamID — номер ДП "Файл"):
ALTER PROCEDURE [dbo].[take_files_ep]
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX), @DB_NAME NVARCHAR(MAX), @DB_NAME_EP NVARCHAR(MAX), @DB_NAME_DEFAULT NVARCHAR(MAX)
-- выбираем файл-провайдера для нужного ДП или берем файл-провайдера по умолчанию
select @DB_NAME_EP = P.Name from dbo.ExtParamsFileSettings S JOIN dbo.FileProviders P ON S.FileProviderID = P.ID where S.ExtParamID = @ExtParamID
select @DB_NAME_DEFAULT = P.Name from dbo.FileProviders P where P.UseToWriteFiles = 1
set @DB_NAME = IsNull(@DB_NAME_EP, @DB_NAME_DEFAULT)
-- формируем запрос к нужной файловой БД
set @SQL = 'SELECT U.FileContent, T.Description TaskText
FROM dbo.Tasks AS T
INNER JOIN dbo.FileStorageFileToExtParamLinks AS FEP ON FEP.TaskId = T.TaskID AND FEP.ExtParamID = @ExtParamID
INNER JOIN dbo.FileStorageFileVersions AS FV ON FEP.FileId = FV.FileId INNER JOIN ' +
@DB_NAME + '.dbo.UploadFiles AS U ON FV.FileProviderKey = U.id
WHERE (T.TaskID = @TaskID) AND (FEP.IsDeleted = 0)'
EXEC (@SQL)
END
Вы можете сначала создать хранимые процедуры и вызывать их в отчете при создании источника данных (например, exec take_files или exec take_files_ep) или можете поместить текст запроса непосредственно в окно источника данных:
Текст запроса в окне создания источника данных
Если при создании такого источника данных поля не определились автоматически, их нужно создать вручную, указав значение Calculated = False:
Настройка полей для источника данных
![]() Пример макета отчета |
|
![]() Результат |
Изменение порядка сортировки
При работе с таблицей пользователю может потребоваться изменить первоначальный порядок сортировки записей. Например, изначально данные могут быть отсортированы по плановым показателям, а пользователю необходимо отсортировать их по фактическим данным или по названию работ. В этом случае можно предоставить пользователю возможность самостоятельно менять порядок сортировки.
В примере ниже по нажатию на шапку столбца данные в таблице сортируются по данному столбцу по убыванию значений.
Сортировка данных в столбцах по клику на название столбца
Функция привязана к событию Click для элемента TextPlan — поля шапки столбца. Здесь Data1 — это название бэнда данных, Table — название таблицы-источника данных. В метод Sort.Add() передаются два параметра: название поля и порядок сортировки (true означает сортировку по убыванию, false — по возрастанию).
private void TextPlan_Click(object sender, EventArgs e)
{
Data1.Sort.Clear();
Data1.Sort.Add(new Sort("[Table.Plan]", true));
Report.Refresh();
}
Таблица может быть отсортирована по двум и более столбцам, в этом случае потребуется последовательно вызвать метод Sort.Add() несколько раз. Аналогичные функции могут быть созданы, например, и для элементов TextFact, TextName и др. (см. скриншот выше).
Обратите внимание, что в текущей версии FastReport действуют следующие ограничения:
•Изменение сортировки из кода работает только на главной странице отчета; если у отчета есть детальные страницы, то для них такой код сгенерирует ошибку;
•Поле с названием (шапкой) столбца должно быть не ячейкой таблицы, а текстовым полем (Label).
Несколько разных страниц в отчете
Если в отчете выводится документ с несколькими разными разделами, для каждого раздела настраивается своя страница. По умолчанию при выгрузке в Word каждая новая страница отчета печатается с новой страницы. Чтобы новый раздел начал печататься на той же странице, где закончился предыдущий раздел, у соответствующей страницы отчета надо включить свойство PrintOnPreviousPage.
Первая страница данного раздела продолжит печататься на той же странице, что и последняя страница предыдущего раздела
Сохранение форматирования при выгрузке в текстовый файл
При создании печатных форм документов особенно важно сохранять форматирование текстовых полей при выгрузке отчета в файл. Оптимальным решением является выгрузка отчета в формате RFT — он лучше сохраняет исходное форматирование (переносы строк, переносы между страницами, нестандартные шрифты или междустрочное расстояние, и т.п.), чем форматы DOCX или PDF.