将模型导出为 .xlsx 遵守 SOLID 原则
Export model to .xlsx observance of SOLID principles
对不起我的英文!
我的数据库有两个 table 测试结果:
dbo.Result
第二个table有关于学校的信息:
dbo.School
这样的记录大概是40.000-70.000。最后我需要像这样得到 report-file (pdf):
我的解决方案:
- 创建Excel-temple;
- 从数据库中导入数据并在此Excel-temple中导出;
- 另存为.pdf;
- 然后对每条记录(人)进行第 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 正确的模式来分割这个任务:
- 导出到 .xls 的逻辑必须是模型方法或需要创建
为此分开class-manager?
- 哪个必须通过数据库对象model-report?
一种可能的改进是将导出逻辑提取到单独的服务:
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
}
}
对不起我的英文!
我的数据库有两个 table 测试结果:
dbo.Result
第二个table有关于学校的信息:
dbo.School
这样的记录大概是40.000-70.000。最后我需要像这样得到 report-file (pdf):
我的解决方案:
- 创建Excel-temple;
- 从数据库中导入数据并在此Excel-temple中导出;
- 另存为.pdf;
- 然后对每条记录(人)进行第 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 正确的模式来分割这个任务:
- 导出到 .xls 的逻辑必须是模型方法或需要创建 为此分开class-manager?
- 哪个必须通过数据库对象model-report?
一种可能的改进是将导出逻辑提取到单独的服务:
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 模板保存为一种更易于编辑的格式,无需像
那样 ExcelXML 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
}
}