using System.ComponentModel; using Excel = Microsoft.Office.Interop.Excel; namespace CustomComponents { public partial class TableComponent : Component { char[] colIndex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; //порядок столбцов //public List columnsName = new List(); public TableComponent() { InitializeComponent(); } public TableComponent(IContainer container) { container.Add(this); InitializeComponent(); } public bool CreateTableExcel(string path, string title, List mergeCells, int[] colsWidth, string[] headings, List columnsName, List data) where T : class, new() { if (path != string.Empty && title != string.Empty && mergeCells != null && colsWidth != null && headings != null && data != null) { if (columnsName == null) { throw new Exception("Не заполнены названия колонок"); } var excelApp = new Excel.Application(); excelApp.SheetsInNewWorkbook = 1; excelApp.Workbooks.Add(); Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.Worksheets.get_Item(1); workSheet.Cells[1, "A"] = title; //Добавление заголовков if (colsWidth.Length == headings.Length) { for (int j = 1; j <= headings.Length; j++) { if (!headings[j - 1].Equals(string.Empty)) { workSheet.Cells[2, j] = headings[j - 1]; workSheet.Columns[j].ColumnWidth = colsWidth[j - 1]; workSheet.Cells[2, j].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[2, j].VerticalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[2, j].Font.Bold = true; } else { throw new Exception("Не все заголовки имеют данные"); } } } else { throw new Exception("Кол-во заголовков не соответствует кол-ву размеров столбцов"); } List mergeInds = new List(); //Объединение ячеек по столбцам foreach (var merge in mergeCells) { mergeInds.AddRange(merge.CellIndexes); Excel.Range rangeToCopy = workSheet.get_Range ($"{colIndex[merge.CellIndexes[0]]}2", $"{colIndex[merge.CellIndexes[merge.CellIndexes.Length - 1]]}2").Cells; Excel.Range rangeToInsert = workSheet.get_Range ($"{colIndex[merge.CellIndexes[0]]}3", $"{colIndex[merge.CellIndexes[merge.CellIndexes.Length - 1]]}3").Cells; rangeToInsert.Insert(Excel.XlInsertShiftDirection.xlShiftToRight, rangeToCopy.Cut()); Excel.Range rangeMerge = workSheet.get_Range ($"{colIndex[merge.CellIndexes[0]]}2", $"{colIndex[merge.CellIndexes[merge.CellIndexes.Length - 1]]}2").Cells; rangeMerge.Merge(); workSheet.Cells[2, merge.CellIndexes[0] + 1] = merge.Heading; workSheet.Cells[2, merge.CellIndexes[0] + 1].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[2, merge.CellIndexes[0] + 1].VerticalAlignment = Excel.XlHAlign.xlHAlignCenter; workSheet.Cells[2, merge.CellIndexes[0] + 1].Font.Bold = true; } //Объединение ячеек по строкам, которые не объединяются по столбцам for (int j = 1; j <= headings.Length; j++) { if (!mergeInds.Contains(j - 1)) { Excel.Range range = workSheet.get_Range($"{colIndex[j - 1]}2", $"{colIndex[j - 1]}3").Cells; range.Merge(); } } //Заполение данными int i = 4; foreach (var item in data) { var fields = item.GetType().GetProperties(); if (fields.Count() == columnsName.Count()) { for (int j = 0; j < fields.Count(); j++) { int colIndex = 0; var field = item.GetType().GetProperties()[j]; var value = field.GetValue(item); if (value != null) { foreach (var column in columnsName) { if (column == field.Name) { colIndex = columnsName.IndexOf(column) + 1; break; } } if (colIndex != 0) { workSheet.Cells[i, colIndex] = value; } else { throw new Exception($"Соответствующая колонка в таблице для поля {field.Name} = {value} не найдена"); } } else { throw new Exception("Поле имеет пустое значение"); } } i++; } else { throw new Exception("Кол-во полей объекта не соответствует кол-ву столбцов в таблице"); } } //границы у таблицы for (int str = 2; str <= (data.Count() + 3); str++) { for (int j = 1; j < headings.Length + 1; j++) { workSheet.Cells[str, j].BorderAround(true); } } if(File.Exists(path)) { File.Delete(path); } excelApp.Application.ActiveWorkbook.SaveAs(path); excelApp.Workbooks.Close(); excelApp.Quit(); return true; } else { return false; } } } }