При разработке очередного PHP приложения возникла необходимость в отчетности. Имел большой опыт работы с генератором отчетов FastReport .Net, поэтому задался целью использовать его. К сожалению, вариант с веб-отчетами отпадает, так как ASP .Net в этом проекте у нас не используется. Родилась идея использовать REST вебсервис, который будет строить отчет и отдавать php приложению. О разработке сервиса я расскажу позже, а сейчас пока остановимся непосредственно на процессе построения отчета и подготовке его к отправке через REST. Для простоты я покажу это на примере консольного приложения.
Для работы понадобятся библиотеки FastReport:
1 2 3 |
using FastReport; using FastReport.Export.Html; using FastReport.Utils; |
Название отчета буду передавать параметром:
1 2 3 4 5 6 7 |
static void Main(string[] args) { if (args.Length > 0) DoExport(args[0]); else Console.WriteLine("Set the report file (*.frx) as parameter"); } |
Создаем метод экспорта в HTML и архивации в ZIP:
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 |
private static void DoExport(string reportFile) { if (File.Exists(reportFile)) { Config.WebMode = true; // включаем режим WebMode чтобы включить thread-safe code using (Report report = new Report()) // создаем экземпляр объекта отчета { report.Load(reportFile); // загружаем отчет из файла report.Prepare(); // подготавливаем отчет using (HTMLExport html = new HTMLExport()) // создаем экземпляр объекта экспорта в HTML { html.SaveStreams = true; // включаем режим сохранения в поток report.Export(html, (Stream)null); // устанавливаем целевой поток в null - у нас есть несколько потоков внутри объекта экспорта if (html.GeneratedFiles.Count > 0) { ZipArchive zip = new ZipArchive(); // создаем экземпляр объекта zip-архива for(int i = 0; i < html.GeneratedFiles.Count; i++) zip.AddStream(html.GeneratedFiles[i], html.GeneratedStreams[i]); // добавляем потоки с именами файлов в архив zip.SaveToFile(Path.GetFileNameWithoutExtension(reportFile) + ".zip"); // записываем zip в файл } } } } else Console.WriteLine("File " + reportFile + " not found!"); } |
Тут нужно отметить свойство Config.WebMode – оно включает «тихий» режим генерации отчетов без выдачи любых диалогов и прогресс баров.
В этом примере я упаковываю один отчет, но ничто не мешает положить в архив несколько.
Теперь, запускаем приложение в консоли с параметром. В параметре указываем путь к отчету. И получаем в папке с приложением zip-архив, в котором упакован отчет в формате html. Таким образом, используя веб сервис, можно передать в мое php (или другое) веб приложение архив с одним или несколькими отчетами, готовыми к отображению.