using OfficeOpenXml.Drawing; using OfficeOpenXml; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using LicenseContext = OfficeOpenXml.LicenseContext; using System.Reflection; using System.Xml.Linq; using OfficeOpenXml.Style; using System.Data.Common; namespace UnvisableComponents { public partial class ExcelHead : Component { public ExcelHead() { InitializeComponent(); } public ExcelHead(IContainer container) { container.Add(this); InitializeComponent(); } public void Load(ExcelInfo info) where T:class { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Check(info); List fields = new List(); using (ExcelPackage excelPackage = new ExcelPackage()) { excelPackage.Workbook.Properties.Author = "Qawithexperts"; excelPackage.Workbook.Properties.Title = "test Excel"; excelPackage.Workbook.Properties.Subject = "Write in Excel"; excelPackage.Workbook.Properties.Created = DateTime.Now; ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add("Sheet 1"); worksheet.Cells["A1"].Value = info.Title; int posString = 2; int posColumn = 1; foreach(var step in info.Filds) { if(step.Value.Item1.Count == 1) { worksheet.Cells[posString, posColumn, posString, posColumn+1].Merge = true; worksheet.Cells[posString, posColumn].Value = step.Key; worksheet.Cells[posString, posColumn].Style.Fill.PatternType = ExcelFillStyle.Solid; worksheet.Cells[posString, posColumn].Style.Fill.BackgroundColor.SetColor(Color.LightGreen); fields.Add(step.Key); posString++; continue; } worksheet.Cells[posString, posColumn, posString + step.Value.Item1.Count-1, posColumn].Merge = true; worksheet.Cells[posString, posColumn].Value = step.Key; worksheet.Cells[posString, posColumn].Style.TextRotation = 180; worksheet.Cells[posString, posColumn].Style.Fill.PatternType = ExcelFillStyle.Solid; worksheet.Cells[posString, posColumn].Style.Fill.BackgroundColor.SetColor(Color.AliceBlue); worksheet.Column(posColumn).BestFit = true; posColumn++; foreach(var field in step.Value.Item1) { int id = step.Value.Item1.IndexOf(field); worksheet.Cells[posString, posColumn].Value = field; worksheet.Cells[posString, posColumn].Style.Fill.PatternType = ExcelFillStyle.Solid; worksheet.Cells[posString, posColumn].Style.Fill.BackgroundColor.SetColor(Color.AliceBlue); worksheet.Row(posString).Height = step.Value.Item2[id]; fields.Add(field); posString++; } posColumn--; } posColumn = 3; foreach (var step in info.Dates) { posString = 2; var type = step.GetType(); foreach(var field in fields) { worksheet.Cells[posString, posColumn].Value = type.GetField(field) == null ? type.GetProperty(field).GetValue(step) : type.GetField(field).GetValue(step); posString++; } posColumn++; } CheckTable(worksheet, fields.Count, info.Dates.Count); FileInfo fi = new FileInfo(info.Path); excelPackage.SaveAs(fi); } } public void Check(ExcelInfo info) where T : class { if (string.IsNullOrEmpty(info.Title)) throw new Exception("Забыли заглавие"); if (string.IsNullOrEmpty(info.Path)) throw new Exception("Забыли путь"); if (!info.Path.EndsWith(".xlsx")) info.Path += ".xlsx"; if (info.Dates.Count == 0) throw new Exception("забыли данные"); } public void CheckTable(ExcelWorksheet worksheet, int rows, int columns) { int posString = 2; int posColumn = 1; rows += posString; columns += posColumn; while(posString < rows) { while (posColumn < columns) { if (worksheet.Cells[posString, posColumn].Value == null && !worksheet.Cells[posString, posColumn - 1 ,posString, posColumn].Merge) throw new Exception("Пустая ячейка"); posColumn++; } posString++; } posString = 2; posColumn = 3 + columns; while(posString < rows ) { if (worksheet.Cells[posString, posColumn].Value != null) throw new Exception("Выход за границы"); posString++; } posString = 2 + rows; posColumn = 1; while (posColumn < columns) { if (worksheet.Cells[posString, posColumn].Value != null) throw new Exception("Выход за границы"); posColumn++; } } } }