Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/14: Рейтинг темы: голосов - 14, средняя оценка - 5.00
15 / 14 / 2
Регистрация: 17.08.2012
Сообщений: 109
.NET Core

FastReport.Net - как правильно сделать экспорт в цикле?

22.03.2021, 20:02. Показов 2964. Ответов 5

Студворк — интернет-сервис помощи студентам
Салют, коллеги!

Задача следующая. Нужно сформировать по шаблону FRX отчеты в FastReport двумя способами:
а) вход - список заказов, шаблон, выход - отдельный файл по каждому заказу;
б) вход - список заказов, шаблон, выход - один файл, который содержит инфу по заказам из списка.

Если вариант А достаточно просто оказалось сделать, то вот с Б я впал в ступор. На вход методу подается List<Order> orders и файл шаблона. В цикле foreach я беру номер заказа и подставляю его в SQL запрос. Затем пытаюсь подготовить полученные в TableDataSource данные, но, что было ожидаемо, файл затирается данными из последнего запроса. Подскажите, можно ли как-то сохранить промежуточный результат, чтобы потом в один файл все сохранить? Код на данный момент:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
report = new Report();
report.Load("\\template.frx");
TableDataSource tds = { /* инициализация по алиасу в frx */ }
 
foreach (var o in orders) {
    var sqlText = "SELECT * FROM myTable WHERE numOrder = '" + o.Num + "'";
    tds.SelectCommand = sqlText;
 
    report.Prepare();
}
 
using( /* экспорт в Word 2007*/ )
{
    // ...
    word2007.Export(report, fileName);
    // ...
}
Подозреваю, что копать надо в другую сторону, туда, где будет сложнее, но пока что пытаюсь идти по "лёгкому" пути, о котором на каждом шагу пишут разработчики генератора. Только вот не нашел примеров генерации отчетов, когда данные готовятся в циклах for/foreach...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.03.2021, 20:02
Ответы с готовыми решениями:

ADO.NET и MS Word - экспорт таблиц, как сделать одним махом
Здесь приводится пример, как одним махом перенести таблицу из рекордсета в документ Word: http://support.microsoft.com/kb/261999 Как...

VB .NET. Форма авторизации - как сделать правильно?
Всем привет. Речь пойдет о Visual Studio 2010 / visual basic 2010. Я на .NET платформу перешел недавно. В связи с этим появилось...

Экспорт из FastReport в PDF
Здравствуйте! Не сталкивался ли кто-нибудь с такой проблемой: в программе формируется отчёт с помощью объекта frxReport, затем с...

5
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
22.03.2021, 20:29
У метода 'Prepare' должна быть перегруженная версия с bool-параметром 'append'.

Добавлено через 3 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        //
        // Summary:
        //     Prepares the report.
        //
        // Parameters:
        //   append:
        //     Specifies whether the new report should be added to a report that was prepared
        //     before.
        //
        // Returns:
        //     true if report was prepared succesfully.
        //
        // Remarks:
        //     Use this method to merge prepared reports.
        public bool Prepare(bool append);
0
15 / 14 / 2
Регистрация: 17.08.2012
Сообщений: 109
22.03.2021, 21:24  [ТС]
Это да, проверил первым делом. Без цикла то оно работает, как и в примере из документации - https://fastreports.github.io/... eport.html

Но в цикле почему-то не добавляет. В отладке не заметил, меняется ли что-то ещё, кроме текста sql-запроса да количества строк в tds.

Завтра попробую завернуть в трюкач, мб есть какое-то исключение, которое обычным способом не вываливается при исполнении
0
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
22.03.2021, 21:57
Проверил на простом примере со статическими данными, всё ок, 'append = true' дополняет отчёт в цикле:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public static byte[] BuildReport(string templateFile, List<object> reportData)
        {
            var rpt = new Report();
            rpt.Load(templateFile);
 
            foreach(var data in reportData)
            {
                rpt.RegisterData(new List<object>() { data }, "ReportData");
                rpt.Prepare(true);
            }
 
            //Export ...
1
15 / 14 / 2
Регистрация: 17.08.2012
Сообщений: 109
23.03.2021, 19:36  [ТС]
Вспомнил, у меня дублировались данные по самому первому айтему, потому всё стёр. Сегодня всё переделал, дубли были из-за того, что Load и TableDataSource вынес из цикла. Внёс назад. Полный рабочий код:
C#
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public static class ReportGenerator
{
    private static readonly string exportPath = Settings.Default.Word2007ExportPath;
    /* FastReport EnvironmentSettings */
    
    public static void CreateReportInMultipleFiles(string templateFile, List<Order> ordersList)
    {
        Report report;
        TableDataSource tds;
        
        foreach (var order in ordersList)
        {
            report = new Report();
            report.Load(templateFile);
            tds = report.GetDataSource("Table") as TableDataSource;
            tds.SelectCommand = "SELECT * FROM myTable WHERE numOrder = '" + order.Num + "'";
            report.Prepare();
            
            // Если SelectCommand ничего не вернет, то нужно исключить пустые файлы
            if (tds.RowCount > 0)
            {
                using (var word2007 = new FastReport.Export.OoXML.Word2007Export())
                {
                    word2007.ShowProgress = false;
                    word2007.Export(report, exportPath);
                }
            }   
        }
    }
    
    public static void CreateReportInOneFile(string templateFile, List<Order> ordersList)
    {
        Report report = new Report();
        TableDataSource tds;
        var pageCount = 0; // Кол-во готовых страниц в документе
 
        foreach (var order in ordersList)
        {
            report.Load(templateFile);
            tds = report.GetDataSource("Table") as TableDataSource;
            tds.SelectCommand = "SELECT * FROM myTable WHERE numOrder = '" + order.Num + "'";
            
            // обязательно вызвать Init(), иначе значение RowCount будет равно 0 и обновится только после вызова Prepare(), как в первом варианте
            tds.Init();
 
            // Аналогичная проверка, только для пустых страниц
            if (tds.RowCount > 0)
            {
                report.Prepare(true);
                pageCount = pageCount + tds.RowCount;
            }
        }
        // Исключаем пустой документ
        if (pageCount > 0)
        {
            using (var word2007 = new FastReport.Export.OoXML.Word2007Export())
            {
                word2007.ShowProgress = false;
                word2007.Export(report, exportPath);
            }
        }
    }
}
Пока читал документацию, развил экстрасенсорные способности
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
23.03.2021, 21:22
sql injection vulnerable
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.03.2021, 21:22
Помогаю со студенческими работами здесь

Экспорт данных из RichTextBox в FastReport в формат RTF
при экспорте данных из RichTextBox в файле все форматирование пропадает. Когда я я экспортирую в PDF еще более менее а в RTF се на...

Как в FastReport сделать альбомный лист A4?
Fast report 5. не могу найти что-то) Добавлено через 31 секунду т.е перевернуть боком лист

Как с помощью FastReport сделать чек по выбранной строке таблицы
Здравствуйте! Меня интересует как с помощью FastReport сделать чек по выбранной строке таблицы. Собственно у меня передаются все строки...

Работа с FastReport.Net
Надеюсь тут есть люди кто работал с FastReport.Net.Net В FastReport я передаю массив strring, как мне обратиться к нему из кода? так...

Как правильно задать условие в цикле?
Постоянно сталкиваюсь с тем, что не могу правильно задать условие в цикле. Из-за этого приходится делать костыли. Вот например: s =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru