diff --git a/Diner/DinerView/DinerView.csproj b/Diner/DinerView/DinerView.csproj
index 550084f..4602ca6 100644
--- a/Diner/DinerView/DinerView.csproj
+++ b/Diner/DinerView/DinerView.csproj
@@ -25,7 +25,7 @@
-
+
diff --git a/Diner/DineryBusinessLogic/DineryBusinessLogic.csproj b/Diner/DineryBusinessLogic/DineryBusinessLogic.csproj
index 6b910ea..5741c89 100644
--- a/Diner/DineryBusinessLogic/DineryBusinessLogic.csproj
+++ b/Diner/DineryBusinessLogic/DineryBusinessLogic.csproj
@@ -7,8 +7,9 @@
-
-
+
+
+
diff --git a/Diner/DineryBusinessLogic/OfficePackage/AbstractSaveToExcel.cs b/Diner/DineryBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
index 9715ecd..d2a86c0 100644
--- a/Diner/DineryBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
+++ b/Diner/DineryBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
@@ -75,9 +75,9 @@ namespace DineryBusinessLogic.OfficePackage
// Создание excel-файла
protected abstract void CreateExcel(ExcelInfo info);
// Добавляем новую ячейку в лист
- protected abstract void InsertCellInWorksheet(ExcelCellParameters excelParameters);
+ protected abstract void InsertCellInWorksheet(ExcelCellParameters excelParams);
// Объединение ячеек
- protected abstract void MergeCells(ExcelMergeParameters mergeParams);
+ protected abstract void MergeCells(ExcelMergeParameters excelParams);
// Сохранение файла
protected abstract void SaveExcel(ExcelInfo info);
}
diff --git a/Diner/DineryBusinessLogic/OfficePackage/Implements/SaveToExcel.cs b/Diner/DineryBusinessLogic/OfficePackage/Implements/SaveToExcel.cs
index 9673131..ea1ab19 100644
--- a/Diner/DineryBusinessLogic/OfficePackage/Implements/SaveToExcel.cs
+++ b/Diner/DineryBusinessLogic/OfficePackage/Implements/SaveToExcel.cs
@@ -1,6 +1,12 @@
-using DineryBusinessLogic.OfficePackage.HelperModels;
+using DineryBusinessLogic.OfficePackage.HelperEnums;
+using DineryBusinessLogic.OfficePackage.HelperModels;
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Office2010.Excel;
+using DocumentFormat.OpenXml.Office2013.Excel;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
+
+
using System;
using System.Collections.Generic;
using System.Linq;
@@ -13,10 +19,10 @@ namespace DineryBusinessLogic.OfficePackage.Implements
{
private SpreadsheetDocument? _spreadsheetDocument;
private SharedStringTablePart? _shareStringPart;
- private Worksheet? worksheet;
+ private Worksheet? _worksheet;
- private static void CreateStyles(WorksheetPart worksheetpart) {
- var sp = worksheetpart.AddNewPart();
+ private static void CreateStyles(WorkbookPart workbookpart) {
+ var sp = workbookpart.AddNewPart();
sp.Stylesheet = new Stylesheet();
var fonts = new Fonts() { Count = 2U, KnownFonts = true };
var fontUsual = new Font();
@@ -68,7 +74,7 @@ namespace DineryBusinessLogic.OfficePackage.Implements
var cellStyleFormats = new CellStyleFormats() { Count = 1U };
var cellFormatStyle = new CellFormat() { NumberFormatId = 0U, FontId = 0U, FillId = 0U, BorderId = 0U };
cellStyleFormats.Append(cellFormatStyle);
- var cellFormat = new CellFormats() { Count = 3U };
+ var cellFormats = new CellFormats() { Count = 3U };
var cellFormatFont = new CellFormat()
{
NumberFormatId = 0U,
@@ -103,29 +109,159 @@ namespace DineryBusinessLogic.OfficePackage.Implements
},
ApplyFont = true,
};
- cellFormat.Append(cellFormatFont);
- cellFormat.Append(cellFormatFontAndBorder);
- cellFormat.Append(cellFormatTitle);
+ cellFormats.Append(cellFormatFont);
+ cellFormats.Append(cellFormatFontAndBorder);
+ cellFormats.Append(cellFormatTitle);
+ var cellStyles = new CellStyles() { Count = 1U };
+ cellStyles.Append(new CellStyle()
+ {
+ Name = "Normal",
+ FormatId = 0U,
+ BuiltinId = 0U
+ });
+ var differentialFormats = new DocumentFormat.OpenXml.Office2013.Excel.DifferentialFormats() { Count = 0U };
+ var tableStyles = new TableStyles()
+ {
+ Count = 0U,
+ DefaultTableStyle = "TableStyleMedium2",
+ DefaultPivotStyle = "PivotStyleLight16"
+ };
+ var stylesheetExtensionList = new StylesheetExtension();
+ var stylesheetExtension1 = new StylesheetExtension() { Uri = "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}" };
+ stylesheetExtension1.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
+ stylesheetExtension1.Append(new SlicerStyles() { DefaultSlicerStyle = "SlicerStyleLight1" });
+
+ var stylesheetExtension2 = new StylesheetExtension() { Uri = "{9260A510-F301-46a8-8635-F512D64BE5F5}" };
+ stylesheetExtension2.AddNamespaceDeclaration("x15", "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main");
+ stylesheetExtension2.Append(new TimelineStyles() { DefaultTimelineStyle = "TimeSlicerStyleLight1" });
+
+ stylesheetExtensionList.Append(stylesheetExtension1);
+ stylesheetExtensionList.Append(stylesheetExtension2);
+
+ sp.Stylesheet.Append(fonts);
+ sp.Stylesheet.Append(fills);
+ sp.Stylesheet.Append(borders);
+ sp.Stylesheet.Append(cellStyleFormats);
+ sp.Stylesheet.Append(cellFormats);
+ sp.Stylesheet.Append(cellStyles);
+ sp.Stylesheet.Append(differentialFormats);
+ sp.Stylesheet.Append(tableStyles);
+ sp.Stylesheet.Append(stylesheetExtensionList);
+ }
+ // Получение номера стиля из типа
+ private static uint GetStyleValue(ExcelStyleInfoType styleInfo) {
+ return styleInfo switch
+ {
+ ExcelStyleInfoType.Title => 2U,
+ ExcelStyleInfoType.TextWithBorder => 1U,
+ ExcelStyleInfoType.Text => 0U,
+ _ => 0U,
+ };
}
protected override void CreateExcel(ExcelInfo info)
{
- throw new NotImplementedException();
+ _spreadsheetDocument = SpreadsheetDocument.Create(info.FileName, SpreadsheetDocumentType.Workbook);
+ // Создаем книгу (в ней хранятся листы)
+ var workbookpart = _spreadsheetDocument.AddWorkbookPart();
+ workbookpart.Workbook = new Workbook();
+ CreateStyles(workbookpart);
+ // Получаем/создаем хранилище текстов для книги
+ _shareStringPart = _spreadsheetDocument.WorkbookPart!.GetPartsOfType().Any()
+ ? _spreadsheetDocument.WorkbookPart.GetPartsOfType().First()
+ : _spreadsheetDocument.WorkbookPart.AddNewPart();
+ // Создаем SharedStringTable, если его нет
+ if (_shareStringPart.SharedStringTable == null) {
+ _shareStringPart.SharedStringTable = new SharedStringTable();
+ }
+ // Создаем лист в книгу
+ var worksheetPart = workbookpart.AddNewPart();
+ worksheetPart.Worksheet = new Worksheet(new SheetData());
+ // Добавляем лист в книгу
+ var sheets = _spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new Sheets());
+ var sheet = new Sheet()
+ {
+ Id = _spreadsheetDocument.WorkbookPart.GetIdOfPart(workbookpart),
+ SheetId = 1,
+ Name = "Лист"
+ };
+ sheet.Append(sheet);
+ _worksheet = worksheetPart.Worksheet;
}
- protected override void InsertCellInWorksheet(ExcelCellParameters excelParameters)
+ protected override void InsertCellInWorksheet(ExcelCellParameters excelParams)
{
- throw new NotImplementedException();
+ if (_worksheet == null || _shareStringPart == null) {
+ return;
+ }
+ var sheetData = _worksheet.GetFirstChild();
+ if (sheetData == null) {
+ return;
+ }
+ Row row;
+ if (sheetData.Elements().Where(r => r.RowIndex! == excelParams.RowIndex).Any()) {
+ row = sheetData.Elements().Where(r => r.RowIndex! == excelParams.RowIndex).First();
+ }
+ else {
+ row = new Row() { RowIndex = excelParams.RowIndex };
+ sheetData.Append(row);
+ }
+ // Поиск нужнойц ячейки
+ Cell cell;
+ if (row.Elements().Where(c => c.CellReference!.Value == excelParams.CellReference).Any()) {
+ cell = row.Elements().Where(c => c.CellReference!.Value == excelParams.CellReference).First();
+ }
+ else {
+ // Все ячейки должны быть последовательно друг за другом расположены
+ // нужно определить, после какой вставлять
+ Cell? refCell = null;
+ foreach (Cell rowCell in row.Elements()) {
+ if (string.Compare(rowCell.CellReference!.Value, excelParams.CellReference, true) > 0) {
+ refCell = rowCell;
+ break;
+ }
+ }
+ var newCell = new Cell() { CellReference = excelParams.CellReference };
+ row.InsertBefore(newCell, refCell);
+ cell = newCell;
+ }
+ // добавление новго текста
+ _shareStringPart.SharedStringTable.AppendChild(new SharedStringItem(new Text(excelParams.Text)));
+ _shareStringPart.SharedStringTable.Save();
+ cell.CellValue = new CellValue((_shareStringPart.SharedStringTable.Elements().Count() - 1).ToString());
+ cell.DataType = new EnumValue(CellValues.SharedString);
+ cell.StyleIndex = GetStyleValue(excelParams.StyleInfo);
}
- protected override void MergeCells(ExcelMergeParameters mergeParams)
+ protected override void MergeCells(ExcelMergeParameters excelParams)
{
- throw new NotImplementedException();
+ if (_worksheet == null) {
+ return;
+ }
+ MergeCells mergeCells;
+ if (_worksheet.Elements().Any()) {
+ mergeCells = _worksheet.Elements().First();
+ }
+ else {
+ mergeCells = new MergeCells();
+ if (_worksheet.Elements().Any()) {
+ _worksheet.InsertAfter(mergeCells, _worksheet.Elements().First());
+ }
+ else {
+ _worksheet.InsertAfter(mergeCells,_worksheet.Elements().First());
+ }
+ }
+ var mergeCell = new MergeCell() { Reference = new StringValue(excelParams.Merge) };
+ mergeCell.Append(mergeCell);
}
protected override void SaveExcel(ExcelInfo info)
{
- throw new NotImplementedException();
+ if (_spreadsheetDocument == null) {
+ return;
+ }
+ _spreadsheetDocument.WorkbookPart!.Workbook.Save();
+ _spreadsheetDocument.Close();
}
}
}
| | |