NceeExportService.cs 198 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975
  1. using NPOI.HSSF.UserModel;
  2. using NPOI.SS.UserModel;
  3. using NPOI.SS.Util;
  4. using NPOI.XSSF.UserModel;
  5. using System.Data;
  6. using YBEE.EQM.Core;
  7. using YBEE.EQM.Core.Enums;
  8. namespace YBEE.EQM.Application;
  9. /// <summary>
  10. /// 高中模拟分析导出服务
  11. /// </summary>
  12. public class NceeExportService(IRepository<NceeLineTotal> rep, IExportExcelService exportExcelService) : INceeExportService, ITransient
  13. {
  14. private readonly IRepository<NceeLineTotal> _rep = rep;
  15. private readonly IExportExcelService _exportExcelService = exportExcelService;
  16. #region 导出报表
  17. /// <summary>
  18. /// 导出联盟区县模拟划线报表
  19. /// </summary>
  20. /// <param name="nceePlanId"></param>
  21. /// <returns></returns>
  22. /// <exception cref="Exception"></exception>
  23. public async Task<(string, byte[])> ExportAllianceDistrict(int nceePlanId)
  24. {
  25. var nceePlan = await _rep.Change<NceePlan>().DetachedEntities.ProjectToType<NceePlanOutput>().FirstOrDefaultAsync(t => t.Id == nceePlanId) ?? throw Oops.Oh(ErrorCode.E2001);
  26. var orgList = await GetSysOrgList(nceePlanId);
  27. var courses = await _rep.Change<Course>().Where(t => t.Id < 10 || t.Id == 100 || t.Id == 101).ProjectToType<NceeCourseDto>().OrderBy(t => t.Sequence).ToListAsync();
  28. var baseLineTable = await GetBaseLineTable(nceePlanId);
  29. var lineLevelTable = baseLineTable.DefaultView.ToTable(true, "ncee_line_level", "ncee_line_level_name");
  30. // 临时存放目录
  31. string fileRoot = Path.Combine(FileUtil.GetTempFileRoot(), $"{Guid.NewGuid()}");
  32. Directory.CreateDirectory(fileRoot);
  33. string filePath = Path.Combine(fileRoot, $"{nceePlan.Name}-统计结果");
  34. Directory.CreateDirectory(filePath);
  35. try
  36. {
  37. // 导出物理类分段统计
  38. string rangePath4 = Path.Combine(filePath, $"{nceePlan.Name}-物理类分段统计表.xlsx");
  39. var bytes4 = await ExportScoreRange(nceePlanId, 4, orgList, courses);
  40. await File.WriteAllBytesAsync(rangePath4, bytes4);
  41. // 导出历史类分段统计
  42. string rangePath8 = Path.Combine(filePath, $"{nceePlan.Name}-历史类分段统计表.xlsx");
  43. var bytes8 = await ExportScoreRange(nceePlanId, 8, orgList, courses);
  44. await File.WriteAllBytesAsync(rangePath8, bytes8);
  45. // 导出有效分统计表
  46. string lbPath = Path.Combine(filePath, $"{nceePlan.Name}-有效分及上线统计表.xlsx");
  47. var lbs = await ExportLine(nceePlanId, courses, lineLevelTable, "区县");
  48. await File.WriteAllBytesAsync(lbPath, lbs);
  49. if (nceePlan.Config.ExportConvertScoreEnabled)
  50. {
  51. // 导出机构转换成绩
  52. var orgConvertScores = await ExportOrgConvertScore(nceePlanId, orgList, isExportConvertRange: nceePlan.Config.ConvertEnabled, isExportOrder: nceePlan.Config.ExportOrderEnabled);
  53. foreach (var convertScore in orgConvertScores)
  54. {
  55. string orgPath = Path.Combine(filePath, convertScore.Key);
  56. Directory.CreateDirectory(orgPath);
  57. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-转换成绩-{convertScore.Key.Split("-")[1]}.xlsx"), convertScore.Value);
  58. File.Copy(rangePath4, Path.Combine(orgPath, Path.GetFileName(rangePath4)));
  59. File.Copy(rangePath8, Path.Combine(orgPath, Path.GetFileName(rangePath8)));
  60. File.Copy(lbPath, Path.Combine(orgPath, Path.GetFileName(lbPath)));
  61. }
  62. // 导出全部转换成绩
  63. //var convertScoreBytes = await ExportConvertScore(nceePlanId, "区县", isExportConvertRange: nceePlan.Config.ConvertEnabled, isExportOrder: nceePlan.Config.ExportOrderEnabled);
  64. var convertScoreBytes = await ExportConvertScore(new ExportConvertScoreDto
  65. {
  66. NceePlanId = nceePlanId,
  67. OrgTitle = "区县",
  68. IsExportConvertRange = nceePlan.Config.ConvertEnabled,
  69. IsExportOrder = nceePlan.Config.ExportOrderEnabled,
  70. });
  71. await File.WriteAllBytesAsync(Path.Combine(filePath, $"{nceePlan.Name}-转换成绩-总表.xlsx"), convertScoreBytes);
  72. }
  73. string outFileName = $"{nceePlan.Name}-统计结果.zip";
  74. string outFilePath = Path.Combine(fileRoot, outFileName);
  75. ICSharpCode.SharpZipLib.Zip.FastZip zip = new();
  76. zip.CreateZip(outFilePath, filePath, true, string.Empty);
  77. var retBytes = await File.ReadAllBytesAsync(outFilePath);
  78. return (outFileName, retBytes);
  79. }
  80. catch (Exception ex)
  81. {
  82. throw new Exception("导出错误", ex);
  83. }
  84. finally
  85. {
  86. Directory.Delete(fileRoot, true);
  87. }
  88. }
  89. /// <summary>
  90. /// 导出已选科的模拟划线报表
  91. /// </summary>
  92. /// <param name="input"></param>
  93. /// <returns></returns>
  94. /// <exception cref="Exception"></exception>
  95. public async Task<(string, byte[])> ExportDirectionSeleted(NceeExportInput input)
  96. {
  97. var nceePlan = await _rep.Change<NceePlan>().DetachedEntities.ProjectToType<NceePlanOutput>().FirstOrDefaultAsync(t => t.Id == input.NceePlanId) ?? throw Oops.Oh(ErrorCode.E2001);
  98. var orgList = await GetSysOrgList(input.NceePlanId);
  99. var courses = await _rep.Change<Course>().Where(t => t.Id < 10 || t.Id == 100 || t.Id == 101).ProjectToType<NceeCourseDto>().OrderBy(t => t.Sequence).ToListAsync();
  100. var baseLineTable = await GetBaseLineTable(input.NceePlanId);
  101. var lineLevelTable = baseLineTable.DefaultView.ToTable(true, "ncee_line_level", "ncee_line_level_name");
  102. // 临时存放目录
  103. string fileRoot = Path.Combine(FileUtil.GetTempFileRoot(), $"{Guid.NewGuid()}");
  104. Directory.CreateDirectory(fileRoot);
  105. string filePath = Path.Combine(fileRoot, $"{nceePlan.Name}-统计结果");
  106. Directory.CreateDirectory(filePath);
  107. try
  108. {
  109. // 导出整体分段统计
  110. if (input.IsExportScoreRange)
  111. {
  112. // 导出物理类分段统计
  113. string rangePath4 = Path.Combine(filePath, $"{nceePlan.Name}-物理类分段统计表.xlsx");
  114. var bytes4 = await ExportScoreRange(input.NceePlanId, (short)NceeDirectionCourse.PHYSICS, orgList, courses);
  115. await File.WriteAllBytesAsync(rangePath4, bytes4);
  116. // 导出历史类分段统计
  117. string rangePath8 = Path.Combine(filePath, $"{nceePlan.Name}-历史类分段统计表.xlsx");
  118. var bytes8 = await ExportScoreRange(input.NceePlanId, (short)NceeDirectionCourse.HISTORY, orgList, courses);
  119. await File.WriteAllBytesAsync(rangePath8, bytes8);
  120. }
  121. // 导出有效分统计表
  122. if (input.IsExportLine)
  123. {
  124. string lbPath = Path.Combine(filePath, $"{nceePlan.Name}-有效分及上线统计表.xlsx");
  125. var lbs = await ExportLine(input.NceePlanId, courses, lineLevelTable, "学校", false);
  126. await File.WriteAllBytesAsync(lbPath, lbs);
  127. }
  128. // 导出各班级上线情况
  129. if (input.IsExportClassLine)
  130. {
  131. string classPath = Path.Combine(filePath, $"{nceePlan.Name}-各班上线情况统计表.xlsx");
  132. var classBs = await ExportClassLine(input.NceePlanId, baseLineTable);
  133. await File.WriteAllBytesAsync(classPath, classBs);
  134. }
  135. // 导出各机构上线统计数据
  136. if (input.IsExportOrgLine)
  137. {
  138. var orgClassLines = await ExportOrgClassLine(input.NceePlanId, orgList, baseLineTable, courses);
  139. foreach (var orgClassLine in orgClassLines)
  140. {
  141. string orgPath = Path.Combine(filePath, orgClassLine.Key);
  142. if (!Directory.Exists(orgPath)) { Directory.CreateDirectory(orgPath); }
  143. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-{orgClassLine.Key}-上线统计.xlsx"), orgClassLine.Value);
  144. }
  145. }
  146. // 导出各机构分段统计
  147. if (input.IsExportOrgScoreRange)
  148. {
  149. // 导出各机构分段数据(物理)
  150. var orgRanges4 = await ExportOrgScoreRange(input.NceePlanId, (short)NceeDirectionCourse.PHYSICS, orgList, courses);
  151. foreach (var range in orgRanges4)
  152. {
  153. string orgPath = Path.Combine(filePath, range.Key);
  154. if (!Directory.Exists(orgPath)) { Directory.CreateDirectory(orgPath); }
  155. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-{range.Key}-分段统计-物理类.xlsx"), range.Value);
  156. }
  157. // 导出各机构分段数据(历史)
  158. var orgRanges8 = await ExportOrgScoreRange(input.NceePlanId, (short)NceeDirectionCourse.HISTORY, orgList, courses);
  159. foreach (var range in orgRanges8)
  160. {
  161. string orgPath = Path.Combine(filePath, range.Key);
  162. if (!Directory.Exists(orgPath)) { Directory.CreateDirectory(orgPath); }
  163. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-{range.Key}-分段统计-历史类.xlsx"), range.Value);
  164. }
  165. }
  166. if (nceePlan.Config.ExportConvertScoreEnabled)
  167. {
  168. // 导出各机构转换成绩
  169. if (input.IsExportOrgConvertScore)
  170. {
  171. var orgConvertScores = await ExportOrgConvertScore(input.NceePlanId, orgList, isExportConvertRange: nceePlan.Config.ConvertEnabled);
  172. foreach (var convertScore in orgConvertScores)
  173. {
  174. string orgPath = Path.Combine(filePath, convertScore.Key);
  175. Directory.CreateDirectory(orgPath);
  176. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-转换成绩-{convertScore.Key}.xlsx"), convertScore.Value);
  177. }
  178. }
  179. // 导出全部转换成绩
  180. if (input.IsExportConvertScore)
  181. {
  182. var convertScoreBytes = await ExportConvertScore(new ExportConvertScoreDto
  183. {
  184. NceePlanId = input.NceePlanId,
  185. IsExportConvertRange = nceePlan.Config.ConvertEnabled,
  186. IsExportStudentName = true,
  187. IsExportComb = true,
  188. IsExportDirectionCourse = true,
  189. IsExportOrder = true,
  190. IsExportClassNumber = true,
  191. });
  192. await File.WriteAllBytesAsync(Path.Combine(filePath, $"{nceePlan.Name}-转换成绩-总表.xlsx"), convertScoreBytes);
  193. }
  194. }
  195. string outFileName = $"{nceePlan.Name}-统计结果.zip";
  196. string outFilePath = Path.Combine(fileRoot, outFileName);
  197. ICSharpCode.SharpZipLib.Zip.FastZip zip = new();
  198. zip.CreateZip(outFilePath, filePath, true, string.Empty);
  199. var retBytes = await File.ReadAllBytesAsync(outFilePath);
  200. return (outFileName, retBytes);
  201. }
  202. catch (Exception ex)
  203. {
  204. throw new Exception("导出错误", ex);
  205. }
  206. finally
  207. {
  208. Directory.Delete(fileRoot, true);
  209. }
  210. }
  211. /// <summary>
  212. /// 导出未选科的模拟划线报表
  213. /// </summary>
  214. /// <param name="nceePlanId"></param>
  215. /// <returns></returns>
  216. /// <exception cref="Exception"></exception>
  217. public async Task<(string, byte[])> ExportDirectionUnseleted(int nceePlanId)
  218. {
  219. var nceePlan = await _rep.Change<NceePlan>().DetachedEntities.ProjectToType<NceePlanOutput>().FirstOrDefaultAsync(t => t.Id == nceePlanId) ?? throw Oops.Oh(ErrorCode.E2001);
  220. var orgList = await GetSysOrgList(nceePlanId);
  221. var courses = await _rep.Change<Course>().Where(t => t.Id < 10 || t.Id == 100).ProjectToType<NceeCourseDto>().OrderBy(t => t.Sequence).ToListAsync();
  222. var baseLineTable = await GetBaseLineTable(nceePlanId);
  223. var lineLevelTable = baseLineTable.DefaultView.ToTable(true, "ncee_line_level", "ncee_line_level_name");
  224. // 临时存放目录
  225. string fileRoot = Path.Combine(FileUtil.GetTempFileRoot(), $"{Guid.NewGuid()}");
  226. Directory.CreateDirectory(fileRoot);
  227. string filePath = Path.Combine(fileRoot, $"{nceePlan.Name}-统计结果");
  228. Directory.CreateDirectory(filePath);
  229. try
  230. {
  231. // 导出分段统计
  232. string rangePath4 = Path.Combine(filePath, $"{nceePlan.Name}-分段统计表.xlsx");
  233. var bytes4 = await ExportScoreRangeUnselected(nceePlanId, orgList, courses);
  234. await File.WriteAllBytesAsync(rangePath4, bytes4);
  235. // 导出有效分统计表
  236. string lbPath = Path.Combine(filePath, $"{nceePlan.Name}-有效分及上线统计表.xlsx");
  237. var lbs = await ExportLineUnselected(nceePlanId, courses, lineLevelTable);
  238. await File.WriteAllBytesAsync(lbPath, lbs);
  239. // 导出各班级上线情况
  240. string classPath = Path.Combine(filePath, $"{nceePlan.Name}-各班上线情况统计表.xlsx");
  241. var classBs = await ExportClassLineUnselected(nceePlanId, baseLineTable);
  242. await File.WriteAllBytesAsync(classPath, classBs);
  243. // 导出各机构上线统计数据
  244. var orgClassLines = await ExportOrgClassLineUnselected(nceePlanId, orgList, baseLineTable, courses);
  245. foreach (var orgClassLine in orgClassLines)
  246. {
  247. string orgPath = Path.Combine(filePath, orgClassLine.Key);
  248. if (!Directory.Exists(orgPath)) { Directory.CreateDirectory(orgPath); }
  249. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-{orgClassLine.Key}-上线统计.xlsx"), orgClassLine.Value);
  250. }
  251. // 导出各机构分段数据
  252. var orgRanges4 = await ExportOrgScoreRangeUnselected(nceePlanId, orgList, courses);
  253. foreach (var range in orgRanges4)
  254. {
  255. string orgPath = Path.Combine(filePath, range.Key);
  256. if (!Directory.Exists(orgPath)) { Directory.CreateDirectory(orgPath); }
  257. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-{range.Key}-分段统计.xlsx"), range.Value);
  258. }
  259. string outFileName = $"{nceePlan.Name}-统计结果.zip";
  260. string outFilePath = Path.Combine(fileRoot, outFileName);
  261. ICSharpCode.SharpZipLib.Zip.FastZip zip = new();
  262. zip.CreateZip(outFilePath, filePath, true, string.Empty);
  263. var retBytes = await File.ReadAllBytesAsync(outFilePath);
  264. return (outFileName, retBytes);
  265. }
  266. catch (Exception ex)
  267. {
  268. throw new Exception("导出错误", ex);
  269. }
  270. finally
  271. {
  272. Directory.Delete(fileRoot, true);
  273. }
  274. }
  275. #endregion
  276. #region 导出方法
  277. /// <summary>
  278. /// 导出分数段统计表
  279. /// </summary>
  280. /// <param name="nceePlanId"></param>
  281. /// <param name="directionCourseId"></param>
  282. /// <param name="orgList"></param>
  283. /// <param name="courses"></param>
  284. /// <returns></returns>
  285. private async Task<byte[]> ExportScoreRange(int nceePlanId, short directionCourseId, List<SysOrgOutput> orgList, List<NceeCourseDto> courses)
  286. {
  287. var tcourses = courses.Where(t => t.Id < 10).ToList();
  288. tcourses.Insert(0, courses.FirstOrDefault(t => t.Id == 100));
  289. XSSFWorkbook wb = new();
  290. foreach (var course in tcourses)
  291. {
  292. if (course.IsSkip(directionCourseId)) { continue; }
  293. DataTable table;
  294. if (course.Id == 100)
  295. {
  296. table = await GetTotalScoreRangeTable(nceePlanId, directionCourseId, orgList);
  297. }
  298. else
  299. {
  300. table = await GetCourseScoreRangeTable(nceePlanId, directionCourseId, course.Id, orgList);
  301. }
  302. string sheetName = course.Name;
  303. if (course.Id == 100 || course.Id > 4 && course.Id != 8)
  304. {
  305. sheetName = $"{sheetName}X";
  306. }
  307. ISheet sheet = wb.CreateSheet(sheetName);
  308. sheet.DisplayGridlines = false;
  309. var cellStyle = _exportExcelService.GetCellStyle(wb);
  310. // 行索引号
  311. int rowNum = 0;
  312. #region 列头
  313. IRow headerRow = sheet.CreateRow(rowNum++);
  314. int ci = 0;
  315. _exportExcelService.AddCell("分数段", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  316. foreach (var org in orgList)
  317. {
  318. _exportExcelService.AddCell(org.ShortName2, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  319. }
  320. _exportExcelService.AddCell("该段人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  321. _exportExcelService.AddCell("人数累计", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  322. sheet.CreateFreezePane(0, rowNum);
  323. #endregion
  324. #region 数据
  325. foreach (DataRow dr in table.Rows)
  326. {
  327. IRow row = sheet.CreateRow(rowNum++);
  328. int rci = 0;
  329. _exportExcelService.AddCell(dr["exam_score_range_name"], row, rci++, cellStyle.CenterCellStyle);
  330. foreach (var org in orgList)
  331. {
  332. _exportExcelService.AddCell(dr[$"total_count_{org.Id}"], row, rci++, cellStyle.CenterCellStyle);
  333. }
  334. _exportExcelService.AddCell(dr["total_count_range_current"], row, rci++, cellStyle.CenterCellStyle);
  335. _exportExcelService.AddCell(dr["total_count_range_sum"], row, rci++, cellStyle.CenterCellStyle);
  336. }
  337. #endregion
  338. #region 图表
  339. int oi = 0;
  340. const int CHART_ROW_COUNT = 13;
  341. foreach (var org in orgList)
  342. {
  343. XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
  344. int startRow = oi * CHART_ROW_COUNT + oi + 1;
  345. int endRow = startRow + CHART_ROW_COUNT;
  346. XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, ci + 1, startRow, ci + 10, endRow);
  347. //CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count + 1, oi + 1, org.ShortName2, org.ShortName2, "人数", "分数段");
  348. _exportExcelService.CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count, oi + 1, org.ShortName2, org.ShortName2, "人数", "分数段");
  349. oi++;
  350. }
  351. #endregion
  352. }
  353. MemoryStream ms = new();
  354. wb.Write(ms, false);
  355. ms.Flush();
  356. return ms.ToArray();
  357. }
  358. /// <summary>
  359. /// 导出分数段统计表(未选科)
  360. /// </summary>
  361. /// <param name="nceePlanId"></param>
  362. /// <param name="orgList"></param>
  363. /// <param name="courses"></param>
  364. /// <returns></returns>
  365. private async Task<byte[]> ExportScoreRangeUnselected(int nceePlanId, List<SysOrgOutput> orgList, List<NceeCourseDto> courses)
  366. {
  367. var tcourses = courses.Where(t => t.Id < 10).ToList();
  368. tcourses.Insert(0, courses.FirstOrDefault(t => t.Id == 100));
  369. XSSFWorkbook wb = new();
  370. foreach (var course in tcourses)
  371. {
  372. DataTable table;
  373. if (course.Id == 100)
  374. {
  375. table = await GetTotalScoreRangeTableUnselected(nceePlanId, orgList);
  376. }
  377. else
  378. {
  379. table = await GetCourseScoreRangeTableUnselected(nceePlanId, course.Id, orgList);
  380. }
  381. string sheetName = course.Name;
  382. ISheet sheet = wb.CreateSheet(sheetName);
  383. sheet.DisplayGridlines = false;
  384. var cellStyle = _exportExcelService.GetCellStyle(wb);
  385. // 行索引号
  386. int rowNum = 0;
  387. #region 列头
  388. IRow headerRow = sheet.CreateRow(rowNum++);
  389. int ci = 0;
  390. _exportExcelService.AddCell("分数段", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  391. foreach (var org in orgList)
  392. {
  393. _exportExcelService.AddCell(org.ShortName2, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  394. }
  395. _exportExcelService.AddCell("该段人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  396. _exportExcelService.AddCell("人数累计", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  397. sheet.CreateFreezePane(0, rowNum);
  398. #endregion
  399. #region 数据
  400. foreach (DataRow dr in table.Rows)
  401. {
  402. IRow row = sheet.CreateRow(rowNum++);
  403. int rci = 0;
  404. _exportExcelService.AddCell(dr["exam_score_range_name"], row, rci++, cellStyle.CenterCellStyle);
  405. foreach (var org in orgList)
  406. {
  407. _exportExcelService.AddCell(dr[$"total_count_{org.Id}"], row, rci++, cellStyle.CenterCellStyle);
  408. }
  409. _exportExcelService.AddCell(dr["total_count_range_current"], row, rci++, cellStyle.CenterCellStyle);
  410. _exportExcelService.AddCell(dr["total_count_range_sum"], row, rci++, cellStyle.CenterCellStyle);
  411. }
  412. #endregion
  413. #region 图表
  414. int oi = 0;
  415. const int CHART_ROW_COUNT = 13;
  416. foreach (var org in orgList)
  417. {
  418. XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
  419. int startRow = oi * CHART_ROW_COUNT + oi + 1;
  420. int endRow = startRow + CHART_ROW_COUNT;
  421. XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, ci + 1, startRow, ci + 10, endRow);
  422. //CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count + 1, oi + 1, org.ShortName2, org.ShortName2, "人数", "分数段");
  423. _exportExcelService.CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count, oi + 1, org.ShortName2, org.ShortName2, "人数", "分数段");
  424. oi++;
  425. }
  426. #endregion
  427. }
  428. MemoryStream ms = new();
  429. wb.Write(ms, false);
  430. ms.Flush();
  431. return ms.ToArray();
  432. }
  433. /// <summary>
  434. /// 导出机构分数段统计表
  435. /// </summary>
  436. /// <param name="nceePlanId"></param>
  437. /// <param name="directionCourseId"></param>
  438. /// <param name="orgList"></param>
  439. /// <param name="courses"></param>
  440. /// <returns></returns>
  441. private async Task<Dictionary<string, byte[]>> ExportOrgScoreRange(int nceePlanId, short directionCourseId, List<SysOrgOutput> orgList, List<NceeCourseDto> courses)
  442. {
  443. Dictionary<string, byte[]> ret = [];
  444. var tcourses = courses.Where(t => t.Id < 10).ToList();
  445. tcourses.Insert(0, courses.FirstOrDefault(t => t.Id == 100));
  446. foreach (var org in orgList)
  447. {
  448. XSSFWorkbook wb = new();
  449. foreach (var course in tcourses)
  450. {
  451. if (course.IsSkip(directionCourseId)) { continue; }
  452. DataTable table;
  453. if (course.Id == 100)
  454. {
  455. table = await GetTotalScoreRangeTable(nceePlanId, directionCourseId, orgList);
  456. }
  457. else
  458. {
  459. table = await GetCourseScoreRangeTable(nceePlanId, directionCourseId, course.Id, orgList);
  460. }
  461. string sheetName = course.Name;
  462. if (course.Id == 100 || course.Id > 4 && course.Id != 8)
  463. {
  464. sheetName = $"{sheetName}X";
  465. }
  466. ISheet sheet = wb.CreateSheet(sheetName);
  467. sheet.DisplayGridlines = false;
  468. var cellStyle = _exportExcelService.GetCellStyle(wb);
  469. // 行索引号
  470. int rowNum = 0;
  471. #region 列头
  472. IRow headerRow = sheet.CreateRow(rowNum++);
  473. int ci = 0;
  474. _exportExcelService.AddCell("分数段", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  475. _exportExcelService.AddCell("人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  476. _exportExcelService.AddCell("累计", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  477. sheet.CreateFreezePane(0, rowNum);
  478. #endregion
  479. #region 数据
  480. decimal scount = 0;
  481. foreach (DataRow dr in table.Rows)
  482. {
  483. IRow row = sheet.CreateRow(rowNum++);
  484. int rci = 0;
  485. _exportExcelService.AddCell(dr["exam_score_range_name"], row, rci++, cellStyle.CenterCellStyle);
  486. decimal c = (decimal)dr[$"total_count_{org.Id}"];
  487. scount += c;
  488. _exportExcelService.AddCell(c, row, rci++, cellStyle.CenterCellStyle);
  489. _exportExcelService.AddCell(scount, row, rci++, cellStyle.CenterCellStyle);
  490. }
  491. #endregion
  492. #region 图表
  493. const int CHART_ROW_COUNT = 13;
  494. XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
  495. int startRow = 1;
  496. int endRow = startRow + CHART_ROW_COUNT;
  497. XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, ci + 1, startRow, ci + 10, endRow);
  498. //CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count + 1, 1, org.ShortName, org.ShortName, "人数", "分数段");
  499. _exportExcelService.CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count, 1, org.ShortName, org.ShortName, "人数", "分数段");
  500. #endregion
  501. }
  502. MemoryStream ms = new();
  503. wb.Write(ms, false);
  504. ms.Flush();
  505. ret.Add($"{org.Code}-{org.ShortName}", ms.ToArray());
  506. }
  507. return ret;
  508. }
  509. /// <summary>
  510. /// 导出机构分数段统计表(未选科)
  511. /// </summary>
  512. /// <param name="nceePlanId"></param>
  513. /// <param name="orgList"></param>
  514. /// <param name="courses"></param>
  515. /// <returns></returns>
  516. private async Task<Dictionary<string, byte[]>> ExportOrgScoreRangeUnselected(int nceePlanId, List<SysOrgOutput> orgList, List<NceeCourseDto> courses)
  517. {
  518. Dictionary<string, byte[]> ret = [];
  519. var tcourses = courses.Where(t => t.Id < 10).ToList();
  520. tcourses.Insert(0, courses.FirstOrDefault(t => t.Id == 100));
  521. foreach (var org in orgList)
  522. {
  523. XSSFWorkbook wb = new();
  524. foreach (var course in tcourses)
  525. {
  526. DataTable table;
  527. if (course.Id == 100)
  528. {
  529. table = await GetTotalScoreRangeTableUnselected(nceePlanId, orgList);
  530. }
  531. else
  532. {
  533. table = await GetCourseScoreRangeTableUnselected(nceePlanId, course.Id, orgList);
  534. }
  535. string sheetName = course.Name;
  536. ISheet sheet = wb.CreateSheet(sheetName);
  537. sheet.DisplayGridlines = false;
  538. var cellStyle = _exportExcelService.GetCellStyle(wb);
  539. // 行索引号
  540. int rowNum = 0;
  541. #region 列头
  542. IRow headerRow = sheet.CreateRow(rowNum++);
  543. int ci = 0;
  544. _exportExcelService.AddCell("分数段", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  545. _exportExcelService.AddCell("人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  546. _exportExcelService.AddCell("累计", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  547. sheet.CreateFreezePane(0, rowNum);
  548. #endregion
  549. #region 数据
  550. decimal scount = 0;
  551. foreach (DataRow dr in table.Rows)
  552. {
  553. IRow row = sheet.CreateRow(rowNum++);
  554. int rci = 0;
  555. _exportExcelService.AddCell(dr["exam_score_range_name"], row, rci++, cellStyle.CenterCellStyle);
  556. decimal c = (decimal)dr[$"total_count_{org.Id}"];
  557. scount += c;
  558. _exportExcelService.AddCell(c, row, rci++, cellStyle.CenterCellStyle);
  559. _exportExcelService.AddCell(scount, row, rci++, cellStyle.CenterCellStyle);
  560. }
  561. #endregion
  562. #region 图表
  563. const int CHART_ROW_COUNT = 13;
  564. XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
  565. int startRow = 1;
  566. int endRow = startRow + CHART_ROW_COUNT;
  567. XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, ci + 1, startRow, ci + 10, endRow);
  568. //CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count + 1, 1, org.ShortName, org.ShortName, "人数", "分数段");
  569. _exportExcelService.CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count, 1, org.ShortName, org.ShortName, "人数", "分数段");
  570. #endregion
  571. }
  572. MemoryStream ms = new();
  573. wb.Write(ms, false);
  574. ms.Flush();
  575. ret.Add($"{org.Code}-{org.ShortName}", ms.ToArray());
  576. }
  577. return ret;
  578. }
  579. /// <summary>
  580. /// 导出有效分
  581. /// </summary>
  582. /// <param name="nceePlanId"></param>
  583. /// <param name="wb"></param>
  584. /// <param name="cellStyle"></param>
  585. /// <param name="lineScoreTable"></param>
  586. /// <param name="isExportRate"></param>
  587. /// <returns></returns>
  588. private async Task ExportLineScore(int nceePlanId, IWorkbook wb, ExportExcelCellStyle cellStyle, DataTable lineScoreTable = null, bool isExportRate = false)
  589. {
  590. var cellStylePercent = wb.CreateCellStyle();
  591. cellStylePercent.CloneStyleFrom(cellStyle.CenterCellStyle);
  592. cellStylePercent.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");
  593. lineScoreTable ??= await GetLineScoreTable(nceePlanId);
  594. int mcount = isExportRate ? 8 : 7;
  595. ISheet sheet = wb.CreateSheet("有效分");
  596. sheet.DisplayGridlines = false;
  597. // 行索引号
  598. int rowNum = 0;
  599. foreach (var directionCourse in NceeUtil.DirectionCourses)
  600. {
  601. #region 表头
  602. IRow headerRow1 = sheet.CreateRow(rowNum++);
  603. headerRow1.HeightInPoints = 30;
  604. int ci = 0;
  605. int scoreWidth = 8;
  606. _exportExcelService.AddCell($"{directionCourse.Name}类有效分", headerRow1, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  607. for (; ci < mcount; ci++)
  608. {
  609. _exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  610. }
  611. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  612. IRow headerRow2 = sheet.CreateRow(rowNum++);
  613. headerRow2.HeightInPoints = 15;
  614. ci = 0;
  615. _exportExcelService.AddCell("类型", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  616. _exportExcelService.AddCell("语文", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  617. _exportExcelService.AddCell("数学", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  618. _exportExcelService.AddCell("英语", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  619. _exportExcelService.AddCell(directionCourse.Name, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  620. _exportExcelService.AddCell("综合X", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  621. _exportExcelService.AddCell("总分X", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  622. if (isExportRate)
  623. {
  624. _exportExcelService.AddCell("划线率", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  625. }
  626. #endregion
  627. #region 数据
  628. foreach (DataRow dr in lineScoreTable.Select($"direction_course_id = {directionCourse.Id}"))
  629. {
  630. IRow row = sheet.CreateRow(rowNum++);
  631. row.HeightInPoints = 15;
  632. int rci = 0;
  633. _exportExcelService.AddCell(dr["ncee_line_level_name"], row, rci++, cellStyle.CenterCellStyle);
  634. _exportExcelService.AddCell(dr["line_score_x_1"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  635. _exportExcelService.AddCell(dr["line_score_x_2"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  636. _exportExcelService.AddCell(dr["line_score_x_3"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  637. _exportExcelService.AddCell(dr[$"line_score_x_{directionCourse.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  638. _exportExcelService.AddCell(dr["line_score_x_101"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  639. _exportExcelService.AddCell(dr["line_score_x_100"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  640. if (isExportRate)
  641. {
  642. _exportExcelService.AddCell(dr["line_rate"], row, rci++, cellStylePercent, zeroToBlank: true);
  643. }
  644. }
  645. #endregion
  646. rowNum += 2;
  647. }
  648. }
  649. /// <summary>
  650. /// 导出有效分(未选科)
  651. /// </summary>
  652. /// <param name="wb"></param>
  653. /// <param name="cellStyle"></param>
  654. /// <param name="lineScoreTable"></param>
  655. /// <param name="courses"></param>
  656. /// <returns></returns>
  657. private void ExportLineScore(IWorkbook wb, ExportExcelCellStyle cellStyle, DataTable lineScoreTable, List<NceeCourseDto> courses)
  658. {
  659. var cellStylePercent = wb.CreateCellStyle();
  660. cellStylePercent.CloneStyleFrom(cellStyle.CenterCellStyle);
  661. cellStylePercent.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");
  662. ISheet sheet = wb.CreateSheet("有效分");
  663. sheet.DisplayGridlines = false;
  664. // 行索引号
  665. int rowNum = 0;
  666. #region 表头
  667. IRow headerRow1 = sheet.CreateRow(rowNum++);
  668. headerRow1.HeightInPoints = 30;
  669. int ci = 0;
  670. int scoreWidth = 8;
  671. _exportExcelService.AddCell($"有效分", headerRow1, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  672. for (; ci < courses.Count + 1; ci++)
  673. {
  674. _exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  675. }
  676. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  677. IRow headerRow2 = sheet.CreateRow(rowNum++);
  678. headerRow2.HeightInPoints = 15;
  679. ci = 0;
  680. _exportExcelService.AddCell("类型", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  681. foreach (var course in courses)
  682. {
  683. _exportExcelService.AddCell(course.Name, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  684. }
  685. #endregion
  686. #region 数据
  687. foreach (DataRow dr in lineScoreTable.Select($"direction_course_id = 99"))
  688. {
  689. IRow row = sheet.CreateRow(rowNum++);
  690. row.HeightInPoints = 15;
  691. int rci = 0;
  692. _exportExcelService.AddCell(dr["ncee_line_level_name"], row, rci++, cellStyle.CenterCellStyle);
  693. foreach (var course in courses)
  694. {
  695. _exportExcelService.AddCell(dr[$"line_score_x_{course.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  696. }
  697. }
  698. #endregion
  699. }
  700. /// <summary>
  701. /// 导出转换区间
  702. /// </summary>
  703. /// <param name="nceePlanId"></param>
  704. /// <param name="wb"></param>
  705. /// <param name="cellStyle"></param>
  706. /// <returns></returns>
  707. private async Task ExportConvertRange(int nceePlanId, IWorkbook wb, ExportExcelCellStyle cellStyle)
  708. {
  709. var convertRangeTable = await GetConvertRangeTable(nceePlanId);
  710. var convertGrades = await _rep.Change<NceeConvertGrade>().Entities.ToListAsync();
  711. ISheet convertRangeSheet = wb.CreateSheet("原始分转换区间");
  712. convertRangeSheet.DisplayGridlines = false;
  713. // 行索引号
  714. int rowNum = 0;
  715. // 标题1
  716. IRow titleRow1 = convertRangeSheet.CreateRow(rowNum++);
  717. titleRow1.HeightInPoints = 30;
  718. int ci = 0;
  719. int colWidth = 13;
  720. _exportExcelService.AddCell("等级比例赋分区间", titleRow1, ci++, cellStyle.TitleStyle, convertRangeSheet, colWidth);
  721. foreach (var rg in convertGrades)
  722. {
  723. _exportExcelService.AddCell("", titleRow1, ci++, cellStyle.TitleStyle, convertRangeSheet, colWidth);
  724. }
  725. convertRangeSheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, convertGrades.Count));
  726. // 表头1
  727. IRow headerRow1 = convertRangeSheet.CreateRow(rowNum++);
  728. headerRow1.HeightInPoints = 15;
  729. ci = 0;
  730. _exportExcelService.AddCell("等级", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  731. foreach (var rg in convertGrades)
  732. {
  733. _exportExcelService.AddCell(rg.Name, headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  734. }
  735. // 表头:比例
  736. IRow headerRow2 = convertRangeSheet.CreateRow(rowNum++);
  737. headerRow2.HeightInPoints = 15;
  738. ci = 0;
  739. _exportExcelService.AddCell("比例", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  740. foreach (var rg in convertGrades)
  741. {
  742. _exportExcelService.AddCell($"约{Math.Round(rg.Rate * 100, 0)}%", headerRow2, ci++, cellStyle.CenterCellStyle, convertRangeSheet, colWidth);
  743. }
  744. // 表头:赋分区间
  745. IRow headerRow3 = convertRangeSheet.CreateRow(rowNum++);
  746. headerRow3.HeightInPoints = 15;
  747. ci = 0;
  748. _exportExcelService.AddCell("赋分区间", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  749. foreach (var rg in convertGrades)
  750. {
  751. _exportExcelService.AddCell($"{Math.Round(rg.MinScore)}~{Math.Round(rg.MaxScore)}", headerRow3, ci++, cellStyle.CenterCellStyle, convertRangeSheet, colWidth);
  752. }
  753. rowNum += 2;
  754. // 标题2
  755. IRow titleRow2 = convertRangeSheet.CreateRow(rowNum++);
  756. titleRow2.HeightInPoints = 30;
  757. ci = 0;
  758. _exportExcelService.AddCell("原始分转换区间", titleRow2, ci++, cellStyle.TitleStyle, convertRangeSheet, colWidth);
  759. foreach (var rg in convertGrades)
  760. {
  761. _exportExcelService.AddCell("", titleRow2, ci++, cellStyle.TitleStyle, convertRangeSheet, colWidth);
  762. }
  763. convertRangeSheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, convertGrades.Count));
  764. // 表头4
  765. IRow headerRow4 = convertRangeSheet.CreateRow(rowNum++);
  766. headerRow4.HeightInPoints = 15;
  767. ci = 0;
  768. _exportExcelService.AddCell("学科", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  769. foreach (var rg in convertGrades)
  770. {
  771. _exportExcelService.AddCell(rg.Name, headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  772. }
  773. // 数据
  774. foreach (DataRow dr in convertRangeTable.Rows)
  775. {
  776. IRow row = convertRangeSheet.CreateRow(rowNum++);
  777. row.HeightInPoints = 15;
  778. int rci = 0;
  779. _exportExcelService.AddCell(dr["course_name"], row, rci++, cellStyle.CenterCellStyle);
  780. foreach (var rg in convertGrades)
  781. {
  782. var a1 = ((decimal)dr[$"min_score_{rg.Name.ToLower()}"]).ToString("0.#");
  783. var a2 = ((decimal)dr[$"max_score_{rg.Name.ToLower()}"]).ToString("0.#");
  784. _exportExcelService.AddCell($"[{a1}, {a2}]", row, rci++, cellStyle.LeftCellStyle);
  785. }
  786. }
  787. }
  788. /// <summary>
  789. /// 导出上线合并
  790. /// </summary>
  791. /// <param name="nceePlanId"></param>
  792. /// <param name="wb"></param>
  793. /// <param name="cellStyle"></param>
  794. /// <param name="orgTitle"></param>
  795. /// <returns></returns>
  796. private async Task ExportLineTotal(int nceePlanId, IWorkbook wb, ExportExcelCellStyle cellStyle, string orgTitle)
  797. {
  798. var table = await GetLineCountTable(nceePlanId);
  799. ISheet sheet = wb.CreateSheet("上线合并");
  800. sheet.DisplayGridlines = false;
  801. // 行索引号
  802. int rowNum = 0;
  803. #region 表头
  804. IRow titleRow = sheet.CreateRow(rowNum++);
  805. titleRow.HeightInPoints = 30;
  806. int ci = 0;
  807. int scoreWidth = 10;
  808. _exportExcelService.AddCell("上线合并汇总", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  809. for (; ci < 16; ci++)
  810. {
  811. _exportExcelService.AddCell("", titleRow, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  812. }
  813. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  814. IRow headerRow0 = sheet.CreateRow(rowNum++);
  815. headerRow0.HeightInPoints = 15;
  816. ci = 0;
  817. _exportExcelService.AddCell(orgTitle, headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  818. _exportExcelService.AddCell("两类合并", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  819. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  820. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  821. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  822. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  823. _exportExcelService.AddCell("物理类", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  824. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  825. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  826. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  827. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  828. _exportExcelService.AddCell("历史类", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  829. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  830. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  831. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  832. _exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  833. IRow headerRow1 = sheet.CreateRow(rowNum++);
  834. headerRow1.HeightInPoints = 15;
  835. ci = 0;
  836. _exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  837. _exportExcelService.AddCell("参考人数", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  838. _exportExcelService.AddCell("特控", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  839. _exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  840. _exportExcelService.AddCell("本科", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  841. _exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  842. _exportExcelService.AddCell("参考人数", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  843. _exportExcelService.AddCell("特控", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  844. _exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  845. _exportExcelService.AddCell("本科", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  846. _exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  847. _exportExcelService.AddCell("参考人数", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  848. _exportExcelService.AddCell("特控", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  849. _exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  850. _exportExcelService.AddCell("本科", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  851. _exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  852. IRow headerRow2 = sheet.CreateRow(rowNum++);
  853. headerRow1.HeightInPoints = 15;
  854. ci = 0;
  855. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  856. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  857. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  858. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  859. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  860. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  861. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  862. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  863. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  864. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  865. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  866. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  867. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  868. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  869. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  870. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  871. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 3, rowNum - 1, 0, 0));
  872. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 3, rowNum - 3, 1, 5));
  873. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 3, rowNum - 3, 6, 10));
  874. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 3, rowNum - 3, 11, 15));
  875. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  876. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 2, 3));
  877. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 4, 5));
  878. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 6, 6));
  879. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 7, 8));
  880. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 9, 10));
  881. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 11, 11));
  882. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 12, 13));
  883. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 14, 15));
  884. #endregion
  885. #region 数据
  886. foreach (DataRow dr in table.Rows)
  887. {
  888. IRow row = sheet.CreateRow(rowNum++);
  889. row.HeightInPoints = 15;
  890. int rci = 0;
  891. _exportExcelService.AddCell(dr["sys_org_name"], row, rci++, cellStyle.CenterCellStyle);
  892. _exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  893. _exportExcelService.AddCell(dr["line_count_1"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  894. _exportExcelService.AddCell(dr["line_rate_1"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  895. _exportExcelService.AddCell(dr["line_count_2"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  896. _exportExcelService.AddCell(dr["line_rate_2"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  897. _exportExcelService.AddCell(dr["d_4_total_count"], row, rci++, cellStyle.CenterCellStyle);
  898. _exportExcelService.AddCell(dr["d_4_line_count_1"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  899. _exportExcelService.AddCell(dr["d_4_line_rate_1"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  900. _exportExcelService.AddCell(dr["d_4_line_count_2"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  901. _exportExcelService.AddCell(dr["d_4_line_rate_2"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  902. _exportExcelService.AddCell(dr["d_8_total_count"], row, rci++, cellStyle.CenterCellStyle);
  903. _exportExcelService.AddCell(dr["d_8_line_count_1"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  904. _exportExcelService.AddCell(dr["d_8_line_rate_1"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  905. _exportExcelService.AddCell(dr["d_8_line_count_2"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  906. _exportExcelService.AddCell(dr["d_8_line_rate_2"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  907. }
  908. #endregion
  909. }
  910. /// <summary>
  911. /// 导出上线统计
  912. /// </summary>
  913. /// <param name="nceePlanId"></param>
  914. /// <param name="courses"></param>
  915. /// <param name="lineLevelTable"></param>
  916. /// <param name="orgTitle">区县或学校标题名称</param>
  917. /// <param name="isExportConvertRange">是否导出转换区间</param>
  918. /// <returns></returns>
  919. private async Task<byte[]> ExportLine(int nceePlanId, List<NceeCourseDto> courses, DataTable lineLevelTable, string orgTitle, bool isExportConvertRange = true)
  920. {
  921. XSSFWorkbook wb = new();
  922. var cellStyle = _exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  923. #region 上线合并
  924. await ExportLineTotal(nceePlanId, wb, cellStyle, orgTitle);
  925. #endregion
  926. #region 平均分
  927. {
  928. var tcourses = courses.Where(t => t.Id != 101).ToList();
  929. ISheet sheet = wb.CreateSheet("平均分");
  930. sheet.DisplayGridlines = false;
  931. // 行索引号
  932. int rowNum = 0;
  933. foreach (var directionCourse in NceeUtil.DirectionCourses)
  934. {
  935. var table = await GetAvgScoreTable(nceePlanId, directionCourse.Id);
  936. #region 表头
  937. IRow headerRow1 = sheet.CreateRow(rowNum++);
  938. headerRow1.HeightInPoints = 30;
  939. int ci = 0;
  940. int scoreWidth = 8;
  941. _exportExcelService.AddCell($"{directionCourse.Name}类平均分", headerRow1, ci++, cellStyle.TitleStyle, sheet, 10);
  942. for (; ci < 19; ci++)
  943. {
  944. _exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  945. }
  946. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  947. IRow headerRow2 = sheet.CreateRow(rowNum++);
  948. headerRow2.HeightInPoints = 15;
  949. ci = 0;
  950. _exportExcelService.AddCell("学科", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  951. foreach (var course in tcourses)
  952. {
  953. if (course.IsSkip(directionCourse.Id)) { continue; }
  954. string cn = course.Name;
  955. if (course.Id == 5 || course.Id == 6 || course.Id == 7 || course.Id == 9 || course.Id == 100)
  956. {
  957. cn = $"{cn}X";
  958. }
  959. _exportExcelService.AddCell(cn, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  960. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  961. if (ci % 2 == 1)
  962. {
  963. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  964. }
  965. }
  966. IRow headerRow3 = sheet.CreateRow(rowNum++);
  967. headerRow3.HeightInPoints = 15;
  968. ci = 0;
  969. _exportExcelService.AddCell(orgTitle, headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  970. foreach (var course in tcourses)
  971. {
  972. if (course.IsSkip(directionCourse.Id)) { continue; }
  973. _exportExcelService.AddCell("人数", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  974. _exportExcelService.AddCell("平均", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  975. }
  976. #endregion
  977. #region 数据
  978. foreach (DataRow dr in table.Rows)
  979. {
  980. IRow row = sheet.CreateRow(rowNum++);
  981. row.HeightInPoints = 15;
  982. int rci = 0;
  983. _exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  984. foreach (var course in tcourses)
  985. {
  986. if (course.IsSkip(directionCourse.Id)) { continue; }
  987. _exportExcelService.AddCell(dr[$"total_count_{course.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  988. _exportExcelService.AddCell(dr[$"avg_score_x_{course.Id}"], row, rci++, cellStyle.NumberCellStyleP2, zeroToBlank: true);
  989. }
  990. }
  991. #endregion
  992. rowNum += 2;
  993. }
  994. }
  995. #endregion
  996. #region 有效分
  997. var lineScoreTable = await GetLineScoreTable(nceePlanId);
  998. await ExportLineScore(nceePlanId, wb, cellStyle, lineScoreTable);
  999. #endregion
  1000. #region 单上线
  1001. {
  1002. var table = await GetLineTotalTable(nceePlanId);
  1003. ISheet sheet = wb.CreateSheet("有效分总分单上线");
  1004. sheet.DisplayGridlines = false;
  1005. // 行索引号
  1006. int rowNum = 0;
  1007. foreach (DataRow lineLevel in lineLevelTable.Rows)
  1008. {
  1009. #region 表头
  1010. // 分类标题
  1011. IRow headerRow1 = sheet.CreateRow(rowNum++);
  1012. headerRow1.HeightInPoints = 30;
  1013. int ci = 0;
  1014. int countWidth = 6;
  1015. int scoreWidth = 8;
  1016. int orgWidth = 10;
  1017. _exportExcelService.AddCell($"{lineLevel["ncee_line_level_name"]}有效分总分单上线", headerRow1, ci++, cellStyle.TitleStyle, sheet, orgWidth);
  1018. for (; ci < 30; ci++)
  1019. {
  1020. _exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  1021. }
  1022. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1023. // 方向标题
  1024. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1025. headerRow2.HeightInPoints = 15;
  1026. ci = 0;
  1027. _exportExcelService.AddCell(orgTitle, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1028. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1029. {
  1030. _exportExcelService.AddCell($"{directionCourse.Name}类", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1031. for (int i = 0; i < 12; i++)
  1032. {
  1033. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1034. }
  1035. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 13, ci - 1));
  1036. }
  1037. _exportExcelService.AddCell("合计", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1038. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1039. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1040. // 学科上有效分标题
  1041. IRow headerRow3 = sheet.CreateRow(rowNum++);
  1042. headerRow3.HeightInPoints = 15;
  1043. ci = 0;
  1044. _exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1045. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1046. {
  1047. _exportExcelService.AddCell("学科上有效分人数及比例", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1048. for (int i = 0; i < 9; i++)
  1049. {
  1050. _exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1051. }
  1052. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 10, ci - 1));
  1053. _exportExcelService.AddCell("总分上\n线情况", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1054. _exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1055. _exportExcelService.AddCell("上线率", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1056. }
  1057. _exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1058. _exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1059. _exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1060. // 科目标题
  1061. IRow headerRow4 = sheet.CreateRow(rowNum++);
  1062. headerRow4.HeightInPoints = 15;
  1063. ci = 0;
  1064. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1065. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1066. {
  1067. foreach (var cu in courses.Where(t => t.Id < 4 || t.Id == directionCourse.Id || t.Id == 101))
  1068. {
  1069. _exportExcelService.AddCell(cu.Name, headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1070. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1071. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1072. }
  1073. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1074. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1075. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, ci - 2, ci - 1));
  1076. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1077. }
  1078. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1079. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1080. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1081. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 3, rowNum - 1, 0, 0));
  1082. // 有效分标题
  1083. IRow headerRow5 = sheet.CreateRow(rowNum++);
  1084. headerRow5.HeightInPoints = 15;
  1085. ci = 0;
  1086. _exportExcelService.AddCell("有效分", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1087. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1088. {
  1089. var lineScore = lineScoreTable.Select($"direction_course_id = {directionCourse.Id} AND ncee_line_level = {lineLevel["ncee_line_level"]}").First();
  1090. foreach (var cu in courses.Where(t => t.Id < 4 || t.Id == directionCourse.Id || t.Id == 100 || t.Id == 101))
  1091. {
  1092. _exportExcelService.AddCell(lineScore[$"line_score_x_{cu.Id}"], headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1093. _exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1094. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1095. }
  1096. _exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1097. }
  1098. _exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1099. _exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1100. _exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1101. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 4, rowNum - 1, ci - 3, ci - 1));
  1102. // 人数比例标题
  1103. IRow headerRow6 = sheet.CreateRow(rowNum++);
  1104. headerRow6.HeightInPoints = 15;
  1105. ci = 0;
  1106. _exportExcelService.AddCell("", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1107. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1108. {
  1109. foreach (var cu in courses.Where(t => t.Id < 4 || t.Id == directionCourse.Id || t.Id == 101))
  1110. {
  1111. _exportExcelService.AddCell("人数", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1112. _exportExcelService.AddCell("比例", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1113. }
  1114. _exportExcelService.AddCell("参考", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1115. _exportExcelService.AddCell("上线", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1116. _exportExcelService.AddCell("", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1117. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 4, rowNum - 1, ci - 1, ci - 1));
  1118. }
  1119. _exportExcelService.AddCell("参考", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1120. _exportExcelService.AddCell("上线", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1121. _exportExcelService.AddCell("比例", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1122. #endregion
  1123. #region 数据
  1124. foreach (DataRow dr in table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = 4"))
  1125. {
  1126. IRow row = sheet.CreateRow(rowNum++);
  1127. row.HeightInPoints = 15;
  1128. int rci = 0;
  1129. _exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1130. foreach (var cu in courses.Where(t => t.Id < 5 || t.Id == 101))
  1131. {
  1132. _exportExcelService.AddCell(dr[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1133. _exportExcelService.AddCell(dr[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1134. }
  1135. _ = int.TryParse(dr["total_count_100"]?.ToString() ?? "", out int tc_4_100);
  1136. _ = int.TryParse(dr["line_count_100"]?.ToString() ?? "", out int lc_4_100);
  1137. _exportExcelService.AddCell(tc_4_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1138. _exportExcelService.AddCell(lc_4_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1139. _exportExcelService.AddCell(dr["line_rate_100"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1140. var dr8 = table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = 8 AND sys_org_id = {dr["sys_org_id"]}").FirstOrDefault();
  1141. int tc_8_100 = 0;
  1142. int lc_8_100 = 0;
  1143. if (dr8 != null)
  1144. {
  1145. foreach (var cu in courses.Where(t => t.Id < 4 || t.Id == 8 || t.Id == 101))
  1146. {
  1147. _exportExcelService.AddCell(dr8[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1148. _exportExcelService.AddCell(dr8[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1149. }
  1150. _ = int.TryParse(dr8["total_count_100"]?.ToString() ?? "", out int t8100);
  1151. tc_8_100 = t8100;
  1152. _ = int.TryParse(dr8["line_count_100"]?.ToString() ?? "", out int l8100);
  1153. lc_8_100 = l8100;
  1154. _exportExcelService.AddCell(tc_8_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1155. _exportExcelService.AddCell(lc_8_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1156. _exportExcelService.AddCell(dr8["line_rate_100"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1157. }
  1158. _exportExcelService.AddCell(tc_4_100 + tc_8_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1159. _exportExcelService.AddCell(lc_4_100 + lc_8_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1160. _exportExcelService.AddCell((lc_4_100 + lc_8_100) * 1.0 / (tc_4_100 + tc_8_100), row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1161. }
  1162. #endregion
  1163. rowNum += 2;
  1164. }
  1165. sheet.CreateFreezePane(1, 0);
  1166. }
  1167. #endregion
  1168. #region 双上线
  1169. {
  1170. var table = await GetLineCourseTable(nceePlanId);
  1171. ISheet sheet = wb.CreateSheet("有效分总分双上线");
  1172. sheet.DisplayGridlines = false;
  1173. // 行索引号
  1174. int rowNum = 0;
  1175. foreach (DataRow lineLevel in lineLevelTable.Rows)
  1176. {
  1177. #region 表头
  1178. // 分类标题
  1179. IRow headerRow1 = sheet.CreateRow(rowNum++);
  1180. headerRow1.HeightInPoints = 30;
  1181. int ci = 0;
  1182. int countWidth = 6;
  1183. int scoreWidth = 8;
  1184. int orgWidth = 10;
  1185. _exportExcelService.AddCell($"{lineLevel["ncee_line_level_name"]}有效分总分双上线", headerRow1, ci++, cellStyle.TitleStyle, sheet, orgWidth);
  1186. for (; ci < 21; ci++)
  1187. {
  1188. _exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  1189. }
  1190. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1191. // 方向标题
  1192. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1193. headerRow2.HeightInPoints = 15;
  1194. ci = 0;
  1195. _exportExcelService.AddCell(orgTitle, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1196. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1197. {
  1198. _exportExcelService.AddCell($"{directionCourse.Name}类", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1199. for (int i = 0; i < 9; i++)
  1200. {
  1201. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1202. }
  1203. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 10, ci - 1));
  1204. }
  1205. // 科目标题
  1206. IRow headerRow4 = sheet.CreateRow(rowNum++);
  1207. headerRow4.HeightInPoints = 15;
  1208. ci = 0;
  1209. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1210. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1211. {
  1212. foreach (var cu in courses.Where(t => t.Id < 4 || t.Id == directionCourse.Id || t.Id == 101))
  1213. {
  1214. var cuName = cu.Name;
  1215. if (cu.Id == 101)
  1216. {
  1217. cuName = $"{cuName}X";
  1218. }
  1219. _exportExcelService.AddCell(cuName, headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1220. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1221. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1222. }
  1223. }
  1224. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  1225. // 有效分标题
  1226. IRow headerRow5 = sheet.CreateRow(rowNum++);
  1227. headerRow5.HeightInPoints = 15;
  1228. ci = 0;
  1229. _exportExcelService.AddCell("有效分", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1230. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1231. {
  1232. var lineScore = lineScoreTable.Select($"direction_course_id = {directionCourse.Id} AND ncee_line_level = {lineLevel["ncee_line_level"]}").First();
  1233. foreach (var cu in courses.Where(t => t.Id < 4 || t.Id == directionCourse.Id || t.Id == 101))
  1234. {
  1235. _exportExcelService.AddCell(lineScore[$"line_score_x_{cu.Id}"], headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1236. _exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1237. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1238. }
  1239. }
  1240. // 人数比例标题
  1241. IRow headerRow6 = sheet.CreateRow(rowNum++);
  1242. headerRow6.HeightInPoints = 15;
  1243. ci = 0;
  1244. _exportExcelService.AddCell("", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1245. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1246. {
  1247. foreach (var cu in courses.Where(t => t.Id < 4 || t.Id == directionCourse.Id || t.Id == 101))
  1248. {
  1249. _exportExcelService.AddCell("人数", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1250. _exportExcelService.AddCell("比例", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1251. }
  1252. }
  1253. #endregion
  1254. #region 数据
  1255. foreach (DataRow dr in table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = 4"))
  1256. {
  1257. IRow row = sheet.CreateRow(rowNum++);
  1258. row.HeightInPoints = 15;
  1259. int rci = 0;
  1260. _exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1261. foreach (var cu in courses.Where(t => t.Id < 5 || t.Id == 101))
  1262. {
  1263. _exportExcelService.AddCell(dr[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1264. _exportExcelService.AddCell(dr[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1265. }
  1266. var dr8 = table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = 8 AND sys_org_id = {dr["sys_org_id"]}").FirstOrDefault();
  1267. if (dr8 != null)
  1268. {
  1269. foreach (var cu in courses.Where(t => t.Id < 4 || t.Id == 8 || t.Id == 101))
  1270. {
  1271. _exportExcelService.AddCell(dr8[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1272. _exportExcelService.AddCell(dr8[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1273. }
  1274. }
  1275. }
  1276. #endregion
  1277. rowNum += 2;
  1278. }
  1279. sheet.CreateFreezePane(1, 0);
  1280. }
  1281. #endregion
  1282. #region 转换区间
  1283. if (isExportConvertRange)
  1284. {
  1285. await ExportConvertRange(nceePlanId, wb, cellStyle);
  1286. }
  1287. #endregion
  1288. MemoryStream ms = new();
  1289. wb.Write(ms, false);
  1290. ms.Flush();
  1291. return ms.ToArray();
  1292. }
  1293. /// <summary>
  1294. /// 导出上线统计(未选科)
  1295. /// </summary>
  1296. /// <param name="nceePlanId"></param>
  1297. /// <param name="courses"></param>
  1298. /// <param name="lineLevelTable"></param>
  1299. /// <returns></returns>
  1300. private async Task<byte[]> ExportLineUnselected(int nceePlanId, List<NceeCourseDto> courses, DataTable lineLevelTable)
  1301. {
  1302. XSSFWorkbook wb = new();
  1303. var cellStyle = _exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  1304. #region 上线合并
  1305. await ExportLineTotal(nceePlanId, wb, cellStyle, "学校");
  1306. #endregion
  1307. #region 平均分
  1308. {
  1309. ISheet sheet = wb.CreateSheet("平均分");
  1310. sheet.DisplayGridlines = false;
  1311. // 行索引号
  1312. int rowNum = 0;
  1313. var table = await GetAvgScoreTable(nceePlanId, 99);
  1314. #region 表头
  1315. IRow headerRow1 = sheet.CreateRow(rowNum++);
  1316. headerRow1.HeightInPoints = 30;
  1317. int ci = 0;
  1318. int scoreWidth = 8;
  1319. _exportExcelService.AddCell($"平均分", headerRow1, ci++, cellStyle.TitleStyle, sheet, 10);
  1320. for (; ci < courses.Count * 2 + 1; ci++)
  1321. {
  1322. _exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  1323. }
  1324. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1325. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1326. headerRow2.HeightInPoints = 15;
  1327. ci = 0;
  1328. _exportExcelService.AddCell("学科", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1329. foreach (var course in courses)
  1330. {
  1331. string cn = course.Name;
  1332. _exportExcelService.AddCell(cn, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1333. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1334. if (ci % 2 == 1)
  1335. {
  1336. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1337. }
  1338. }
  1339. IRow headerRow3 = sheet.CreateRow(rowNum++);
  1340. headerRow3.HeightInPoints = 15;
  1341. ci = 0;
  1342. _exportExcelService.AddCell("学校", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1343. foreach (var course in courses)
  1344. {
  1345. _exportExcelService.AddCell("人数", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1346. _exportExcelService.AddCell("平均", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1347. }
  1348. #endregion
  1349. #region 数据
  1350. foreach (DataRow dr in table.Rows)
  1351. {
  1352. IRow row = sheet.CreateRow(rowNum++);
  1353. row.HeightInPoints = 15;
  1354. int rci = 0;
  1355. _exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1356. foreach (var course in courses)
  1357. {
  1358. _exportExcelService.AddCell(dr[$"total_count_{course.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1359. _exportExcelService.AddCell(dr[$"avg_score_x_{course.Id}"], row, rci++, cellStyle.NumberCellStyleP2, zeroToBlank: true);
  1360. }
  1361. }
  1362. #endregion
  1363. }
  1364. #endregion
  1365. #region 有效分
  1366. var lineScoreTable = await GetLineScoreTable(nceePlanId);
  1367. ExportLineScore(wb, cellStyle, lineScoreTable, courses);
  1368. #endregion
  1369. #region 单上线
  1370. {
  1371. var table = await GetLineTotalTable(nceePlanId);
  1372. ISheet sheet = wb.CreateSheet("有效分总分单上线");
  1373. sheet.DisplayGridlines = false;
  1374. // 行索引号
  1375. int rowNum = 0;
  1376. foreach (DataRow lineLevel in lineLevelTable.Rows)
  1377. {
  1378. #region 表头
  1379. // 分类标题
  1380. IRow headerRow1 = sheet.CreateRow(rowNum++);
  1381. headerRow1.HeightInPoints = 30;
  1382. int ci = 0;
  1383. int countWidth = 6;
  1384. int scoreWidth = 8;
  1385. int orgWidth = 10;
  1386. _exportExcelService.AddCell($"{lineLevel["ncee_line_level_name"]}有效分总分单上线", headerRow1, ci++, cellStyle.TitleStyle, sheet, orgWidth);
  1387. for (; ci < courses.Count * 2 + 1; ci++)
  1388. {
  1389. _exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  1390. }
  1391. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1392. // 科目标题
  1393. IRow headerRow4 = sheet.CreateRow(rowNum++);
  1394. headerRow4.HeightInPoints = 15;
  1395. ci = 0;
  1396. _exportExcelService.AddCell("科目", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1397. foreach (var cu in courses)
  1398. {
  1399. _exportExcelService.AddCell(cu.Name, headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1400. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1401. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1402. }
  1403. // 有效分标题
  1404. IRow headerRow5 = sheet.CreateRow(rowNum++);
  1405. headerRow5.HeightInPoints = 15;
  1406. ci = 0;
  1407. _exportExcelService.AddCell("有效分", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1408. var lineScore = lineScoreTable.Select($"direction_course_id = 99 AND ncee_line_level = {lineLevel["ncee_line_level"]}").First();
  1409. foreach (var cu in courses)
  1410. {
  1411. _exportExcelService.AddCell(lineScore[$"line_score_x_{cu.Id}"], headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1412. _exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1413. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1414. }
  1415. // 人数比例标题
  1416. IRow headerRow6 = sheet.CreateRow(rowNum++);
  1417. headerRow6.HeightInPoints = 15;
  1418. ci = 0;
  1419. _exportExcelService.AddCell("学校", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1420. foreach (var cu in courses)
  1421. {
  1422. _exportExcelService.AddCell("人数", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1423. _exportExcelService.AddCell("比例", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1424. }
  1425. #endregion
  1426. #region 数据
  1427. foreach (DataRow dr in table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = 99"))
  1428. {
  1429. IRow row = sheet.CreateRow(rowNum++);
  1430. row.HeightInPoints = 15;
  1431. int rci = 0;
  1432. _exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1433. foreach (var cu in courses)
  1434. {
  1435. _exportExcelService.AddCell(dr[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1436. _exportExcelService.AddCell(dr[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1437. }
  1438. }
  1439. #endregion
  1440. }
  1441. sheet.CreateFreezePane(1, 0);
  1442. }
  1443. #endregion
  1444. #region 双上线
  1445. {
  1446. var tcourse = courses.Where(t => t.Id < 100).ToList();
  1447. var table = await GetLineCourseTable(nceePlanId);
  1448. ISheet sheet = wb.CreateSheet("有效分总分双上线");
  1449. sheet.DisplayGridlines = false;
  1450. // 行索引号
  1451. int rowNum = 0;
  1452. foreach (DataRow lineLevel in lineLevelTable.Rows)
  1453. {
  1454. #region 表头
  1455. // 分类标题
  1456. IRow headerRow1 = sheet.CreateRow(rowNum++);
  1457. headerRow1.HeightInPoints = 30;
  1458. int ci = 0;
  1459. int countWidth = 6;
  1460. int scoreWidth = 8;
  1461. int orgWidth = 10;
  1462. _exportExcelService.AddCell($"{lineLevel["ncee_line_level_name"]}有效分总分双上线", headerRow1, ci++, cellStyle.TitleStyle, sheet, orgWidth);
  1463. for (; ci < tcourse.Count * 2 + 1; ci++)
  1464. {
  1465. _exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  1466. }
  1467. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1468. // 科目标题
  1469. IRow headerRow4 = sheet.CreateRow(rowNum++);
  1470. headerRow4.HeightInPoints = 15;
  1471. ci = 0;
  1472. _exportExcelService.AddCell("科目", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1473. foreach (var cu in tcourse)
  1474. {
  1475. _exportExcelService.AddCell(cu.Name, headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1476. _exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1477. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1478. }
  1479. // 有效分标题
  1480. IRow headerRow5 = sheet.CreateRow(rowNum++);
  1481. headerRow5.HeightInPoints = 15;
  1482. ci = 0;
  1483. _exportExcelService.AddCell("有效分", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1484. var lineScore = lineScoreTable.Select($"direction_course_id = 99 AND ncee_line_level = {lineLevel["ncee_line_level"]}").First();
  1485. foreach (var cu in tcourse)
  1486. {
  1487. _exportExcelService.AddCell(lineScore[$"line_score_x_{cu.Id}"], headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1488. _exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1489. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1490. }
  1491. // 人数比例标题
  1492. IRow headerRow6 = sheet.CreateRow(rowNum++);
  1493. headerRow6.HeightInPoints = 15;
  1494. ci = 0;
  1495. _exportExcelService.AddCell("学校", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1496. foreach (var cu in tcourse)
  1497. {
  1498. _exportExcelService.AddCell("人数", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1499. _exportExcelService.AddCell("比例", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1500. }
  1501. #endregion
  1502. #region 数据
  1503. foreach (DataRow dr in table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = 99"))
  1504. {
  1505. IRow row = sheet.CreateRow(rowNum++);
  1506. row.HeightInPoints = 15;
  1507. int rci = 0;
  1508. _exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1509. foreach (var cu in tcourse)
  1510. {
  1511. _exportExcelService.AddCell(dr[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1512. _exportExcelService.AddCell(dr[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1513. }
  1514. }
  1515. #endregion
  1516. }
  1517. sheet.CreateFreezePane(1, 0);
  1518. }
  1519. #endregion
  1520. MemoryStream ms = new();
  1521. wb.Write(ms, false);
  1522. ms.Flush();
  1523. return ms.ToArray();
  1524. }
  1525. /// <summary>
  1526. /// 导出转换成绩
  1527. /// </summary>
  1528. /// <param name="input"></param>
  1529. /// <returns></returns>
  1530. private async Task<byte[]> ExportConvertScore(ExportConvertScoreDto input)
  1531. {
  1532. XSSFWorkbook wb = new();
  1533. var cellStyle = _exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  1534. foreach (var dc in NceeUtil.DirectionCourses)
  1535. {
  1536. var table = await GetConvertScoreTable(input.NceePlanId, dc.Id, input.Org?.Id ?? 0);
  1537. ISheet sheet = wb.CreateSheet($"{dc.Name}类");
  1538. sheet.DisplayGridlines = false;
  1539. // 行索引号
  1540. int rowNum = 0;
  1541. #region 表头
  1542. IRow headerRow = sheet.CreateRow(rowNum++);
  1543. int ci = 0;
  1544. int scoreWidth = 8;
  1545. _exportExcelService.AddCell(input.OrgTitle, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1546. _exportExcelService.AddCell(input.ExamNumberTitle, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  1547. if (input.IsExportStudentName)
  1548. {
  1549. _exportExcelService.AddCell("姓名", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  1550. }
  1551. if (input.IsExportClassNumber)
  1552. {
  1553. _exportExcelService.AddCell("班级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1554. }
  1555. if (input.IsExportDirectionCourse)
  1556. {
  1557. _exportExcelService.AddCell("选科方向", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  1558. }
  1559. if (input.IsExportComb)
  1560. {
  1561. _exportExcelService.AddCell("选科组合", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  1562. }
  1563. _exportExcelService.AddCell("总分", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1564. _exportExcelService.AddCell("总分X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1565. if (input.IsExportOrder)
  1566. {
  1567. _exportExcelService.AddCell(input.OrderTotalTitle, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1568. _exportExcelService.AddCell(input.OrderOrgTitle, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1569. }
  1570. _exportExcelService.AddCell("语文", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1571. _exportExcelService.AddCell("数学", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1572. _exportExcelService.AddCell("英语", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1573. _exportExcelService.AddCell(dc.Name, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1574. _exportExcelService.AddCell("综合", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1575. _exportExcelService.AddCell("综合X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1576. _exportExcelService.AddCell("等级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth + 2);
  1577. _exportExcelService.AddCell("化学", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1578. _exportExcelService.AddCell("化学X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1579. _exportExcelService.AddCell("等级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1580. _exportExcelService.AddCell("生物", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1581. _exportExcelService.AddCell("生物X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1582. _exportExcelService.AddCell("等级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1583. _exportExcelService.AddCell("政治", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1584. _exportExcelService.AddCell("政治X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1585. _exportExcelService.AddCell("等级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1586. _exportExcelService.AddCell("地理", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1587. _exportExcelService.AddCell("地理X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1588. _exportExcelService.AddCell("等级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1589. sheet.CreateFreezePane(0, rowNum);
  1590. #endregion
  1591. #region 数据
  1592. foreach (DataRow dr in table.Rows)
  1593. {
  1594. List<string> cgns =
  1595. [
  1596. dr["ncee_convert_grade_name_5"].ToString(),
  1597. dr["ncee_convert_grade_name_6"].ToString(),
  1598. dr["ncee_convert_grade_name_7"].ToString(),
  1599. dr["ncee_convert_grade_name_9"].ToString()
  1600. ];
  1601. //cgns = cgns.Where(t => t != "").ToList();
  1602. //string cg = string.Join("", cgns);
  1603. //if (cg != "")
  1604. //{
  1605. // cg = $"[{cg}]";
  1606. //}
  1607. string cg = GetMergeGradeName(cgns);
  1608. IRow row = sheet.CreateRow(rowNum++);
  1609. int rci = 0;
  1610. _exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1611. _exportExcelService.AddCell(dr["exam_number"], row, rci++, cellStyle.CenterCellStyle);
  1612. if (input.IsExportStudentName)
  1613. {
  1614. _exportExcelService.AddCell(dr["name"], row, rci++, cellStyle.CenterCellStyle);
  1615. }
  1616. if (input.IsExportClassNumber)
  1617. {
  1618. _exportExcelService.AddCell(dr["class_number"], row, rci++, cellStyle.CenterCellStyle);
  1619. }
  1620. if (input.IsExportDirectionCourse)
  1621. {
  1622. _exportExcelService.AddCell(dr["direction_course_name"], row, rci++, cellStyle.CenterCellStyle);
  1623. }
  1624. if (input.IsExportComb)
  1625. {
  1626. _exportExcelService.AddCell(dr["ncee_course_comb_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1627. }
  1628. _exportExcelService.AddCell(dr["score"], row, rci++, cellStyle.CenterCellStyle);
  1629. _exportExcelService.AddCell(dr["score_x"], row, rci++, cellStyle.CenterCellStyle);
  1630. if (input.IsExportOrder)
  1631. {
  1632. _exportExcelService.AddCell(dr["order_in_total_x"], row, rci++, cellStyle.CenterCellStyle);
  1633. _exportExcelService.AddCell(dr["order_in_org_x"], row, rci++, cellStyle.CenterCellStyle);
  1634. }
  1635. _exportExcelService.AddCell(dr["score_1"], row, rci++, cellStyle.CenterCellStyle);
  1636. _exportExcelService.AddCell(dr["score_2"], row, rci++, cellStyle.CenterCellStyle);
  1637. _exportExcelService.AddCell(dr["score_3"], row, rci++, cellStyle.CenterCellStyle);
  1638. _exportExcelService.AddCell(dr[$"score_{dc.Id}"], row, rci++, cellStyle.CenterCellStyle);
  1639. _exportExcelService.AddCell(dr["comb_score"], row, rci++, cellStyle.CenterCellStyle);
  1640. _exportExcelService.AddCell(dr["comb_score_x"], row, rci++, cellStyle.CenterCellStyle);
  1641. _exportExcelService.AddCell(cg, row, rci++, cellStyle.CenterCellStyle);
  1642. _exportExcelService.AddCell(dr["score_5"], row, rci++, cellStyle.CenterCellStyle);
  1643. _exportExcelService.AddCell(dr["score_x_5"], row, rci++, cellStyle.CenterCellStyle);
  1644. _exportExcelService.AddCell(dr["ncee_convert_grade_name_5"], row, rci++, cellStyle.CenterCellStyle);
  1645. _exportExcelService.AddCell(dr["score_6"], row, rci++, cellStyle.CenterCellStyle);
  1646. _exportExcelService.AddCell(dr["score_x_6"], row, rci++, cellStyle.CenterCellStyle);
  1647. _exportExcelService.AddCell(dr["ncee_convert_grade_name_6"], row, rci++, cellStyle.CenterCellStyle);
  1648. _exportExcelService.AddCell(dr["score_7"], row, rci++, cellStyle.CenterCellStyle);
  1649. _exportExcelService.AddCell(dr["score_x_7"], row, rci++, cellStyle.CenterCellStyle);
  1650. _exportExcelService.AddCell(dr["ncee_convert_grade_name_7"], row, rci++, cellStyle.CenterCellStyle);
  1651. _exportExcelService.AddCell(dr["score_9"], row, rci++, cellStyle.CenterCellStyle);
  1652. _exportExcelService.AddCell(dr["score_x_9"], row, rci++, cellStyle.CenterCellStyle);
  1653. _exportExcelService.AddCell(dr["ncee_convert_grade_name_9"], row, rci++, cellStyle.CenterCellStyle);
  1654. }
  1655. #endregion
  1656. }
  1657. // 导出转换区间
  1658. if (input.IsExportConvertRange)
  1659. {
  1660. await ExportConvertRange(input.NceePlanId, wb, cellStyle);
  1661. }
  1662. MemoryStream ms = new();
  1663. wb.Write(ms, false);
  1664. ms.Flush();
  1665. return ms.ToArray();
  1666. }
  1667. /// <summary>
  1668. /// 导出汇总班级上线情况
  1669. /// </summary>
  1670. /// <param name="nceePlanId"></param>
  1671. /// <param name="baseLineTable"></param>
  1672. /// <returns></returns>
  1673. private async Task<byte[]> ExportClassLine(int nceePlanId, DataTable baseLineTable)
  1674. {
  1675. XSSFWorkbook wb = new();
  1676. var cellStyle = _exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  1677. var cellStyleIndent1 = wb.CreateCellStyle();
  1678. cellStyleIndent1.CloneStyleFrom(cellStyle.LeftCellStyle);
  1679. cellStyleIndent1.Indention = 1;
  1680. var cellStyleIndent2 = wb.CreateCellStyle();
  1681. cellStyleIndent2.CloneStyleFrom(cellStyle.LeftCellStyle);
  1682. cellStyleIndent2.Indention = 2;
  1683. #region 总分上线
  1684. {
  1685. var table = await GetOrgLineTotalTable2(nceePlanId, 0);
  1686. ISheet sheet = wb.CreateSheet("总分上线");
  1687. sheet.DisplayGridlines = false;
  1688. // 行索引号
  1689. int rowNum = 0;
  1690. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1691. {
  1692. var nls = baseLineTable.Select($"direction_course_id = {directionCourse.Id}");
  1693. #region 标题
  1694. IRow titleRow = sheet.CreateRow(rowNum++);
  1695. titleRow.HeightInPoints = 30;
  1696. int ci = 0;
  1697. int scoreWidth = 10;
  1698. _exportExcelService.AddCell($"{directionCourse.Name}类总分上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  1699. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  1700. foreach (var nl in nls)
  1701. {
  1702. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1703. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1704. }
  1705. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1706. #endregion
  1707. #region 表头
  1708. IRow headerRow = sheet.CreateRow(rowNum++);
  1709. ci = 0;
  1710. _exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1711. _exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1712. foreach (var nl in nls)
  1713. {
  1714. _exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({nl["line_score_x"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1715. _exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1716. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1717. }
  1718. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1719. ci = 0;
  1720. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1721. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1722. foreach (var nl in nls)
  1723. {
  1724. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1725. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1726. }
  1727. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  1728. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  1729. #endregion
  1730. foreach (DataRow dr in table.Select($"direction_course_id = {directionCourse.Id}"))
  1731. {
  1732. IRow row = sheet.CreateRow(rowNum++);
  1733. int rci = 0;
  1734. var type = (long)dr["type"];
  1735. string itemName = "";
  1736. switch (type)
  1737. {
  1738. case 1:
  1739. itemName = $"{dr["sys_org_name"]}";
  1740. break;
  1741. case 2:
  1742. itemName = $"{dr["ncee_course_comb_name"]}";
  1743. break;
  1744. case 3:
  1745. itemName = $"{dr["class_number"]}班";
  1746. break;
  1747. }
  1748. _exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  1749. _exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  1750. foreach (var nl in nls)
  1751. {
  1752. _exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  1753. _exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  1754. }
  1755. }
  1756. rowNum += 1;
  1757. }
  1758. }
  1759. #endregion
  1760. #region 双上线
  1761. {
  1762. var table = await GetOrgLineCourseTable2(nceePlanId, 0);
  1763. ISheet sheet = wb.CreateSheet("双上线");
  1764. sheet.DisplayGridlines = false;
  1765. // 行索引号
  1766. int rowNum = 0;
  1767. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1768. {
  1769. var nls = baseLineTable.Select($"direction_course_id = {directionCourse.Id}");
  1770. #region 标题
  1771. IRow titleRow = sheet.CreateRow(rowNum++);
  1772. titleRow.HeightInPoints = 30;
  1773. int ci = 0;
  1774. int scoreWidth = 10;
  1775. _exportExcelService.AddCell($"{directionCourse.Name}类双上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  1776. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  1777. foreach (var nl in nls)
  1778. {
  1779. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1780. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1781. }
  1782. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1783. #endregion
  1784. var lineScoreTable = await GetLineScoreTable2(nceePlanId);
  1785. foreach (var lst in lineScoreTable.Select($"direction_course_id = {directionCourse.Id} AND course_id <> 100"))
  1786. {
  1787. #region 表头
  1788. IRow subTitleRow = sheet.CreateRow(rowNum++);
  1789. ci = 0;
  1790. _exportExcelService.AddCell($"{lst["course_name"]}", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1791. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1792. foreach (var nl in nls)
  1793. {
  1794. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1795. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1796. }
  1797. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1798. IRow headerRow = sheet.CreateRow(rowNum++);
  1799. ci = 0;
  1800. _exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1801. _exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1802. foreach (var nl in nls)
  1803. {
  1804. _exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({lst[$"line_score_x_{nl["ncee_line_level"]}"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1805. _exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1806. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1807. }
  1808. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1809. ci = 0;
  1810. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1811. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1812. foreach (var nl in nls)
  1813. {
  1814. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1815. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1816. }
  1817. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  1818. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  1819. #endregion
  1820. foreach (DataRow dr in table.Select($"direction_course_id = {directionCourse.Id} AND course_id = {lst["course_id"]}"))
  1821. {
  1822. IRow row = sheet.CreateRow(rowNum++);
  1823. int rci = 0;
  1824. short type = (short)dr["type"];
  1825. string itemName = "";
  1826. switch (type)
  1827. {
  1828. case 1:
  1829. itemName = $"{dr["sys_org_name"]}";
  1830. break;
  1831. case 2:
  1832. itemName = $"{dr["ncee_course_comb_name"]}";
  1833. break;
  1834. case 3:
  1835. itemName = $"{dr["class_number"]}班";
  1836. break;
  1837. }
  1838. _exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  1839. _exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  1840. foreach (var nl in nls)
  1841. {
  1842. _exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  1843. _exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  1844. }
  1845. }
  1846. rowNum += 1;
  1847. }
  1848. }
  1849. }
  1850. #endregion
  1851. MemoryStream ms = new();
  1852. wb.Write(ms, false);
  1853. ms.Flush();
  1854. return ms.ToArray();
  1855. }
  1856. /// <summary>
  1857. /// 导出汇总班级上线情况(未选科)
  1858. /// </summary>
  1859. /// <param name="nceePlanId"></param>
  1860. /// <param name="baseLineTable"></param>
  1861. /// <returns></returns>
  1862. private async Task<byte[]> ExportClassLineUnselected(int nceePlanId, DataTable baseLineTable)
  1863. {
  1864. XSSFWorkbook wb = new();
  1865. var cellStyle = _exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  1866. var cellStyleIndent1 = wb.CreateCellStyle();
  1867. cellStyleIndent1.CloneStyleFrom(cellStyle.LeftCellStyle);
  1868. cellStyleIndent1.Indention = 1;
  1869. var cellStyleIndent2 = wb.CreateCellStyle();
  1870. cellStyleIndent2.CloneStyleFrom(cellStyle.LeftCellStyle);
  1871. cellStyleIndent2.Indention = 2;
  1872. #region 总分上线
  1873. {
  1874. var table = await GetOrgLineTotalTable2(nceePlanId, 0);
  1875. ISheet sheet = wb.CreateSheet("总分上线");
  1876. sheet.DisplayGridlines = false;
  1877. // 行索引号
  1878. int rowNum = 0;
  1879. var nls = baseLineTable.Select($"direction_course_id = 99");
  1880. #region 标题
  1881. IRow titleRow = sheet.CreateRow(rowNum++);
  1882. titleRow.HeightInPoints = 30;
  1883. int ci = 0;
  1884. int scoreWidth = 10;
  1885. _exportExcelService.AddCell($"总分上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  1886. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  1887. foreach (var nl in nls)
  1888. {
  1889. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1890. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1891. }
  1892. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1893. #endregion
  1894. #region 表头
  1895. IRow headerRow = sheet.CreateRow(rowNum++);
  1896. ci = 0;
  1897. _exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1898. _exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1899. foreach (var nl in nls)
  1900. {
  1901. _exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({nl["line_score_x"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1902. _exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1903. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1904. }
  1905. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1906. ci = 0;
  1907. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1908. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1909. foreach (var nl in nls)
  1910. {
  1911. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1912. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1913. }
  1914. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  1915. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  1916. #endregion
  1917. foreach (DataRow dr in table.Select($"direction_course_id = 99"))
  1918. {
  1919. short type = (short)dr["type"];
  1920. if (type == 2)
  1921. {
  1922. continue;
  1923. }
  1924. IRow row = sheet.CreateRow(rowNum++);
  1925. int rci = 0;
  1926. string itemName = "";
  1927. switch (type)
  1928. {
  1929. case 1:
  1930. itemName = $"{dr["sys_org_name"]}";
  1931. break;
  1932. case 3:
  1933. itemName = $"{dr["class_number"]}班";
  1934. break;
  1935. }
  1936. _exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  1937. _exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  1938. foreach (var nl in nls)
  1939. {
  1940. _exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  1941. _exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  1942. }
  1943. }
  1944. }
  1945. #endregion
  1946. #region 双上线
  1947. {
  1948. var table = await GetOrgLineCourseTable2(nceePlanId, 0);
  1949. ISheet sheet = wb.CreateSheet("双上线");
  1950. sheet.DisplayGridlines = false;
  1951. // 行索引号
  1952. int rowNum = 0;
  1953. var nls = baseLineTable.Select($"direction_course_id = 99");
  1954. #region 标题
  1955. IRow titleRow = sheet.CreateRow(rowNum++);
  1956. titleRow.HeightInPoints = 30;
  1957. int ci = 0;
  1958. int scoreWidth = 10;
  1959. _exportExcelService.AddCell($"双上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  1960. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  1961. foreach (var nl in nls)
  1962. {
  1963. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1964. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1965. }
  1966. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1967. #endregion
  1968. var lineScoreTable = await GetLineScoreTable2(nceePlanId);
  1969. foreach (var lst in lineScoreTable.Select($"direction_course_id = 99 AND course_id <> 100"))
  1970. {
  1971. #region 表头
  1972. IRow subTitleRow = sheet.CreateRow(rowNum++);
  1973. ci = 0;
  1974. _exportExcelService.AddCell($"{lst["course_name"]}", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1975. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1976. foreach (var nl in nls)
  1977. {
  1978. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1979. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1980. }
  1981. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1982. IRow headerRow = sheet.CreateRow(rowNum++);
  1983. ci = 0;
  1984. _exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1985. _exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1986. foreach (var nl in nls)
  1987. {
  1988. _exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({lst[$"line_score_x_{nl["ncee_line_level"]}"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1989. _exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1990. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1991. }
  1992. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1993. ci = 0;
  1994. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1995. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1996. foreach (var nl in nls)
  1997. {
  1998. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1999. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2000. }
  2001. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  2002. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  2003. #endregion
  2004. foreach (DataRow dr in table.Select($"direction_course_id = 99 AND course_id = {lst["course_id"]}"))
  2005. {
  2006. short type = (short)dr["type"];
  2007. if (type == 2)
  2008. {
  2009. continue;
  2010. }
  2011. IRow row = sheet.CreateRow(rowNum++);
  2012. int rci = 0;
  2013. string itemName = "";
  2014. switch (type)
  2015. {
  2016. case 1:
  2017. itemName = $"{dr["sys_org_name"]}";
  2018. break;
  2019. case 2:
  2020. itemName = $"{dr["ncee_course_comb_name"]}";
  2021. break;
  2022. case 3:
  2023. itemName = $"{dr["class_number"]}班";
  2024. break;
  2025. }
  2026. _exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  2027. _exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  2028. foreach (var nl in nls)
  2029. {
  2030. _exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  2031. _exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  2032. }
  2033. }
  2034. }
  2035. }
  2036. #endregion
  2037. MemoryStream ms = new();
  2038. wb.Write(ms, false);
  2039. ms.Flush();
  2040. return ms.ToArray();
  2041. }
  2042. /// <summary>
  2043. /// 导出各机构转换成绩
  2044. /// </summary>
  2045. /// <param name="nceePlanId"></param>
  2046. /// <param name="orgList"></param>
  2047. /// <param name="isExportConvertRange">导出转换区间</param>
  2048. /// <param name="isExportOrder">导出排名</param>
  2049. /// <returns></returns>
  2050. private async Task<Dictionary<string, byte[]>> ExportOrgConvertScore(int nceePlanId, List<SysOrgOutput> orgList, bool isExportConvertRange = false, bool isExportOrder = false)
  2051. {
  2052. Dictionary<string, byte[]> ret = [];
  2053. foreach (var org in orgList)
  2054. {
  2055. var bs = await ExportConvertScore(new ExportConvertScoreDto
  2056. {
  2057. NceePlanId = nceePlanId,
  2058. Org = org,
  2059. IsExportConvertRange = isExportConvertRange,
  2060. IsExportOrder = isExportOrder,
  2061. IsExportStudentName = true,
  2062. IsExportComb = true,
  2063. IsExportDirectionCourse = true,
  2064. IsExportClassNumber = true,
  2065. });
  2066. ret.Add($"{org.Code}-{org.ShortName}", bs);
  2067. }
  2068. return ret;
  2069. }
  2070. /// <summary>
  2071. /// 导出各机构班级上线情况
  2072. /// </summary>
  2073. /// <param name="nceePlanId"></param>
  2074. /// <param name="orgList"></param>
  2075. /// <param name="baseLineTable"></param>
  2076. /// <param name="courses"></param>
  2077. /// <returns></returns>
  2078. private async Task<Dictionary<string, byte[]>> ExportOrgClassLine(int nceePlanId, List<SysOrgOutput> orgList, DataTable baseLineTable, List<NceeCourseDto> courses)
  2079. {
  2080. Dictionary<string, byte[]> ret = [];
  2081. foreach (var org in orgList)
  2082. {
  2083. IWorkbook wb = new XSSFWorkbook();
  2084. var cellStyle = _exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  2085. var cellStyleIndent1 = wb.CreateCellStyle();
  2086. cellStyleIndent1.CloneStyleFrom(cellStyle.LeftCellStyle);
  2087. cellStyleIndent1.Indention = 1;
  2088. var cellStyleIndent2 = wb.CreateCellStyle();
  2089. cellStyleIndent2.CloneStyleFrom(cellStyle.LeftCellStyle);
  2090. cellStyleIndent2.Indention = 2;
  2091. #region 有效分
  2092. await ExportLineScore(nceePlanId, wb, cellStyle, isExportRate: false);
  2093. #endregion
  2094. #region 平均分
  2095. {
  2096. var tcourses = courses.Where(t => t.Id != 101).ToList();
  2097. ISheet sheet = wb.CreateSheet("平均分");
  2098. sheet.DisplayGridlines = false;
  2099. // 行索引号
  2100. int rowNum = 0;
  2101. foreach (var directionCourse in NceeUtil.DirectionCourses)
  2102. {
  2103. var table = await GetAvgScoreTable(nceePlanId, directionCourse.Id);
  2104. #region 表头
  2105. IRow headerRow1 = sheet.CreateRow(rowNum++);
  2106. headerRow1.HeightInPoints = 30;
  2107. int ci = 0;
  2108. int scoreWidth = 8;
  2109. _exportExcelService.AddCell($"{directionCourse.Name}类平均分", headerRow1, ci++, cellStyle.TitleStyle, sheet, 10);
  2110. for (; ci < 19; ci++)
  2111. {
  2112. _exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  2113. }
  2114. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2115. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2116. headerRow2.HeightInPoints = 15;
  2117. ci = 0;
  2118. _exportExcelService.AddCell("学科", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2119. foreach (var course in tcourses)
  2120. {
  2121. if (course.IsSkip(directionCourse.Id)) { continue; }
  2122. string cn = course.Name;
  2123. if (course.Id == 5 || course.Id == 6 || course.Id == 7 || course.Id == 9 || course.Id == 100)
  2124. {
  2125. cn = $"{cn}X";
  2126. }
  2127. _exportExcelService.AddCell(cn, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2128. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2129. if (ci % 2 == 1)
  2130. {
  2131. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2132. }
  2133. }
  2134. IRow headerRow3 = sheet.CreateRow(rowNum++);
  2135. headerRow3.HeightInPoints = 15;
  2136. ci = 0;
  2137. _exportExcelService.AddCell("学校", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2138. foreach (var course in tcourses)
  2139. {
  2140. if (course.IsSkip(directionCourse.Id)) { continue; }
  2141. _exportExcelService.AddCell("人数", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2142. _exportExcelService.AddCell("平均", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2143. }
  2144. #endregion
  2145. #region 数据
  2146. foreach (DataRow dr in table.Rows)
  2147. {
  2148. IRow row = sheet.CreateRow(rowNum++);
  2149. row.HeightInPoints = 15;
  2150. int rci = 0;
  2151. _exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  2152. foreach (var course in tcourses)
  2153. {
  2154. if (course.IsSkip(directionCourse.Id)) { continue; }
  2155. _exportExcelService.AddCell(dr[$"total_count_{course.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  2156. _exportExcelService.AddCell(dr[$"avg_score_x_{course.Id}"], row, rci++, cellStyle.NumberCellStyleP2, zeroToBlank: true);
  2157. }
  2158. }
  2159. #endregion
  2160. rowNum += 2;
  2161. }
  2162. }
  2163. #endregion
  2164. #region 总分上线
  2165. {
  2166. var table = await GetOrgLineTotalTable2(nceePlanId, org.Id);
  2167. ISheet sheet = wb.CreateSheet("总分上线");
  2168. sheet.DisplayGridlines = false;
  2169. // 行索引号
  2170. int rowNum = 0;
  2171. foreach (var directionCourse in NceeUtil.DirectionCourses)
  2172. {
  2173. var nls = baseLineTable.Select($"direction_course_id = {directionCourse.Id}");
  2174. #region 表头
  2175. IRow titleRow = sheet.CreateRow(rowNum++);
  2176. titleRow.HeightInPoints = 30;
  2177. int ci = 0;
  2178. int scoreWidth = 10;
  2179. _exportExcelService.AddCell($"{org.ShortName}{directionCourse.Name}类总分上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  2180. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  2181. foreach (var nl in nls)
  2182. {
  2183. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2184. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2185. }
  2186. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2187. IRow headerRow = sheet.CreateRow(rowNum++);
  2188. ci = 0;
  2189. _exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2190. _exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2191. foreach (var nl in nls)
  2192. {
  2193. _exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({nl["line_score_x"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2194. _exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2195. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2196. }
  2197. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2198. ci = 0;
  2199. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2200. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2201. foreach (var nl in nls)
  2202. {
  2203. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2204. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2205. }
  2206. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  2207. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  2208. #endregion
  2209. #region 数据
  2210. foreach (DataRow dr in table.Select($"direction_course_id = {directionCourse.Id}"))
  2211. {
  2212. IRow row = sheet.CreateRow(rowNum++);
  2213. int rci = 0;
  2214. var type = (long)dr["type"];
  2215. string itemName = "";
  2216. switch (type)
  2217. {
  2218. case 1:
  2219. itemName = $"{dr["sys_org_name"]}";
  2220. break;
  2221. case 2:
  2222. itemName = $"{dr["ncee_course_comb_name"]}";
  2223. break;
  2224. case 3:
  2225. itemName = $"{dr["class_number"]}班";
  2226. break;
  2227. }
  2228. _exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  2229. _exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  2230. foreach (var nl in nls)
  2231. {
  2232. _exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  2233. _exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  2234. }
  2235. }
  2236. #endregion
  2237. rowNum += 1;
  2238. }
  2239. }
  2240. #endregion
  2241. #region 双上线
  2242. {
  2243. var table = await GetOrgLineCourseTable2(nceePlanId, org.Id);
  2244. var lineScoreTable = await GetLineScoreTable2(nceePlanId);
  2245. ISheet sheet = wb.CreateSheet("双上线");
  2246. sheet.DisplayGridlines = false;
  2247. // 行索引号
  2248. int rowNum = 0;
  2249. foreach (var directionCourse in NceeUtil.DirectionCourses)
  2250. {
  2251. var nls = baseLineTable.Select($"direction_course_id = {directionCourse.Id}");
  2252. IRow titleRow = sheet.CreateRow(rowNum++);
  2253. titleRow.HeightInPoints = 30;
  2254. int ci = 0;
  2255. int scoreWidth = 10;
  2256. _exportExcelService.AddCell($"{org.ShortName}{directionCourse.Name}类双上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  2257. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  2258. foreach (var nl in nls)
  2259. {
  2260. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2261. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2262. }
  2263. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2264. foreach (var lst in lineScoreTable.Select($"direction_course_id = {directionCourse.Id} AND course_id <> 100"))
  2265. {
  2266. #region 表头
  2267. IRow subTitleRow = sheet.CreateRow(rowNum++);
  2268. ci = 0;
  2269. _exportExcelService.AddCell($"{lst["course_name"]}", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2270. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2271. foreach (var nl in nls)
  2272. {
  2273. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2274. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2275. }
  2276. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2277. IRow headerRow = sheet.CreateRow(rowNum++);
  2278. ci = 0;
  2279. _exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2280. _exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2281. foreach (var nl in nls)
  2282. {
  2283. _exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({lst[$"line_score_x_{nl["ncee_line_level"]}"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2284. _exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2285. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2286. }
  2287. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2288. ci = 0;
  2289. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2290. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2291. foreach (var nl in nls)
  2292. {
  2293. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2294. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2295. }
  2296. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  2297. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  2298. #endregion
  2299. #region 数据
  2300. foreach (DataRow dr in table.Select($"direction_course_id = {directionCourse.Id} AND course_id = {lst["course_id"]}"))
  2301. {
  2302. IRow row = sheet.CreateRow(rowNum++);
  2303. int rci = 0;
  2304. short type = (short)dr["type"];
  2305. string itemName = "";
  2306. switch (type)
  2307. {
  2308. case 1:
  2309. itemName = $"{dr["sys_org_name"]}";
  2310. break;
  2311. case 2:
  2312. itemName = $"{dr["ncee_course_comb_name"]}";
  2313. break;
  2314. case 3:
  2315. itemName = $"{dr["class_number"]}班";
  2316. break;
  2317. }
  2318. _exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  2319. _exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  2320. foreach (var nl in nls)
  2321. {
  2322. _exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  2323. _exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  2324. }
  2325. }
  2326. #endregion
  2327. rowNum += 1;
  2328. }
  2329. }
  2330. }
  2331. #endregion
  2332. MemoryStream ms = new();
  2333. wb.Write(ms, false);
  2334. ms.Flush();
  2335. ret.Add($"{org.Code}-{org.ShortName}", ms.ToArray());
  2336. }
  2337. return ret;
  2338. }
  2339. /// <summary>
  2340. /// 导出各机构班级上线情况(未选科)
  2341. /// </summary>
  2342. /// <param name="nceePlanId"></param>
  2343. /// <param name="orgList"></param>
  2344. /// <param name="baseLineTable"></param>
  2345. /// <param name="courses"></param>
  2346. /// <returns></returns>
  2347. private async Task<Dictionary<string, byte[]>> ExportOrgClassLineUnselected(int nceePlanId, List<SysOrgOutput> orgList, DataTable baseLineTable, List<NceeCourseDto> courses)
  2348. {
  2349. Dictionary<string, byte[]> ret = [];
  2350. foreach (var org in orgList)
  2351. {
  2352. IWorkbook wb = new XSSFWorkbook();
  2353. var cellStyle = _exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  2354. var cellStyleIndent1 = wb.CreateCellStyle();
  2355. cellStyleIndent1.CloneStyleFrom(cellStyle.LeftCellStyle);
  2356. cellStyleIndent1.Indention = 1;
  2357. var cellStyleIndent2 = wb.CreateCellStyle();
  2358. cellStyleIndent2.CloneStyleFrom(cellStyle.LeftCellStyle);
  2359. cellStyleIndent2.Indention = 2;
  2360. #region 有效分
  2361. var lstable = await GetLineScoreTable(nceePlanId);
  2362. ExportLineScore(wb, cellStyle, lstable, courses);
  2363. #endregion
  2364. #region 平均分
  2365. {
  2366. ISheet sheet = wb.CreateSheet("平均分");
  2367. sheet.DisplayGridlines = false;
  2368. // 行索引号
  2369. int rowNum = 0;
  2370. var table = await GetAvgScoreTable(nceePlanId, 99);
  2371. #region 表头
  2372. IRow headerRow1 = sheet.CreateRow(rowNum++);
  2373. headerRow1.HeightInPoints = 30;
  2374. int ci = 0;
  2375. int scoreWidth = 8;
  2376. _exportExcelService.AddCell($"平均分", headerRow1, ci++, cellStyle.TitleStyle, sheet, 10);
  2377. for (; ci < courses.Count * 2 + 1; ci++)
  2378. {
  2379. _exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  2380. }
  2381. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2382. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2383. headerRow2.HeightInPoints = 15;
  2384. ci = 0;
  2385. _exportExcelService.AddCell("学科", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2386. foreach (var course in courses)
  2387. {
  2388. string cn = course.Name;
  2389. _exportExcelService.AddCell(cn, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2390. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2391. if (ci % 2 == 1)
  2392. {
  2393. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2394. }
  2395. }
  2396. IRow headerRow3 = sheet.CreateRow(rowNum++);
  2397. headerRow3.HeightInPoints = 15;
  2398. ci = 0;
  2399. _exportExcelService.AddCell("学校", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2400. foreach (var course in courses)
  2401. {
  2402. _exportExcelService.AddCell("人数", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2403. _exportExcelService.AddCell("平均", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2404. }
  2405. #endregion
  2406. #region 数据
  2407. foreach (DataRow dr in table.Rows)
  2408. {
  2409. IRow row = sheet.CreateRow(rowNum++);
  2410. row.HeightInPoints = 15;
  2411. int rci = 0;
  2412. _exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  2413. foreach (var course in courses)
  2414. {
  2415. _exportExcelService.AddCell(dr[$"total_count_{course.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  2416. _exportExcelService.AddCell(dr[$"avg_score_x_{course.Id}"], row, rci++, cellStyle.NumberCellStyleP2, zeroToBlank: true);
  2417. }
  2418. }
  2419. #endregion
  2420. }
  2421. #endregion
  2422. #region 总分上线
  2423. {
  2424. var table = await GetOrgLineTotalTable2(nceePlanId, org.Id);
  2425. ISheet sheet = wb.CreateSheet("总分上线");
  2426. sheet.DisplayGridlines = false;
  2427. // 行索引号
  2428. int rowNum = 0;
  2429. var nls = baseLineTable.Select($"direction_course_id = 99");
  2430. #region 表头
  2431. IRow titleRow = sheet.CreateRow(rowNum++);
  2432. titleRow.HeightInPoints = 30;
  2433. int ci = 0;
  2434. int scoreWidth = 10;
  2435. _exportExcelService.AddCell($"{org.ShortName}总分上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  2436. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  2437. foreach (var nl in nls)
  2438. {
  2439. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2440. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2441. }
  2442. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2443. IRow headerRow = sheet.CreateRow(rowNum++);
  2444. ci = 0;
  2445. _exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2446. _exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2447. foreach (var nl in nls)
  2448. {
  2449. _exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({nl["line_score_x"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2450. _exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2451. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2452. }
  2453. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2454. ci = 0;
  2455. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2456. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2457. foreach (var nl in nls)
  2458. {
  2459. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2460. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2461. }
  2462. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  2463. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  2464. #endregion
  2465. #region 数据
  2466. foreach (DataRow dr in table.Select($"direction_course_id = 99"))
  2467. {
  2468. short type = (short)dr["type"];
  2469. if (type == 2)
  2470. {
  2471. continue;
  2472. }
  2473. IRow row = sheet.CreateRow(rowNum++);
  2474. int rci = 0;
  2475. string itemName = "";
  2476. switch (type)
  2477. {
  2478. case 1:
  2479. itemName = $"{dr["sys_org_name"]}";
  2480. break;
  2481. case 3:
  2482. itemName = $"{dr["class_number"]}班";
  2483. break;
  2484. }
  2485. _exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  2486. _exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  2487. foreach (var nl in nls)
  2488. {
  2489. _exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  2490. _exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  2491. }
  2492. }
  2493. #endregion
  2494. }
  2495. #endregion
  2496. #region 双上线
  2497. {
  2498. var table = await GetOrgLineCourseTable2(nceePlanId, org.Id);
  2499. var lineScoreTable = await GetLineScoreTable2(nceePlanId);
  2500. ISheet sheet = wb.CreateSheet("双上线");
  2501. sheet.DisplayGridlines = false;
  2502. // 行索引号
  2503. int rowNum = 0;
  2504. var nls = baseLineTable.Select($"direction_course_id = 99");
  2505. IRow titleRow = sheet.CreateRow(rowNum++);
  2506. titleRow.HeightInPoints = 30;
  2507. int ci = 0;
  2508. int scoreWidth = 10;
  2509. _exportExcelService.AddCell($"{org.ShortName}双上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  2510. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  2511. foreach (var nl in nls)
  2512. {
  2513. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2514. _exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2515. }
  2516. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2517. foreach (var lst in lineScoreTable.Select($"direction_course_id = 99 AND course_id <> 100"))
  2518. {
  2519. #region 表头
  2520. IRow subTitleRow = sheet.CreateRow(rowNum++);
  2521. ci = 0;
  2522. _exportExcelService.AddCell($"{lst["course_name"]}", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2523. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2524. foreach (var nl in nls)
  2525. {
  2526. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2527. _exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2528. }
  2529. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2530. IRow headerRow = sheet.CreateRow(rowNum++);
  2531. ci = 0;
  2532. _exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2533. _exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2534. foreach (var nl in nls)
  2535. {
  2536. _exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({lst[$"line_score_x_{nl["ncee_line_level"]}"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2537. _exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2538. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2539. }
  2540. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2541. ci = 0;
  2542. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2543. _exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2544. foreach (var nl in nls)
  2545. {
  2546. _exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2547. _exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2548. }
  2549. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  2550. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  2551. #endregion
  2552. #region 数据
  2553. foreach (DataRow dr in table.Select($"direction_course_id = 99 AND course_id = {lst["course_id"]}"))
  2554. {
  2555. short type = (short)dr["type"];
  2556. if (type == 2)
  2557. {
  2558. continue;
  2559. }
  2560. IRow row = sheet.CreateRow(rowNum++);
  2561. int rci = 0;
  2562. string itemName = "";
  2563. switch (type)
  2564. {
  2565. case 1:
  2566. itemName = $"{dr["sys_org_name"]}";
  2567. break;
  2568. case 3:
  2569. itemName = $"{dr["class_number"]}班";
  2570. break;
  2571. }
  2572. _exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  2573. _exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  2574. foreach (var nl in nls)
  2575. {
  2576. _exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  2577. _exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  2578. }
  2579. }
  2580. #endregion
  2581. rowNum += 1;
  2582. }
  2583. }
  2584. #endregion
  2585. MemoryStream ms = new();
  2586. wb.Write(ms, false);
  2587. ms.Flush();
  2588. ret.Add($"{org.Code}-{org.ShortName}", ms.ToArray());
  2589. }
  2590. return ret;
  2591. }
  2592. #endregion
  2593. #region 获取数据
  2594. /// <summary>
  2595. /// 获取上线合并数据
  2596. /// </summary>
  2597. /// <param name="nceePlanId"></param>
  2598. /// <returns></returns>
  2599. private async Task<DataTable> GetLineCountTable(int nceePlanId)
  2600. {
  2601. var dt = await _rep.SqlQueryAsync($@"
  2602. SELECT T1.*,
  2603. T2.d_4_total_count, T2.d_4_line_count_1, T2.d_4_line_count_2, T2.d_4_line_count_3,
  2604. T2.d_4_line_count_1 / T2.d_4_total_count AS d_4_line_rate_1,
  2605. T2.d_4_line_count_2 / T2.d_4_total_count AS d_4_line_rate_2,
  2606. T2.d_4_line_count_3 / T2.d_4_total_count AS d_4_line_rate_3,
  2607. T2.d_8_total_count, T2.d_8_line_count_1, T2.d_8_line_count_2, T2.d_8_line_count_3,
  2608. T2.d_8_line_count_1 / T2.d_8_total_count AS d_8_line_rate_1,
  2609. T2.d_8_line_count_2 / T2.d_8_total_count AS d_8_line_rate_2,
  2610. T2.d_8_line_count_3 / T2.d_8_total_count AS d_8_line_rate_3
  2611. FROM
  2612. (
  2613. SELECT IFNULL(T2.short_name, '合计') AS sys_org_name, T1.*,
  2614. T1.line_count_1 / T1.total_count AS line_rate_1,
  2615. T1.line_count_2 / T1.total_count AS line_rate_2,
  2616. T1.line_count_3 / T1.total_count AS line_rate_3
  2617. FROM
  2618. (
  2619. SELECT T1.type, T1.sys_org_id,
  2620. MAX(T1.total_count) AS total_count,
  2621. SUM(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_count ELSE 0 END) AS line_count_1,
  2622. SUM(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_count ELSE 0 END) AS line_count_2,
  2623. SUM(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_count ELSE 0 END) AS line_count_3
  2624. FROM
  2625. (
  2626. SELECT T1.type, T1.sys_org_id, T1.ncee_line_level, SUM(T1.line_count) AS line_count, SUM(T1.total_count) AS total_count
  2627. FROM ncee_line_total AS T1
  2628. WHERE T1.ncee_plan_id = {nceePlanId} AND (T1.type = 1 OR T1.type = 4) AND T1.ncee_course_comb_id IS NULL
  2629. GROUP BY T1.type, T1.sys_org_id, T1.ncee_line_level
  2630. ) AS T1
  2631. GROUP BY T1.type, T1.sys_org_id
  2632. ) AS T1
  2633. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  2634. ) AS T1
  2635. LEFT JOIN
  2636. (
  2637. SELECT T1.type, T1.sys_org_id,
  2638. MAX(CASE WHEN T1.direction_course_id = 4 THEN T1.total_count ELSE 0 END) AS d_4_total_count,
  2639. SUM(CASE WHEN T1.direction_course_id = 4 AND T1.ncee_line_level = 1 THEN T1.line_count ELSE 0 END) AS d_4_line_count_1,
  2640. SUM(CASE WHEN T1.direction_course_id = 4 AND T1.ncee_line_level = 2 THEN T1.line_count ELSE 0 END) AS d_4_line_count_2,
  2641. SUM(CASE WHEN T1.direction_course_id = 4 AND T1.ncee_line_level = 3 THEN T1.line_count ELSE 0 END) AS d_4_line_count_3,
  2642. MAX(CASE WHEN T1.direction_course_id = 8 THEN T1.total_count ELSE 0 END) AS d_8_total_count,
  2643. SUM(CASE WHEN T1.direction_course_id = 8 AND T1.ncee_line_level = 1 THEN T1.line_count ELSE 0 END) AS d_8_line_count_1,
  2644. SUM(CASE WHEN T1.direction_course_id = 8 AND T1.ncee_line_level = 2 THEN T1.line_count ELSE 0 END) AS d_8_line_count_2,
  2645. SUM(CASE WHEN T1.direction_course_id = 8 AND T1.ncee_line_level = 3 THEN T1.line_count ELSE 0 END) AS d_8_line_count_3
  2646. FROM
  2647. (
  2648. SELECT T1.direction_course_id, T1.type, T1.sys_org_id, T1.ncee_line_level, SUM(T1.line_count) AS line_count, SUM(T1.total_count) AS total_count
  2649. FROM ncee_line_total AS T1
  2650. WHERE T1.ncee_plan_id = {nceePlanId} AND (T1.type = 1 OR T1.type = 4) AND T1.ncee_course_comb_id IS NULL
  2651. GROUP BY T1.direction_course_id, T1.type, T1.sys_org_id, T1.ncee_line_level
  2652. ) AS T1
  2653. GROUP BY T1.type, T1.sys_org_id
  2654. ) AS T2 ON T1.type = T2.type AND IFNULL(T1.sys_org_id, 0) = IFNULL(T2.sys_org_id, 0)
  2655. ORDER BY T1.type, T1.sys_org_id
  2656. ");
  2657. return dt;
  2658. }
  2659. /// <summary>
  2660. /// 获取有效分数据
  2661. /// </summary>
  2662. /// <param name="nceePlanId"></param>
  2663. /// <returns></returns>
  2664. private async Task<DataTable> GetLineScoreTable(int nceePlanId)
  2665. {
  2666. var dt = await _rep.SqlQueryAsync(@"
  2667. SELECT T2.`name` AS direction_course_name,
  2668. T3.`name` AS ncee_line_level_name,
  2669. T1.*,
  2670. T4.line_rate,
  2671. COUNT(T1.ncee_line_level) OVER(PARTITION BY direction_course_id) AS ncee_level_count
  2672. FROM
  2673. (
  2674. SELECT T1.ncee_plan_id, T1.direction_course_id, T1.ncee_line_level,
  2675. MAX(IF(T1.course_id = 1, T1.line_score_x, NULL)) AS line_score_x_1,
  2676. MAX(IF(T1.course_id = 2, T1.line_score_x, NULL)) AS line_score_x_2,
  2677. MAX(IF(T1.course_id = 3, T1.line_score_x, NULL)) AS line_score_x_3,
  2678. MAX(IF(T1.course_id = 4, T1.line_score_x, NULL)) AS line_score_x_4,
  2679. MAX(IF(T1.course_id = 5, T1.line_score_x, NULL)) AS line_score_x_5,
  2680. MAX(IF(T1.course_id = 6, T1.line_score_x, NULL)) AS line_score_x_6,
  2681. MAX(IF(T1.course_id = 7, T1.line_score_x, NULL)) AS line_score_x_7,
  2682. MAX(IF(T1.course_id = 8, T1.line_score_x, NULL)) AS line_score_x_8,
  2683. MAX(IF(T1.course_id = 9, T1.line_score_x, NULL)) AS line_score_x_9,
  2684. MAX(IF(T1.course_id = 101, T1.line_score_x, NULL)) AS line_score_x_101,
  2685. MAX(IF(T1.course_id = 100, T1.line_score_x, NULL)) AS line_score_x_100
  2686. FROM ncee_course_line_score AS T1
  2687. WHERE T1.ncee_plan_id = @nceePlanId
  2688. GROUP BY T1.direction_course_id, T1.ncee_line_level
  2689. ) AS T1
  2690. JOIN base_course AS T2 ON T1.direction_course_id = T2.id
  2691. JOIN (SELECT * FROM sys_dict_data WHERE sys_dict_type_id = 211) AS T3 ON T1.ncee_line_level = T3.`value`
  2692. JOIN ncee_base_line AS T4 ON T1.ncee_plan_id = T4.ncee_plan_id AND T1.direction_course_id = T4.direction_course_id AND T1.ncee_line_level = T4.ncee_line_level
  2693. ORDER BY T1.direction_course_id, T1.ncee_line_level
  2694. ", new { NceePlanId = nceePlanId });
  2695. return dt;
  2696. }
  2697. /// <summary>
  2698. /// 获取有效分数据(科目未转置)
  2699. /// </summary>
  2700. /// <param name="nceePlanId"></param>
  2701. /// <returns></returns>
  2702. private async Task<DataTable> GetLineScoreTable2(int nceePlanId)
  2703. {
  2704. var dt = await _rep.SqlQueryAsync(@"
  2705. SELECT T2.`name` AS course_name, T1.*
  2706. FROM
  2707. (
  2708. SELECT T1.direction_course_id, T1.course_id,
  2709. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_score ELSE NULL END) AS line_score_1,
  2710. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_score ELSE NULL END) AS line_score_2,
  2711. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_score ELSE NULL END) AS line_score_3,
  2712. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_score_x ELSE NULL END) AS line_score_x_1,
  2713. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_score_x ELSE NULL END) AS line_score_x_2,
  2714. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_score_x ELSE NULL END) AS line_score_x_3
  2715. FROM ncee_course_line_score AS T1
  2716. WHERE T1.ncee_plan_id = @nceePlanId
  2717. GROUP BY T1.direction_course_id, T1.course_id
  2718. ) AS T1
  2719. JOIN base_course AS T2 ON T1.course_id = T2.id
  2720. ORDER BY T1.direction_course_id, T1.course_id
  2721. ", new { NceePlanId = nceePlanId });
  2722. return dt;
  2723. }
  2724. /// <summary>
  2725. /// 获取平均分数据
  2726. /// </summary>
  2727. /// <param name="nceePlanId"></param>
  2728. /// <param name="directionCourseId"></param>
  2729. /// <returns></returns>
  2730. private async Task<DataTable> GetAvgScoreTable(int nceePlanId, short directionCourseId)
  2731. {
  2732. var dt = await _rep.SqlQueryAsync(@"
  2733. SELECT IFNULL(T2.short_name, '合计') AS sys_org_short_name, T1.*
  2734. FROM
  2735. (
  2736. SELECT T1.direction_course_id, T1.sys_org_id,
  2737. MAX(T1.total_count) AS total_count,
  2738. SUM(CASE WHEN T1.course_id = 1 THEN T1.total_count ELSE 0 END) AS total_count_1,
  2739. SUM(CASE WHEN T1.course_id = 2 THEN T1.total_count ELSE 0 END) AS total_count_2,
  2740. SUM(CASE WHEN T1.course_id = 3 THEN T1.total_count ELSE 0 END) AS total_count_3,
  2741. SUM(CASE WHEN T1.course_id = 4 THEN T1.total_count ELSE 0 END) AS total_count_4,
  2742. SUM(CASE WHEN T1.course_id = 5 THEN T1.total_count ELSE 0 END) AS total_count_5,
  2743. SUM(CASE WHEN T1.course_id = 6 THEN T1.total_count ELSE 0 END) AS total_count_6,
  2744. SUM(CASE WHEN T1.course_id = 7 THEN T1.total_count ELSE 0 END) AS total_count_7,
  2745. SUM(CASE WHEN T1.course_id = 8 THEN T1.total_count ELSE 0 END) AS total_count_8,
  2746. SUM(CASE WHEN T1.course_id = 9 THEN T1.total_count ELSE 0 END) AS total_count_9,
  2747. SUM(CASE WHEN T1.course_id = 100 THEN T1.total_count ELSE 0 END) AS total_count_100,
  2748. SUM(CASE WHEN T1.course_id = 1 THEN T1.avg_score ELSE 0 END) AS avg_score_1,
  2749. SUM(CASE WHEN T1.course_id = 2 THEN T1.avg_score ELSE 0 END) AS avg_score_2,
  2750. SUM(CASE WHEN T1.course_id = 3 THEN T1.avg_score ELSE 0 END) AS avg_score_3,
  2751. SUM(CASE WHEN T1.course_id = 4 THEN T1.avg_score ELSE 0 END) AS avg_score_4,
  2752. SUM(CASE WHEN T1.course_id = 5 THEN T1.avg_score ELSE 0 END) AS avg_score_5,
  2753. SUM(CASE WHEN T1.course_id = 6 THEN T1.avg_score ELSE 0 END) AS avg_score_6,
  2754. SUM(CASE WHEN T1.course_id = 7 THEN T1.avg_score ELSE 0 END) AS avg_score_7,
  2755. SUM(CASE WHEN T1.course_id = 8 THEN T1.avg_score ELSE 0 END) AS avg_score_8,
  2756. SUM(CASE WHEN T1.course_id = 9 THEN T1.avg_score ELSE 0 END) AS avg_score_9,
  2757. SUM(CASE WHEN T1.course_id = 100 THEN T1.avg_score ELSE 0 END) AS avg_score_100,
  2758. SUM(CASE WHEN T1.course_id = 1 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_1,
  2759. SUM(CASE WHEN T1.course_id = 2 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_2,
  2760. SUM(CASE WHEN T1.course_id = 3 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_3,
  2761. SUM(CASE WHEN T1.course_id = 4 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_4,
  2762. SUM(CASE WHEN T1.course_id = 5 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_5,
  2763. SUM(CASE WHEN T1.course_id = 6 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_6,
  2764. SUM(CASE WHEN T1.course_id = 7 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_7,
  2765. SUM(CASE WHEN T1.course_id = 8 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_8,
  2766. SUM(CASE WHEN T1.course_id = 9 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_9,
  2767. SUM(CASE WHEN T1.course_id = 100 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_100
  2768. FROM
  2769. (
  2770. SELECT T1.direction_course_id, 9999 AS sys_org_id, 100 AS course_id, COUNT(1) total_count, AVG(T1.score) avg_score, AVG(T1.score_x) avg_score_x
  2771. FROM ncee_student AS T1
  2772. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  2773. GROUP BY T1.direction_course_id
  2774. UNION ALL
  2775. SELECT T1.direction_course_id, T1.sys_org_id, 100 AS course_id, COUNT(1) total_count, AVG(T1.score) avg_score, AVG(T1.score_x) avg_score_x
  2776. FROM ncee_student AS T1
  2777. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  2778. GROUP BY T1.direction_course_id, T1.sys_org_id
  2779. UNION ALL
  2780. SELECT T1.direction_course_id, 9999 AS sys_org_id, T2.course_id, COUNT(1) total_count, AVG(T2.score) avg_score, AVG(T2.score_x) avg_score_x
  2781. FROM ncee_student AS T1
  2782. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  2783. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  2784. GROUP BY T1.direction_course_id, T2.course_id
  2785. UNION ALL
  2786. SELECT T1.direction_course_id, T1.sys_org_id, T2.course_id, COUNT(1) total_count, AVG(T2.score) avg_score, AVG(T2.score_x) avg_score_x
  2787. FROM ncee_student AS T1
  2788. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  2789. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  2790. GROUP BY T1.direction_course_id, T1.sys_org_id, T2.course_id
  2791. ) AS T1
  2792. GROUP BY T1.direction_course_id, T1.sys_org_id
  2793. ) AS T1
  2794. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  2795. ORDER BY T1.direction_course_id, T1.sys_org_id
  2796. ", new { NceePlanId = nceePlanId, DirectionCourseId = directionCourseId });
  2797. return dt;
  2798. }
  2799. /// <summary>
  2800. /// 获取有效分上线(单上线)
  2801. /// </summary>
  2802. /// <param name="nceePlanId"></param>
  2803. /// <returns></returns>
  2804. private async Task<DataTable> GetLineTotalTable(int nceePlanId)
  2805. {
  2806. var dt = await _rep.SqlQueryAsync(@"
  2807. SELECT IFNULL(T2.short_name, '合计') AS sys_org_short_name, T1.*,
  2808. T3.line_count AS line_count_100,
  2809. T3.total_count AS total_count_100,
  2810. T3.line_rate AS line_rate_100
  2811. FROM
  2812. (
  2813. SELECT T1.type, T1.direction_course_id, IFNULL(T1.sys_org_id, 0) AS sys_org_id, T1.ncee_line_level,
  2814. MAX(IF(T1.course_id = 1, T1.total_count, NULL)) AS total_count_1,
  2815. MAX(IF(T1.course_id = 2, T1.total_count, NULL)) AS total_count_2,
  2816. MAX(IF(T1.course_id = 3, T1.total_count, NULL)) AS total_count_3,
  2817. MAX(IF(T1.course_id = 4, T1.total_count, NULL)) AS total_count_4,
  2818. MAX(IF(T1.course_id = 5, T1.total_count, NULL)) AS total_count_5,
  2819. MAX(IF(T1.course_id = 6, T1.total_count, NULL)) AS total_count_6,
  2820. MAX(IF(T1.course_id = 7, T1.total_count, NULL)) AS total_count_7,
  2821. MAX(IF(T1.course_id = 8, T1.total_count, NULL)) AS total_count_8,
  2822. MAX(IF(T1.course_id = 9, T1.total_count, NULL)) AS total_count_9,
  2823. MAX(IF(T1.course_id = 101, T1.total_count, NULL)) AS total_count_101,
  2824. MAX(IF(T1.course_id = 1, T1.line_count, NULL)) AS line_count_1,
  2825. MAX(IF(T1.course_id = 2, T1.line_count, NULL)) AS line_count_2,
  2826. MAX(IF(T1.course_id = 3, T1.line_count, NULL)) AS line_count_3,
  2827. MAX(IF(T1.course_id = 4, T1.line_count, NULL)) AS line_count_4,
  2828. MAX(IF(T1.course_id = 5, T1.line_count, NULL)) AS line_count_5,
  2829. MAX(IF(T1.course_id = 6, T1.line_count, NULL)) AS line_count_6,
  2830. MAX(IF(T1.course_id = 7, T1.line_count, NULL)) AS line_count_7,
  2831. MAX(IF(T1.course_id = 8, T1.line_count, NULL)) AS line_count_8,
  2832. MAX(IF(T1.course_id = 9, T1.line_count, NULL)) AS line_count_9,
  2833. MAX(IF(T1.course_id = 101, T1.line_count, NULL)) AS line_count_101,
  2834. MAX(IF(T1.course_id = 1, T1.line_rate, NULL)) AS line_rate_1,
  2835. MAX(IF(T1.course_id = 2, T1.line_rate, NULL)) AS line_rate_2,
  2836. MAX(IF(T1.course_id = 3, T1.line_rate, NULL)) AS line_rate_3,
  2837. MAX(IF(T1.course_id = 4, T1.line_rate, NULL)) AS line_rate_4,
  2838. MAX(IF(T1.course_id = 5, T1.line_rate, NULL)) AS line_rate_5,
  2839. MAX(IF(T1.course_id = 6, T1.line_rate, NULL)) AS line_rate_6,
  2840. MAX(IF(T1.course_id = 7, T1.line_rate, NULL)) AS line_rate_7,
  2841. MAX(IF(T1.course_id = 8, T1.line_rate, NULL)) AS line_rate_8,
  2842. MAX(IF(T1.course_id = 9, T1.line_rate, NULL)) AS line_rate_9,
  2843. MAX(IF(T1.course_id = 101, T1.line_rate, NULL)) AS line_rate_101
  2844. FROM ncee_line_course AS T1
  2845. WHERE T1.ncee_plan_id = @nceePlanId AND (T1.type = 1 OR T1.type = 4) AND T1.is_double_line = 0
  2846. GROUP BY T1.type, T1.direction_course_id, T1.sys_org_id, T1.ncee_line_level
  2847. ) AS T1
  2848. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  2849. LEFT JOIN
  2850. (
  2851. SELECT type, IFNULL(sys_org_id, 0) AS sys_org_id, ncee_line_level, direction_course_id, line_count, total_count, line_rate
  2852. FROM ncee_line_total AS T1
  2853. WHERE T1.ncee_plan_id = @nceePlanId AND (T1.type = 1 OR T1.type = 4)
  2854. ) AS T3 ON T1.type = T3.type AND T1.sys_org_id = T3.sys_org_id AND T1.ncee_line_level = T3.ncee_line_level AND T1.direction_course_id = T3.direction_course_id
  2855. ORDER BY T1.ncee_line_level, T1.direction_course_id, T1.type, T1.sys_org_id
  2856. ", new { NceePlanId = nceePlanId });
  2857. return dt;
  2858. }
  2859. /// <summary>
  2860. /// 获取有效分双上线数据
  2861. /// </summary>
  2862. /// <param name="nceePlanId"></param>
  2863. /// <returns></returns>
  2864. private async Task<DataTable> GetLineCourseTable(int nceePlanId)
  2865. {
  2866. var dt = await _rep.SqlQueryAsync(@"
  2867. SELECT IFNULL(T2.short_name, '合计') AS sys_org_short_name, T1.*
  2868. FROM
  2869. (
  2870. SELECT T1.type, T1.direction_course_id, IFNULL(T1.sys_org_id, 0) AS sys_org_id, T1.ncee_line_level,
  2871. MAX(IF(T1.course_id = 1, T1.total_count, NULL)) AS total_count_1,
  2872. MAX(IF(T1.course_id = 2, T1.total_count, NULL)) AS total_count_2,
  2873. MAX(IF(T1.course_id = 3, T1.total_count, NULL)) AS total_count_3,
  2874. MAX(IF(T1.course_id = 4, T1.total_count, NULL)) AS total_count_4,
  2875. MAX(IF(T1.course_id = 5, T1.total_count, NULL)) AS total_count_5,
  2876. MAX(IF(T1.course_id = 6, T1.total_count, NULL)) AS total_count_6,
  2877. MAX(IF(T1.course_id = 7, T1.total_count, NULL)) AS total_count_7,
  2878. MAX(IF(T1.course_id = 8, T1.total_count, NULL)) AS total_count_8,
  2879. MAX(IF(T1.course_id = 9, T1.total_count, NULL)) AS total_count_9,
  2880. MAX(IF(T1.course_id = 101, T1.total_count, NULL)) AS total_count_101,
  2881. MAX(IF(T1.course_id = 1, T1.line_count, NULL)) AS line_count_1,
  2882. MAX(IF(T1.course_id = 2, T1.line_count, NULL)) AS line_count_2,
  2883. MAX(IF(T1.course_id = 3, T1.line_count, NULL)) AS line_count_3,
  2884. MAX(IF(T1.course_id = 4, T1.line_count, NULL)) AS line_count_4,
  2885. MAX(IF(T1.course_id = 5, T1.line_count, NULL)) AS line_count_5,
  2886. MAX(IF(T1.course_id = 6, T1.line_count, NULL)) AS line_count_6,
  2887. MAX(IF(T1.course_id = 7, T1.line_count, NULL)) AS line_count_7,
  2888. MAX(IF(T1.course_id = 8, T1.line_count, NULL)) AS line_count_8,
  2889. MAX(IF(T1.course_id = 9, T1.line_count, NULL)) AS line_count_9,
  2890. MAX(IF(T1.course_id = 101, T1.line_count, NULL)) AS line_count_101,
  2891. MAX(IF(T1.course_id = 1, T1.line_rate, NULL)) AS line_rate_1,
  2892. MAX(IF(T1.course_id = 2, T1.line_rate, NULL)) AS line_rate_2,
  2893. MAX(IF(T1.course_id = 3, T1.line_rate, NULL)) AS line_rate_3,
  2894. MAX(IF(T1.course_id = 4, T1.line_rate, NULL)) AS line_rate_4,
  2895. MAX(IF(T1.course_id = 5, T1.line_rate, NULL)) AS line_rate_5,
  2896. MAX(IF(T1.course_id = 6, T1.line_rate, NULL)) AS line_rate_6,
  2897. MAX(IF(T1.course_id = 7, T1.line_rate, NULL)) AS line_rate_7,
  2898. MAX(IF(T1.course_id = 8, T1.line_rate, NULL)) AS line_rate_8,
  2899. MAX(IF(T1.course_id = 9, T1.line_rate, NULL)) AS line_rate_9,
  2900. MAX(IF(T1.course_id = 101, T1.line_rate, NULL)) AS line_rate_101
  2901. FROM ncee_line_course AS T1
  2902. WHERE T1.ncee_plan_id = @nceePlanId AND (T1.type = 1 OR T1.type = 4) AND T1.is_double_line = 1
  2903. GROUP BY T1.type, T1.direction_course_id, T1.sys_org_id, T1.ncee_line_level
  2904. ) AS T1
  2905. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  2906. ORDER BY T1.ncee_line_level, T1.direction_course_id, T1.type, T1.sys_org_id
  2907. ", new { NceePlanId = nceePlanId });
  2908. return dt;
  2909. }
  2910. /// <summary>
  2911. /// 获取机构组合班级有效分上线(单上线,含各单科)
  2912. /// </summary>
  2913. /// <param name="nceePlanId"></param>
  2914. /// <param name="sysOrgId"></param>
  2915. /// <returns></returns>
  2916. private async Task<DataTable> GetOrgLineTotalTable(int nceePlanId, short sysOrgId)
  2917. {
  2918. var dt = await _rep.SqlQueryAsync(@"
  2919. SELECT T2.short_name AS sys_org_name,
  2920. T1.*,
  2921. T3.line_count AS line_count_100,
  2922. T3.total_count AS total_count_100,
  2923. T3.line_rate AS line_rate_100
  2924. FROM
  2925. (
  2926. SELECT T1.type,
  2927. T1.sys_org_id,
  2928. T1.direction_course_id,
  2929. T1.ncee_course_comb_id,
  2930. T1.class_number,
  2931. T1.ncee_line_level,
  2932. MAX(IF(T1.course_id = 1, T1.total_count, NULL)) AS total_count_1,
  2933. MAX(IF(T1.course_id = 2, T1.total_count, NULL)) AS total_count_2,
  2934. MAX(IF(T1.course_id = 3, T1.total_count, NULL)) AS total_count_3,
  2935. MAX(IF(T1.course_id = 4, T1.total_count, NULL)) AS total_count_4,
  2936. MAX(IF(T1.course_id = 8, T1.total_count, NULL)) AS total_count_8,
  2937. MAX(IF(T1.course_id = 101, T1.total_count, NULL)) AS total_count_101,
  2938. MAX(IF(T1.course_id = 1, T1.line_count, NULL)) AS line_count_1,
  2939. MAX(IF(T1.course_id = 2, T1.line_count, NULL)) AS line_count_2,
  2940. MAX(IF(T1.course_id = 3, T1.line_count, NULL)) AS line_count_3,
  2941. MAX(IF(T1.course_id = 4, T1.line_count, NULL)) AS line_count_4,
  2942. MAX(IF(T1.course_id = 8, T1.line_count, NULL)) AS line_count_8,
  2943. MAX(IF(T1.course_id = 101, T1.line_count, NULL)) AS line_count_101,
  2944. MAX(IF(T1.course_id = 1, T1.line_rate, NULL)) AS line_rate_1,
  2945. MAX(IF(T1.course_id = 2, T1.line_rate, NULL)) AS line_rate_2,
  2946. MAX(IF(T1.course_id = 3, T1.line_rate, NULL)) AS line_rate_3,
  2947. MAX(IF(T1.course_id = 4, T1.line_rate, NULL)) AS line_rate_4,
  2948. MAX(IF(T1.course_id = 8, T1.line_rate, NULL)) AS line_rate_8,
  2949. MAX(IF(T1.course_id = 101, T1.line_rate, NULL)) AS line_rate_101
  2950. FROM ncee_line_course AS T1
  2951. WHERE T1.ncee_plan_id = @nceePlanId AND T1.sys_org_id = @sysOrgId AND T1.type < 4 AND T1.is_double_line = 0
  2952. GROUP BY T1.type, T1.direction_course_id, T1.sys_org_id, T1.ncee_line_level, T1.ncee_course_comb_id, T1.class_number
  2953. ) AS T1
  2954. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  2955. LEFT JOIN
  2956. (
  2957. SELECT sys_org_id, type, ncee_line_level, direction_course_id, ncee_course_comb_id, class_number,line_count, total_count, line_rate
  2958. FROM ncee_line_total AS T1
  2959. WHERE T1.ncee_plan_id = @nceePlanId AND T1.sys_org_id = @sysOrgId AND T1.type < 4
  2960. ) AS T3
  2961. ON T1.type = T3.type AND T1.sys_org_id = T3.sys_org_id AND
  2962. T1.ncee_line_level = T3.ncee_line_level AND
  2963. T1.direction_course_id = T3.direction_course_id AND
  2964. IFNULL(T1.ncee_course_comb_id, 0) = IFNULL(T3.ncee_course_comb_id, 0) AND
  2965. IFNULL(T1.class_number, 0) = IFNULL(T3.class_number, 0)
  2966. ORDER BY T1.ncee_line_level, T1.direction_course_id, T1.type, T1.ncee_course_comb_id
  2967. ", new { NceePlanId = nceePlanId, SysOrgId = sysOrgId });
  2968. return dt;
  2969. }
  2970. /// <summary>
  2971. /// 获取机构组合班级有效分上线(总分上线,不含单科)
  2972. /// </summary>
  2973. /// <param name="nceePlanId"></param>
  2974. /// <param name="sysOrgId">0表示全部</param>
  2975. /// <returns></returns>
  2976. private async Task<DataTable> GetOrgLineTotalTable2(int nceePlanId, short sysOrgId = 0)
  2977. {
  2978. var dt = await _rep.SqlQueryAsync(@"
  2979. SELECT *
  2980. FROM
  2981. (
  2982. SELECT T1.*, IFNULL(T1.total_count_1, IFNULL(T1.total_count_2, T1.total_count_3)) AS total_count
  2983. FROM
  2984. (
  2985. SELECT
  2986. T1.direction_course_id,
  2987. T1.type,
  2988. T1.sys_org_id,
  2989. T3.short_name AS sys_org_name,
  2990. T1.ncee_course_comb_id,
  2991. T2.short_name AS ncee_course_comb_name,
  2992. T1.class_number,
  2993. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_count ELSE NULL END) AS line_count_1,
  2994. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_rate ELSE NULL END) AS line_rate_1,
  2995. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.total_count ELSE NULL END) AS total_count_1,
  2996. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_count ELSE NULL END) AS line_count_2,
  2997. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_rate ELSE NULL END) AS line_rate_2,
  2998. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.total_count ELSE NULL END) AS total_count_2,
  2999. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_count ELSE NULL END) AS line_count_3,
  3000. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_rate ELSE NULL END) AS line_rate_3,
  3001. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.total_count ELSE NULL END) AS total_count_3
  3002. FROM ncee_line_total AS T1
  3003. LEFT JOIN ncee_course_comb AS T2 ON T1.ncee_course_comb_id = T2.id
  3004. LEFT JOIN sys_org AS T3 ON T1.sys_org_id = T3.id
  3005. WHERE T1.ncee_plan_id = @nceePlanId AND T1.type < 4 AND (T1.sys_org_id = @sysOrgId OR @sysOrgId = 0)
  3006. GROUP BY T1.direction_course_id, T1.type, T1.sys_org_id, T3.short_name, T1.ncee_course_comb_id, T2.short_name, T1.class_number
  3007. ) AS T1
  3008. UNION ALL
  3009. SELECT
  3010. T1.direction_course_id,
  3011. CAST(3 AS SIGNED) AS type,
  3012. T1.sys_org_id,
  3013. T4.short_name AS sys_org_name,
  3014. T1.ncee_course_comb_id,
  3015. T3.short_name AS ncee_course_comb_name,
  3016. T1.class_number,
  3017. NULL AS line_count_1,
  3018. NULL AS line_rate_1,
  3019. NULL AS total_count_1,
  3020. NULL AS line_count_2,
  3021. NULL AS line_rate_2,
  3022. NULL AS total_count_2,
  3023. NULL AS line_count_3,
  3024. NULL AS line_rate_3,
  3025. NULL AS total_count_3,
  3026. COUNT(1) AS total_count
  3027. FROM (SELECT * FROM ncee_student WHERE ncee_plan_id = @nceePlanId AND (sys_org_id = @sysOrgId OR @sysOrgId = 0)) AS T1
  3028. LEFT JOIN
  3029. (
  3030. SELECT DISTINCT T1.sys_org_id, T1.class_number, T1.ncee_course_comb_id
  3031. FROM ncee_line_total AS T1
  3032. WHERE T1.ncee_plan_id = @nceePlanId AND T1.type = 3 AND (T1.sys_org_id = @sysOrgId OR @sysOrgId = 0)
  3033. ) AS T2 ON T1.sys_org_id = T2.sys_org_id AND T1.class_number = T2.class_number AND T1.ncee_course_comb_id = T2.ncee_course_comb_id
  3034. LEFT JOIN ncee_course_comb AS T3 ON T1.ncee_course_comb_id = T3.id
  3035. LEFT JOIN sys_org AS T4 ON T1.sys_org_id = T4.id
  3036. WHERE T2.class_number IS NULL AND T1.score_x > 0
  3037. GROUP BY T1.direction_course_id, T1.sys_org_id, T4.short_name, T1.ncee_course_comb_id, T3.short_name, T1.class_number
  3038. UNION ALL
  3039. SELECT
  3040. T1.direction_course_id,
  3041. CAST(2 AS SIGNED) AS type,
  3042. T1.sys_org_id,
  3043. T4.short_name AS sys_org_name,
  3044. T1.ncee_course_comb_id,
  3045. T3.short_name AS ncee_course_comb_name,
  3046. NULL AS class_number,
  3047. NULL AS line_count_1,
  3048. NULL AS line_rate_1,
  3049. NULL AS total_count_1,
  3050. NULL AS line_count_2,
  3051. NULL AS line_rate_2,
  3052. NULL AS total_count_2,
  3053. NULL AS line_count_3,
  3054. NULL AS line_rate_3,
  3055. NULL AS total_count_3,
  3056. COUNT(1) AS total_count
  3057. FROM (SELECT * FROM ncee_student WHERE ncee_plan_id = @nceePlanId AND (sys_org_id = @sysOrgId OR @sysOrgId = 0)) AS T1
  3058. LEFT JOIN
  3059. (
  3060. SELECT DISTINCT T1.sys_org_id, T1.ncee_course_comb_id
  3061. FROM ncee_line_total AS T1
  3062. WHERE T1.ncee_plan_id = @nceePlanId AND T1.type = 2 AND (T1.sys_org_id = @sysOrgId OR @sysOrgId = 0)
  3063. ) AS T2 ON T1.sys_org_id = T2.sys_org_id AND T1.ncee_course_comb_id = T2.ncee_course_comb_id
  3064. LEFT JOIN ncee_course_comb AS T3 ON T1.ncee_course_comb_id = T3.id
  3065. LEFT JOIN sys_org AS T4 ON T1.sys_org_id = T4.id
  3066. WHERE T2.ncee_course_comb_id IS NULL AND T1.score_x > 0
  3067. GROUP BY T1.direction_course_id, T1.sys_org_id, T4.short_name, T1.ncee_course_comb_id, T3.short_name
  3068. ) AS T1
  3069. ORDER BY T1.direction_course_id, T1.sys_org_id, T1.ncee_course_comb_id, T1.class_number
  3070. ;
  3071. ", new { NceePlanId = nceePlanId, SysOrgId = sysOrgId });
  3072. return dt;
  3073. }
  3074. /// <summary>
  3075. /// 获取机构组合班级有效分双上线数据
  3076. /// </summary>
  3077. /// <param name="nceePlanId"></param>
  3078. /// <param name="sysOrgId"></param>
  3079. /// <returns></returns>
  3080. private async Task<DataTable> GetOrgLineCourseTable(int nceePlanId, short sysOrgId)
  3081. {
  3082. var dt = await _rep.SqlQueryAsync(@"
  3083. SELECT T2.short_name AS sys_org_name, T1.*
  3084. FROM
  3085. (
  3086. SELECT T1.type,
  3087. T1.sys_org_id,
  3088. T1.direction_course_id,
  3089. T1.ncee_course_comb_id,
  3090. T1.class_number,
  3091. T1.ncee_line_level,
  3092. MAX(IF(T1.course_id = 1, T1.total_count, NULL)) AS total_count_1,
  3093. MAX(IF(T1.course_id = 2, T1.total_count, NULL)) AS total_count_2,
  3094. MAX(IF(T1.course_id = 3, T1.total_count, NULL)) AS total_count_3,
  3095. MAX(IF(T1.course_id = 4, T1.total_count, NULL)) AS total_count_4,
  3096. MAX(IF(T1.course_id = 101, T1.total_count, NULL)) AS total_count_101,
  3097. MAX(IF(T1.course_id = 1, T1.line_count, NULL)) AS line_count_1,
  3098. MAX(IF(T1.course_id = 2, T1.line_count, NULL)) AS line_count_2,
  3099. MAX(IF(T1.course_id = 3, T1.line_count, NULL)) AS line_count_3,
  3100. MAX(IF(T1.course_id = 4, T1.line_count, NULL)) AS line_count_4,
  3101. MAX(IF(T1.course_id = 101, T1.line_count, NULL)) AS line_count_101,
  3102. MAX(IF(T1.course_id = 1, T1.line_rate, NULL)) AS line_rate_1,
  3103. MAX(IF(T1.course_id = 2, T1.line_rate, NULL)) AS line_rate_2,
  3104. MAX(IF(T1.course_id = 3, T1.line_rate, NULL)) AS line_rate_3,
  3105. MAX(IF(T1.course_id = 4, T1.line_rate, NULL)) AS line_rate_4,
  3106. MAX(IF(T1.course_id = 101, T1.line_rate, NULL)) AS line_rate_101
  3107. FROM ncee_line_course AS T1
  3108. WHERE T1.ncee_plan_id = @nceePlanId AND T1.sys_org_id = @sysOrgId AND T1.type < 4 AND T1.is_double_line = 1
  3109. GROUP BY T1.type, T1.direction_course_id, T1.sys_org_id, T1.ncee_line_level, T1.ncee_course_comb_id, T1.class_number
  3110. ) AS T1
  3111. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  3112. ORDER BY T1.ncee_line_level, T1.direction_course_id, T1.type, T1.sys_org_id
  3113. ", new { NceePlanId = nceePlanId, SysOrgId = sysOrgId });
  3114. return dt;
  3115. }
  3116. /// <summary>
  3117. /// 获取机构组合班级有效分双上线数据(科目未转置)
  3118. /// </summary>
  3119. /// <param name="nceePlanId"></param>
  3120. /// <param name="sysOrgId">0表示全部</param>
  3121. /// <returns></returns>
  3122. private async Task<DataTable> GetOrgLineCourseTable2(int nceePlanId, short sysOrgId = 0)
  3123. {
  3124. var dt = await _rep.SqlQueryAsync(@"
  3125. SELECT T1.*, IFNULL(T1.total_count_1, IFNULL(T1.total_count_2, T1.total_count_3)) AS total_count
  3126. FROM
  3127. (
  3128. SELECT
  3129. T1.direction_course_id,
  3130. T1.course_id,
  3131. T1.type,
  3132. T1.sys_org_id,
  3133. T3.short_name AS sys_org_name,
  3134. T1.ncee_course_comb_id,
  3135. T2.short_name AS ncee_course_comb_name,
  3136. T1.class_number,
  3137. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_count ELSE NULL END) AS line_count_1,
  3138. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_rate ELSE NULL END) AS line_rate_1,
  3139. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.total_count ELSE NULL END) AS total_count_1,
  3140. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_count ELSE NULL END) AS line_count_2,
  3141. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_rate ELSE NULL END) AS line_rate_2,
  3142. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.total_count ELSE NULL END) AS total_count_2,
  3143. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_count ELSE NULL END) AS line_count_3,
  3144. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_rate ELSE NULL END) AS line_rate_3,
  3145. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.total_count ELSE NULL END) AS total_count_3
  3146. FROM ncee_line_course AS T1
  3147. LEFT JOIN ncee_course_comb AS T2 ON T1.ncee_course_comb_id = T2.id
  3148. LEFT JOIN sys_org AS T3 ON T1.sys_org_id = T3.id
  3149. WHERE T1.ncee_plan_id = @nceePlanId AND T1.type < 4 AND T1.is_double_line = 1 AND (T1.sys_org_id = @sysOrgId OR @sysOrgId = 0)
  3150. GROUP BY T1.direction_course_id, T1.course_id, T1.type, T1.sys_org_id, T3.short_name, T1.ncee_course_comb_id, T2.short_name, T1.class_number
  3151. ) AS T1
  3152. ORDER BY T1.direction_course_id, T1.course_id, T1.sys_org_id, T1.ncee_course_comb_id, T1.class_number
  3153. ", new { NceePlanId = nceePlanId, SysOrgId = sysOrgId });
  3154. return dt;
  3155. }
  3156. /// <summary>
  3157. /// 获取总分分数段统计表
  3158. /// </summary>
  3159. /// <param name="nceePlanId"></param>
  3160. /// <param name="directionCourseId"></param>
  3161. /// <param name="orgList"></param>
  3162. /// <returns></returns>
  3163. private async Task<DataTable> GetTotalScoreRangeTable(int nceePlanId, short directionCourseId, List<SysOrgOutput> orgList)
  3164. {
  3165. var orgSumSelects = orgList.Select(t => @$"
  3166. SUM(CASE WHEN T2.sys_org_id = {t.Id} THEN T2.total_count ELSE 0 END) AS total_count_{t.Id}");
  3167. var orgSum = string.Join(",", orgSumSelects);
  3168. var dt = await _rep.SqlQueryAsync(@$"
  3169. SELECT T1.id AS exam_score_range_id, T1.`name` AS exam_score_range_name,{orgSum},
  3170. SUM(CASE WHEN T2.sys_org_id = 9998 THEN T2.total_count ELSE 0 END) AS total_count_range_current,
  3171. SUM(CASE WHEN T2.sys_org_id = 9999 THEN T2.total_count ELSE 0 END) AS total_count_range_sum
  3172. FROM exam_score_range AS T1
  3173. LEFT JOIN
  3174. (
  3175. -- 全部分段统计
  3176. SELECT 9998 AS sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3177. FROM
  3178. (
  3179. SELECT get_exam_score_range_id_s(1, 10, 200, 750, T1.score_x) AS exam_score_range_id
  3180. FROM ncee_student AS T1
  3181. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3182. ) AS T1
  3183. GROUP BY T1.exam_score_range_id
  3184. UNION ALL
  3185. -- 全部分段累计
  3186. SELECT 9999 AS sys_org_id, T1.exam_score_range_id,
  3187. SUM(T1.total_count) OVER (ORDER BY T1.sequence ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS total_count
  3188. FROM
  3189. (
  3190. SELECT T1.*, T2.sequence
  3191. FROM
  3192. (
  3193. SELECT T1.exam_score_range_id, SUM(T1.count) AS total_count
  3194. FROM
  3195. (
  3196. SELECT get_exam_score_range_id_s(1, 10, 200, 750, T1.score_x) AS exam_score_range_id, 1 AS count
  3197. FROM ncee_student AS T1
  3198. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3199. UNION ALL
  3200. SELECT id, 0 FROM exam_score_range WHERE type = 1
  3201. ) AS T1
  3202. GROUP BY T1.exam_score_range_id
  3203. ) AS T1
  3204. LEFT JOIN exam_score_range AS T2 ON T1.exam_score_range_id = T2.id
  3205. ) AS T1
  3206. GROUP BY T1.exam_score_range_id
  3207. UNION ALL
  3208. -- 机构分段统计
  3209. SELECT T1.sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3210. FROM
  3211. (
  3212. SELECT T1.sys_org_id, get_exam_score_range_id_s(1, 10, 200, 750, T1.score_x) AS exam_score_range_id
  3213. FROM ncee_student AS T1
  3214. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3215. ) AS T1
  3216. GROUP BY T1.sys_org_id, T1.exam_score_range_id
  3217. ) AS T2 ON T1.id = T2.exam_score_range_id
  3218. WHERE T1.type = 1
  3219. GROUP BY T1.id, T1.`name`
  3220. ORDER BY T1.sequence
  3221. ", new { NceePlanId = nceePlanId, DirectionCourseId = directionCourseId });
  3222. return dt;
  3223. }
  3224. /// <summary>
  3225. /// 获取总分分数段统计表(未选科)
  3226. /// </summary>
  3227. /// <param name="nceePlanId"></param>
  3228. /// <param name="orgList"></param>
  3229. /// <returns></returns>
  3230. private async Task<DataTable> GetTotalScoreRangeTableUnselected(int nceePlanId, List<SysOrgOutput> orgList)
  3231. {
  3232. var orgSumSelects = orgList.Select(t => @$"
  3233. SUM(CASE WHEN T2.sys_org_id = {t.Id} THEN T2.total_count ELSE 0 END) AS total_count_{t.Id}");
  3234. var orgSum = string.Join(",", orgSumSelects);
  3235. var dt = await _rep.SqlQueryAsync(@$"
  3236. SELECT T1.id AS exam_score_range_id, T1.`name` AS exam_score_range_name,{orgSum},
  3237. SUM(CASE WHEN T2.sys_org_id = 9998 THEN T2.total_count ELSE 0 END) AS total_count_range_current,
  3238. SUM(CASE WHEN T2.sys_org_id = 9999 THEN T2.total_count ELSE 0 END) AS total_count_range_sum
  3239. FROM exam_score_range AS T1
  3240. LEFT JOIN
  3241. (
  3242. -- 全部分段统计
  3243. SELECT 9998 AS sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3244. FROM
  3245. (
  3246. SELECT get_exam_score_range_id_s(4, 10, 240, 900, T1.score_x) AS exam_score_range_id
  3247. FROM ncee_student AS T1
  3248. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3249. ) AS T1
  3250. GROUP BY T1.exam_score_range_id
  3251. UNION ALL
  3252. -- 全部分段累计
  3253. SELECT 9999 AS sys_org_id, T1.exam_score_range_id,
  3254. SUM(T1.total_count) OVER (ORDER BY T1.sequence ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS total_count
  3255. FROM
  3256. (
  3257. SELECT T1.*, T2.sequence
  3258. FROM
  3259. (
  3260. SELECT T1.exam_score_range_id, SUM(T1.count) AS total_count
  3261. FROM
  3262. (
  3263. SELECT get_exam_score_range_id_s(4, 10, 240, 900, T1.score_x) AS exam_score_range_id, 1 AS count
  3264. FROM ncee_student AS T1
  3265. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3266. UNION ALL
  3267. SELECT id, 0 FROM exam_score_range WHERE type = 4
  3268. ) AS T1
  3269. GROUP BY T1.exam_score_range_id
  3270. ) AS T1
  3271. LEFT JOIN exam_score_range AS T2 ON T1.exam_score_range_id = T2.id
  3272. ) AS T1
  3273. GROUP BY T1.exam_score_range_id
  3274. UNION ALL
  3275. -- 机构分段统计
  3276. SELECT T1.sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3277. FROM
  3278. (
  3279. SELECT T1.sys_org_id, get_exam_score_range_id_s(4, 10, 240, 900, T1.score_x) AS exam_score_range_id
  3280. FROM ncee_student AS T1
  3281. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3282. ) AS T1
  3283. GROUP BY T1.sys_org_id, T1.exam_score_range_id
  3284. ) AS T2 ON T1.id = T2.exam_score_range_id
  3285. WHERE T1.type = 4
  3286. GROUP BY T1.id, T1.`name`
  3287. ORDER BY T1.sequence
  3288. ", new { NceePlanId = nceePlanId, DirectionCourseId = 99 });
  3289. return dt;
  3290. }
  3291. /// <summary>
  3292. /// 获取单科分数段统计表
  3293. /// </summary>
  3294. /// <param name="nceePlanId"></param>
  3295. /// <param name="directionCourseId"></param>
  3296. /// <param name="courseId"></param>
  3297. /// <param name="orgList"></param>
  3298. /// <returns></returns>
  3299. private async Task<DataTable> GetCourseScoreRangeTable(int nceePlanId, short directionCourseId, short courseId, List<SysOrgOutput> orgList)
  3300. {
  3301. int type = 3; // 总分100分
  3302. int rangeScore = 5;
  3303. int highScore = 100;
  3304. if (courseId == 1 || courseId == 2 || courseId == 3)
  3305. {
  3306. type = 2; // 总分150分
  3307. highScore = 150;
  3308. }
  3309. var orgSumSelects = orgList.Select(t => @$"
  3310. SUM(CASE WHEN T2.sys_org_id = {t.Id} THEN T2.total_count ELSE 0 END) AS total_count_{t.Id}");
  3311. var orgSum = string.Join(",", orgSumSelects);
  3312. var dt = await _rep.SqlQueryAsync($@"
  3313. SELECT T1.id AS exam_score_range_id, T1.`name` AS exam_score_range_name,{orgSum},
  3314. SUM(CASE WHEN T2.sys_org_id = 9998 THEN T2.total_count ELSE 0 END) AS total_count_range_current,
  3315. SUM(CASE WHEN T2.sys_org_id = 9999 THEN T2.total_count ELSE 0 END) AS total_count_range_sum
  3316. FROM exam_score_range AS T1
  3317. LEFT JOIN
  3318. (
  3319. -- 全部分段统计
  3320. SELECT 9998 AS sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3321. FROM
  3322. (
  3323. SELECT get_exam_score_range_id_s(@type, @rangeScore, @rangeScore, @highScore, T2.score_x) AS exam_score_range_id
  3324. FROM ncee_student AS T1
  3325. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  3326. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId AND T2.course_id = @courseId
  3327. ) AS T1
  3328. GROUP BY T1.exam_score_range_id
  3329. UNION ALL
  3330. -- 全部分段累计
  3331. SELECT 9999 AS sys_org_id, T1.exam_score_range_id,
  3332. SUM(T1.total_count) OVER (ORDER BY T1.sequence ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS total_count
  3333. FROM
  3334. (
  3335. SELECT T1.*, T2.sequence
  3336. FROM
  3337. (
  3338. SELECT T1.exam_score_range_id, SUM(T1.count) AS total_count
  3339. FROM
  3340. (
  3341. SELECT get_exam_score_range_id_s(@type, @rangeScore, @rangeScore, @highScore, T2.score_x) AS exam_score_range_id, 1 AS count
  3342. FROM ncee_student AS T1
  3343. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  3344. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId AND T2.course_id = @courseId
  3345. UNION ALL
  3346. SELECT id, 0 FROM exam_score_range WHERE type = @type
  3347. ) AS T1
  3348. GROUP BY T1.exam_score_range_id
  3349. ) AS T1
  3350. LEFT JOIN exam_score_range AS T2 ON T1.exam_score_range_id = T2.id
  3351. ) AS T1
  3352. GROUP BY T1.exam_score_range_id
  3353. UNION ALL
  3354. -- 机构分段统计
  3355. SELECT T1.sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3356. FROM
  3357. (
  3358. SELECT T1.sys_org_id, get_exam_score_range_id_s(@type, @rangeScore, @rangeScore, @highScore, T2.score_x) AS exam_score_range_id
  3359. FROM ncee_student AS T1
  3360. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  3361. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId AND T2.course_id = @courseId
  3362. ) AS T1
  3363. GROUP BY T1.sys_org_id, T1.exam_score_range_id
  3364. ) AS T2 ON T1.id = T2.exam_score_range_id
  3365. WHERE T1.type = @type
  3366. GROUP BY T1.id, T1.`name`
  3367. ORDER BY T1.sequence
  3368. ", new { NceePlanId = nceePlanId, DirectionCourseId = directionCourseId, CourseId = courseId, Type = type, RangeScore = rangeScore, HighScore = highScore });
  3369. return dt;
  3370. }
  3371. /// <summary>
  3372. /// 获取单科分数段统计表(未选科)
  3373. /// </summary>
  3374. /// <param name="nceePlanId"></param>
  3375. /// <param name="courseId"></param>
  3376. /// <param name="orgList"></param>
  3377. /// <returns></returns>
  3378. private async Task<DataTable> GetCourseScoreRangeTableUnselected(int nceePlanId, short courseId, List<SysOrgOutput> orgList)
  3379. {
  3380. return await GetCourseScoreRangeTable(nceePlanId, 99, courseId, orgList);
  3381. }
  3382. /// <summary>
  3383. /// 获取各科原始分转换区间表
  3384. /// </summary>
  3385. /// <param name="nceePlanId"></param>
  3386. /// <returns></returns>
  3387. private async Task<DataTable> GetConvertRangeTable(int nceePlanId)
  3388. {
  3389. var dt = await _rep.SqlQueryAsync(@"
  3390. SELECT T2.`name` AS course_name, T1.*
  3391. FROM
  3392. (
  3393. SELECT course_id,
  3394. MAX(IF(ncee_convert_grade_id = 1, min_score, NULL)) AS min_score_a,
  3395. MAX(IF(ncee_convert_grade_id = 1, max_score, NULL)) AS max_score_a,
  3396. MAX(IF(ncee_convert_grade_id = 2, min_score, NULL)) AS min_score_b,
  3397. MAX(IF(ncee_convert_grade_id = 2, max_score, NULL)) AS max_score_b,
  3398. MAX(IF(ncee_convert_grade_id = 3, min_score, NULL)) AS min_score_c,
  3399. MAX(IF(ncee_convert_grade_id = 3, max_score, NULL)) AS max_score_c,
  3400. MAX(IF(ncee_convert_grade_id = 4, min_score, NULL)) AS min_score_d,
  3401. MAX(IF(ncee_convert_grade_id = 4, max_score, NULL)) AS max_score_d,
  3402. MAX(IF(ncee_convert_grade_id = 5, min_score, NULL)) AS min_score_e,
  3403. MAX(IF(ncee_convert_grade_id = 5, max_score, NULL)) AS max_score_e
  3404. FROM ncee_convert_range
  3405. WHERE ncee_plan_id = @nceePlanId
  3406. GROUP BY course_id
  3407. ) AS T1
  3408. JOIN base_course AS T2 ON T1.course_id = T2.id
  3409. ", new { NceePlanId = nceePlanId });
  3410. return dt;
  3411. }
  3412. /// <summary>
  3413. /// 获取转换分明细表
  3414. /// </summary>
  3415. /// <param name="nceePlanId"></param>
  3416. /// <param name="directionCourseId"></param>
  3417. /// <param name="sysOrgId"></param>
  3418. /// <returns></returns>
  3419. private async Task<DataTable> GetConvertScoreTable(int nceePlanId, short directionCourseId, short sysOrgId)
  3420. {
  3421. var dt = await _rep.SqlQueryAsync(@"
  3422. SELECT
  3423. T2.`name` AS sys_org_name,
  3424. T2.short_name AS sys_org_short_name,
  3425. T3.`name` AS direction_course_name,
  3426. T4.short_name AS ncee_course_comb_short_name,
  3427. T1.*,
  3428. IFNULL(T1.score_5, 0) + IFNULL(T1.score_6, 0) + IFNULL(T1.score_7, 0) + IFNULL(T1.score_9, 0) AS comb_score,
  3429. IFNULL(T1.score_x_5, 0) + IFNULL(T1.score_x_6, 0) + IFNULL(T1.score_x_7, 0) + IFNULL(T1.score_x_9, 0) AS comb_score_x
  3430. FROM
  3431. (
  3432. SELECT
  3433. T1.sys_org_id,
  3434. T1.direction_course_id,
  3435. T1.ncee_course_comb_id,
  3436. T1.class_number,
  3437. T1.id,
  3438. T1.exam_number,
  3439. T1.`name`,
  3440. MAX(T1.score) AS score,
  3441. MAX(T1.score_x) AS score_x,
  3442. MAX(T1.order_in_total) AS order_in_total,
  3443. MAX(T1.order_in_total_x) AS order_in_total_x,
  3444. MAX(T1.order_in_org) AS order_in_org,
  3445. MAX(T1.order_in_org_x) AS order_in_org_x,
  3446. MAX(CASE WHEN T2.course_id = 1 THEN T2.score ELSE NULL END) AS score_1,
  3447. MAX(CASE WHEN T2.course_id = 2 THEN T2.score ELSE NULL END) AS score_2,
  3448. MAX(CASE WHEN T2.course_id = 3 THEN T2.score ELSE NULL END) AS score_3,
  3449. MAX(CASE WHEN T2.course_id = 4 THEN T2.score ELSE NULL END) AS score_4,
  3450. MAX(CASE WHEN T2.course_id = 5 THEN T2.score ELSE NULL END) AS score_5,
  3451. MAX(CASE WHEN T2.course_id = 6 THEN T2.score ELSE NULL END) AS score_6,
  3452. MAX(CASE WHEN T2.course_id = 7 THEN T2.score ELSE NULL END) AS score_7,
  3453. MAX(CASE WHEN T2.course_id = 8 THEN T2.score ELSE NULL END) AS score_8,
  3454. MAX(CASE WHEN T2.course_id = 9 THEN T2.score ELSE NULL END) AS score_9,
  3455. MAX(CASE WHEN T2.course_id = 5 THEN T2.score_x ELSE NULL END) AS score_x_5,
  3456. MAX(CASE WHEN T2.course_id = 6 THEN T2.score_x ELSE NULL END) AS score_x_6,
  3457. MAX(CASE WHEN T2.course_id = 7 THEN T2.score_x ELSE NULL END) AS score_x_7,
  3458. MAX(CASE WHEN T2.course_id = 9 THEN T2.score_x ELSE NULL END) AS score_x_9,
  3459. MAX(CASE WHEN T2.course_id = 5 THEN T2.ncee_convert_grade_name ELSE '' END) AS ncee_convert_grade_name_5,
  3460. MAX(CASE WHEN T2.course_id = 6 THEN T2.ncee_convert_grade_name ELSE '' END) AS ncee_convert_grade_name_6,
  3461. MAX(CASE WHEN T2.course_id = 7 THEN T2.ncee_convert_grade_name ELSE '' END) AS ncee_convert_grade_name_7,
  3462. MAX(CASE WHEN T2.course_id = 9 THEN T2.ncee_convert_grade_name ELSE '' END) AS ncee_convert_grade_name_9
  3463. FROM ncee_student AS T1
  3464. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  3465. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId AND (T1.sys_org_id = @sysOrgId OR @sysOrgId = 0)
  3466. GROUP BY T1.sys_org_id, T1.direction_course_id, T1.ncee_course_comb_id, T1.class_number, T1.id, T1.exam_number, T1.`name`
  3467. ) AS T1
  3468. JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  3469. LEFT JOIN base_course AS T3 ON T1.direction_course_id = T3.id
  3470. LEFT JOIN ncee_course_comb AS T4 ON T1.ncee_course_comb_id = T4.id
  3471. ORDER BY T1.direction_course_id, T1.score_x DESC
  3472. ", new { NceePlanId = nceePlanId, DirectionCourseId = directionCourseId, SysOrgId = sysOrgId });
  3473. return dt;
  3474. }
  3475. /// <summary>
  3476. /// 获取参与划线机构列表
  3477. /// </summary>
  3478. /// <param name="nceePlanId"></param>
  3479. /// <returns></returns>
  3480. private async Task<List<SysOrgOutput>> GetSysOrgList(int nceePlanId)
  3481. {
  3482. var ret = await _rep.Change<NceeStudent>().DetachedEntities.Where(t => t.NceePlanId == nceePlanId && t.Score > 0)
  3483. .Select(t => t.SysOrg).Distinct()
  3484. .OrderBy(t => t.Id)
  3485. .ProjectToType<SysOrgOutput>().ToListAsync();
  3486. return ret;
  3487. }
  3488. /// <summary>
  3489. /// 获取划线依据
  3490. /// </summary>
  3491. /// <param name="nceePlanId"></param>
  3492. /// <returns></returns>
  3493. private async Task<DataTable> GetBaseLineTable(int nceePlanId)
  3494. {
  3495. var dt = await _rep.SqlQueryAsync(@"
  3496. SELECT T1.ncee_line_level, T2.`name` AS ncee_line_level_name, T1.direction_course_id, T1.line_rate, T1.line_score, T1.line_score_x
  3497. FROM ncee_base_line AS T1
  3498. JOIN (SELECT * FROM sys_dict_data WHERE sys_dict_type_id = 211) AS T2 ON T1.ncee_line_level = T2.`value`
  3499. WHERE T1.ncee_plan_id = @nceePlanId
  3500. ", new { NceePlanId = nceePlanId });
  3501. return dt;
  3502. }
  3503. #endregion
  3504. #region 静态方法
  3505. /// <summary>
  3506. /// 获取等级合并名
  3507. /// </summary>
  3508. /// <param name="gradeNames"></param>
  3509. /// <returns></returns>
  3510. private static string GetMergeGradeName(List<string> gradeNames)
  3511. {
  3512. if (gradeNames == null)
  3513. {
  3514. return "";
  3515. }
  3516. var gns = gradeNames.Where(t => !string.IsNullOrEmpty(t) && !string.IsNullOrWhiteSpace(t)).OrderBy(t => t).ToList();
  3517. Dictionary<string, int> cs = [];
  3518. for (int i = 0; i < gns.Count; i++)
  3519. {
  3520. var g = gns[i];
  3521. if (cs.TryGetValue(g, out int value))
  3522. {
  3523. cs[g] = ++value;
  3524. }
  3525. else
  3526. {
  3527. cs.Add(g, 1);
  3528. }
  3529. }
  3530. string cgn = "";
  3531. foreach (var c in cs)
  3532. {
  3533. cgn = $"{cgn}{c.Value}[{c.Key}]";
  3534. }
  3535. return cgn;
  3536. }
  3537. ///// <summary>
  3538. ///// 导出柱状图
  3539. ///// </summary>
  3540. ///// <param name="sheet"></param>
  3541. ///// <param name="drawing"></param>
  3542. ///// <param name="anchor"></param>
  3543. ///// <param name="startDataRow"></param>
  3544. ///// <param name="endDataRow"></param>
  3545. ///// <param name="columnIndex"></param>
  3546. ///// <param name="title"></param>
  3547. ///// <param name="serieTitle"></param>
  3548. ///// <param name="catalogTitle"></param>
  3549. ///// <param name="valueTile"></param>
  3550. //private static void CreateBarChart(ISheet sheet, IDrawing drawing, IClientAnchor anchor, int startDataRow, int endDataRow, int columnIndex, string title = null, string serieTitle = null, string catalogTitle = null, string valueTile = null)
  3551. //{
  3552. // XSSFChart chart = (XSSFChart)drawing.CreateChart(anchor);
  3553. // if (!string.IsNullOrEmpty(title))
  3554. // {
  3555. // chart.SetTitle(title);
  3556. // chart.GetCTChart().title.tx.rich.p[0].pPr = new NPOI.OpenXmlFormats.Dml.CT_TextParagraphProperties
  3557. // {
  3558. // defRPr = new NPOI.OpenXmlFormats.Dml.CT_TextCharacterProperties() { sz = 1400 }
  3559. // };
  3560. // }
  3561. // IBarChartData<string, double> barChartData = chart.ChartDataFactory.CreateBarChartData<string, double>();
  3562. // IChartLegend legend = chart.GetOrCreateLegend();
  3563. // legend.Position = LegendPosition.TopRight;
  3564. // legend.IsOverlay = true;
  3565. // IChartAxis bottomAxis = chart.ChartAxisFactory.CreateCategoryAxis(AxisPosition.Bottom);
  3566. // bottomAxis.MajorTickMark = AxisTickMark.None;
  3567. // IValueAxis leftAxis = chart.ChartAxisFactory.CreateValueAxis(AxisPosition.Left);
  3568. // leftAxis.Crosses = AxisCrosses.AutoZero;
  3569. // leftAxis.SetCrossBetween(AxisCrossBetween.Between);
  3570. // IChartDataSource<string> categoryAxis = DataSources.FromStringCellRange(sheet, new CellRangeAddress(startDataRow, endDataRow, 0, 0));
  3571. // IChartDataSource<double> valueAxis = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(startDataRow, endDataRow, columnIndex, columnIndex));
  3572. // var serie = barChartData.AddSeries(categoryAxis, valueAxis);
  3573. // if (!string.IsNullOrEmpty(serieTitle))
  3574. // {
  3575. // serie.SetTitle(serieTitle);
  3576. // }
  3577. // chart.Plot(barChartData, bottomAxis, leftAxis);
  3578. // var plotArea = chart.GetCTChart().plotArea;
  3579. // plotArea.catAx[0].txPr = new CT_TextBody();
  3580. // plotArea.catAx[0].txPr.AddNewP().pPr = new NPOI.OpenXmlFormats.Dml.CT_TextParagraphProperties()
  3581. // {
  3582. // defRPr = new NPOI.OpenXmlFormats.Dml.CT_TextCharacterProperties() { sz = 900 }
  3583. // };
  3584. // plotArea.catAx[0].majorTickMark = new CT_TickMark() { val = ST_TickMark.@out };
  3585. // plotArea.valAx[0].txPr = new CT_TextBody();
  3586. // plotArea.valAx[0].txPr.AddNewP().pPr = new NPOI.OpenXmlFormats.Dml.CT_TextParagraphProperties()
  3587. // {
  3588. // defRPr = new NPOI.OpenXmlFormats.Dml.CT_TextCharacterProperties() { sz = 900 }
  3589. // };
  3590. // plotArea.valAx[0].majorTickMark = new CT_TickMark() { val = ST_TickMark.@out };
  3591. // var barChart = plotArea.barChart.First();
  3592. // barChart.barDir = new CT_BarDir { val = ST_BarDir.col };
  3593. // if (!string.IsNullOrEmpty(catalogTitle))
  3594. // {
  3595. // var aTitle = new CT_Title
  3596. // {
  3597. // tx = new CT_Tx()
  3598. // };
  3599. // aTitle.tx.rich = new CT_TextBody();
  3600. // aTitle.tx.rich.AddNewP().AddNewR().t = catalogTitle;
  3601. // plotArea.valAx[0].title = aTitle;
  3602. // }
  3603. // if (!string.IsNullOrEmpty(valueTile))
  3604. // {
  3605. // var aTitle = new CT_Title
  3606. // {
  3607. // tx = new CT_Tx()
  3608. // };
  3609. // aTitle.tx.rich = new CT_TextBody();
  3610. // aTitle.tx.rich.AddNewP().AddNewR().t = valueTile;
  3611. // plotArea.catAx[0].title = aTitle;
  3612. // }
  3613. //}
  3614. #endregion
  3615. }