将模型导出为 .xlsx 遵守 SOLID 原则

Export model to .xlsx observance of SOLID principles

对不起我的英文!

我的数据库有两个 table 测试结果:

dbo.Result

第二个table有关于学校的信息:

dbo.School

这样的记录大概是40.000-70.000。最后我需要像这样得到 report-file (pdf):

我的解决方案:

  1. 创建Excel-temple;
  2. 从数据库中导入数据并在此Excel-temple中导出;
  3. 另存为.pdf;
  4. 然后对每条记录(人)进行第 1 步。

LearnerReport.cs

namespace so16092016.Models
{
    public class LearnerReport
    {
        public string SNS { get; set; } //Surname Name SecondName
        public string SchoolName { get; set; }
        public string ClassName { get; set; }
        public int TestResult5 { get; set; }
    }
}

Program.cs

using Excel = Microsoft.Office.Interop.Excel;

namespace so16092016
{
    class Program
    {
        static void Main(string[] args)
        {
            resultsEntities context = new resultsEntities();
            ResultsRepository resultsRepository = new ResultsRepository(context);
            var ma_results = resultsRepository.GetTList().Where(x => x.SubjectCode == 2); //получить результаты по математике

            Excel.Application app = new Excel.Application();
            app.DisplayAlerts = false;
            Excel.Workbook book_template = app.Workbooks.Open(@"шаблон_отчета.xlsx");
            Excel._Worksheet sheet_template = book_template.Sheets["отчет"];

            foreach(var ob in ma_results)
            {
                //1. Создаем объкт LearnerReport из БД
                LearnerReport report = new LearnerReport
                {
                    SNS = $"{ob.surname} {ob.name} {ob.SecondName}",
                    SchoolName = ob.SchoolName,
                    ClassName = ob.ClassName,
                    TestResult5 = ob.TestResult5                     
                };

                //2. Экспорт объкта LearnerReport в шаблон xlsx
                sheet_template.Range["C4"].Value2 = report.SNS;
                sheet_template.Range["C5"].Value2 = report.SchoolName;
                sheet_template.Range["C6"].Value2 = report.ClassName;
                sheet_template.Range["C9"].Value2 = report.TestResult5;

                //3. Сохраняем полученный файл в .pdf на рабочем столе
                string file_name = $@"{Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}\{report.SNS}.pdf";
                sheet_template.ExportAsFixedFormat(Excel.XlFixedFormatType.xlTypePDF, file_name);
            }

            book_template.Close(0);
            book_template = null;
            app.Quit();
            app = null;
        }
    }
}

我需要什么: 应用程序运行良好,让我正确 results-reports。但如您所见,代码不适合 OOP/SOLID。因此很难扩展。帮助 me/show 正确的模式来分割这个任务:

一种可能的改进是将导出逻辑提取到单独的服务:

static void Main(string[] args)
    {
        resultsEntities context = new resultsEntities();
        ResultsRepository resultsRepository = new ResultsRepository(context);
        var ma_results = resultsRepository.GetTList().Where(x => x.SubjectCode == 2); //получить результаты по математике

        IReportService reportService = new ExcelReportService();

        reportService.GenerateReport(ma_results);
    }

    public interface IReportService
    {
        void GenerateReport(IEnumerable<StudentDto> students);
    }

    public class ExcelReportService:IReportService
    {
        public void GenerateReport(IEnumerable<StudentDto> students)
        {
            Excel.Application app = new Excel.Application();
            app.DisplayAlerts = false;
            Excel.Workbook book_template = app.Workbooks.Open(@"шаблон_отчета.xlsx");
            Excel._Worksheet sheet_template = book_template.Sheets["отчет"];

            foreach (var ob in students)
            {
                //1. Создаем объкт LearnerReport из БД
                LearnerReport report = new LearnerReport
                {
                    SNS = $"{ob.surname} {ob.name} {ob.SecondName}",
                    SchoolName = ob.SchoolName,
                    ClassName = ob.ClassName,
                    TestResult5 = ob.TestResult5
                };

                //2. Экспорт объкта LearnerReport в шаблон xlsx
                sheet_template.Range["C4"].Value2 = report.SNS;
                sheet_template.Range["C5"].Value2 = report.SchoolName;
                sheet_template.Range["C6"].Value2 = report.ClassName;
                sheet_template.Range["C9"].Value2 = report.TestResult5;

                //3. Сохраняем полученный файл в .pdf на рабочем столе
                string file_name = $@"{Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}\{report.SNS}.pdf";
                sheet_template.ExportAsFixedFormat(Excel.XlFixedFormatType.xlTypePDF, file_name);
            }

            book_template.Close(0);
            book_template = null;
            app.Quit();
            app = null;
        }
    }

我认为将 Excel 模板保存为一种更易于编辑的格式,无需像

那样 Excel
  • XML Spreadsheet 2003 (*.xml)
  • Single File Web Page (*.mht,*.mhtml)
  • Web Page (*.htm,*.html)

您可以在模板中使用占位符,例如 {report.SNS},并在 XML/HTML 或 Excel 中将其替换为:

for(;;) 
{
    var cell = sheet_template.UsedRange.Find("{*}", Type.Missing, XlFindLookIn.xlValues, 
        XlLookAt.xlWhole, XlSearchOrder.xlByRows, XlSearchDirection.xlNext);

    if(cell == null) break; 

    var value = cell.Value2 as string;
    switch (value)
    {
        case "{report.SNS}": cell.Value2 = report.SNS; break;
     // case "{report.SchoolName}": .. etc.

        default: // log issue
    }
}