2011-12-27 1 views
1

Разочарованный ограничениями на предоставление отчетности (SSRS, Crystal Reports), а мои пользователи в основном являются финансовыми/деловыми людьми, знакомыми с Excel, я рассматриваю возможность создания собственного механизма отчетности с помощью Excel компонент, например SpreadsheetGear или Aspose.Cells, и интегрируйте его в наше приложение WinForms.Необходимые указатели для написания расширяемого механизма отчетности

Обе библиотеки предлагают компонент WinForms для просмотра электронных таблиц, поэтому сгенерированный отчет электронной таблицы будет показан пользователю в форме после сохранения его параметров, и он сможет его сохранить.

Я сделал это в отдельном проекте winforms, и это, очевидно, легко. Просто поместите элементы управления параметрами в форме, подключитесь к базе данных, сгенерируйте электронную таблицу, и она будет выполнена.

Однако выполнение этого для каждого отчета, очевидно, потребует значительного дублирования кода и дизайна формы «шаблона» и уменьшает ремонтопригодность и возможность обновления приложения.

Как таковой, я рассматриваю возможность записи отчетов в виде плагинов (DLL), которые будут предоставлять код/​​логику для генерации отчета и возвращать конечный объект рабочего листа вызывающей стороне (форма «Предварительный просмотр отчета») ,

После придав ему некоторые мысли, я думаю, что обязанности между абонентом и надстройки будут распределены, как показано ниже:

Отчет DLL/надстройкой обеспечит абоненту (мастер UI) список параметров, которые пользователь должен передать этому отчету вместе с его именем, его возможные значения (например, список combobox).

Тогда это будет до главного пользовательского интерфейса, чтобы создать их на форме. Тип управления будет выведен на основе типа данных параметра (строка будет TextBox и т. Д.).

Главный пользовательский интерфейс передаст в DLL отчета заполненные параметры методу создания отчета вместе с некоторыми конкретными настройками приложения (строка подключения, имя пользователя приложения).

DLL отчета затем сгенерирует отчет и вернет основному пользовательскому интерфейсу созданный объект/объект отчета и отобразит его в элементе управления предварительного просмотра.

Для достижения этой цели технически, я считаю, что мне нужно, чтобы создать интерфейс для отчетов библиотек DLL, и реализовать методы, как

List<ReportParameter> GetReportsParameters() 
Report GenerateReport() 

От главного интерфейса, я достигаю бы их и назвать их через Reflection.

Это звучит как хорошая стратегия и оставляет ли она достойную комнату для будущей расширяемости? Я хотел бы достичь хорошего баланса между модулями, не будучи сдержанным в гибкости, поскольку моя архитектура надстройки слишком статична для будущего.

У вас есть полезные советы, чтобы обеспечить это и поделиться, если вы достигли аналогичных вещей в прошлом?

спасибо.

(Я разрабатываю C#, .Net 4.0 и WinForms. База данных - это SQL Server 2005).

+0

Кроме того, могут ли помочь технологии MS, такие как MEF (Microsoft Extensibility Framework) или MAF (Microsoft Add-in Framerwork)? Или они кажутся чрезмерными для этого? –

ответ

0

Посмотрите на Templater. Вероятно, он уже делает большую часть материала, который вам нужен.

Есть примеры реального мира на Github.

Disclamer: Я являюсь автором библиотеки.

+0

Я уже посещал ваш сайт, когда искал мощную библиотеку, и чувство, которое у меня было, было не в состоянии справиться с большими наборами данных (то есть вставить строки из DataTable или другого типа коллекции в диапазон назначения), а скорее «mail-merge» путем поиска/замены тегов со значениями. Для меня это кажется очень сильным, но я боюсь, что это не то, что я ищу. Пожалуйста, не стесняйтесь сказать мне неправильно, если я что-то упустил. Aspose.Cells делает что-то похожее под названием «Smart Marker» кстати. –

+0

Что вы понимаете, чувствуя, что не справляетесь с большими наборами данных? Templater поддерживает DataTable/IEnumerable/IDataReader/DataSet. Он может расширять таблицы/абзацы/диапазоны на основе элементов из этих коллекций. Вы посмотрели примеры Github? –