рдУрдкрдирдПрдХреНрд╕рдПрдордПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХреНрд╕реЗрд▓ рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдбреЗрдЯрд╛

рдореИрдВрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХреНрд╕реЗрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдПрдХреНрд╕реЗрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рд╛ред
рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ рдХрд┐ рдХрд╛рдо рдкрд░, рд╣рдореЗрдВ рдореБрдлреНрдд рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдордПрд╕ рдСрдлрд┐рд╕ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Microsoft.Office рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдерд╛ред Interop.Excel тАЭрдФрд░ рдХреБрдЫ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЯреЗрдореНрдкрд▓реЗрдЯред
рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдпрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдореБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдФрд░ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрддрд░рд╛рдИ рдХрд╛ рдХрд╛рдо рдХрд░рдирд╛ред рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕рднреА рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдЗрд╕рд▓рд┐рдП рдореИрдВ OpenXML рдореЗрдВ рдЖрдпрд╛ред рдФрд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдЕрдм рдореИрдВ рдЬрд▓реНрджреА рд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдПрдХ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдвреВрдВрдЧрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рд╕рдордп рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреАред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЦреБрдж рдХреЛ рдорд┐рдХреНрд░рд╕реЙрдлреНрдЯ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рдореБрдлреНрдд рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдУрдкрдирдПрдХреНрд╕рдПрдордПрд▓ рдПрд╕рдбреАрдХреЗ 2.5 "рдУрдкрдирдПрдХреНрд╕рдПрдордПрд▓рдПрд╕рдбреАрдХреЗ 2525.msi" рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛)
рдпрд╣рд╛рдБ ред
"OpenXMLSDKV25.msi" рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдПрдВ
"C: \ Program Files \ Open XML SDK \ V2.5 \ lib" рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЬреЛрдбрд╝реЗрдВрдЧреЗ (рдпрд╣ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2010 (рдлреНрд░реЗрдорд╡рд░реНрдХ 4.0) рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред
рдиреАрдЪреЗ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛) "C: \ Templates \ template.xlsx"ред

рдЫрд╡рд┐

рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг (рдпрд╣ рдХреИрд╕реЗ рдЙрддрд╛рд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдВрдд рдореЗрдВ рджрд┐рдЦреЗрдЧрд╛)ред

рдЫрд╡рд┐

рдХреАрд╡рд░реНрдб:
DataField: - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдорд╛рд░реЗ рд╕реНрдирд╛рди рдбреЗрдЯрд╛рдЯреЗрдмрд▓ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
DataField: [рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдирд╛рдо]
рд▓реЗрдмрд▓: - рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕реЗ рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рдПрдХ рдмрд╛рд░ рдбрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рд▓реЗрдмрд▓: [рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдореБрдЦреНрдп рдирд╛рдо]
рдФрд░ рдпрд╣ рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо рдбреЗрдЯрд╛ "C: \ Loading \ ReadMePlease.xlsx" рдкрдврд╝реЗрдВрдЧреЗред

рдЫрд╡рд┐

рдЕрдм VS2010 рдореЗрдВ рдмрдирд╛рдПрдВ, рдЬреЛ рд╕рдорд╛рдзрд╛рди 4 рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╣реЛ рдЬрд╛рдПрдЧрд╛:
1) OpenXmlPrj рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред
2) рдЗрдВрдЯрд░рдлреЗрд╕ "рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА" рдХреА рддрд░рд╣ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рдпрд╣ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред
3) рдлреНрд░реЗрдорд╡рд░реНрдХ "рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА" рдЬреИрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рдпрд╣рд╛рдБ рдПрдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рд╕рднреА рдХрд╛рдо рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
4) рдХрдиреНрд╡рд░реНрдЯрд░ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рдбрд╛рдЯрд╛рдЯреЗрдмрд▓ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП "рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА" рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛рдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдЫрд╡рд┐
рдЕрдм "рдлреНрд░реЗрдорд╡рд░реНрдХ" рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рджреЛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ рдФрд░ OpenXML рдФрд░ WindowsBase рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд▓рд┐рдВрдХ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
"рдмрдирд╛рдПрдБ" - рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
"рд▓реЛрдб" - рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
"Lib" - рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, OpenXML рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛрдбрд╝реЗрдВред
"рдмрдирд╛рдПрдБ" рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣рдо 4 рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рддреЗ рд╣реИрдВред
1) рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ - рдпрд╣ рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рд╣реИрдВрдбрд▓рд░ рд╣реЛрдЧрд╛ред
рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ
using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Text.RegularExpressions; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; namespace Framework.Create { /// <summary> ///  Excel  /// </summary> public class Worker { /// <summary> ///      /// </summary> private const String TemplateFolder = "C:\\Templates\\"; /// <summary> ///    (    ) /// </summary> private const String SheetName = "1"; /// <summary> ///   /// </summary> private const String FileType = ".xlsx"; /// <summary> /// ,     /// </summary> public static String Directory { get { const string excelFilesPath = @"C:\xlsx_repository\"; if (System.IO.Directory.Exists(excelFilesPath) == false) { System.IO.Directory.CreateDirectory(excelFilesPath); } return excelFilesPath; } } public void Export(System.Data.DataTable dataTable, System.Collections.Hashtable hashtable, String templateName) { var filePath = CreateFile(templateName); OpenForRewriteFile(filePath, dataTable, hashtable); OpenFile(filePath); } private String CreateFile(String templateName) { var templateFelePath = String.Format("{0}{1}{2}", TemplateFolder, templateName, FileType); var templateFolderPath = String.Format("{0}{1}", Directory, templateName); if (!File.Exists(String.Format("{0}{1}{2}", TemplateFolder, templateName, FileType))) { throw new Exception(String.Format("     \n\"{0}{1}{2}\"!", TemplateFolder, templateName, FileType)); } //    ( templateName)  ,   ,    var index = (templateFolderPath).LastIndexOf("\\", System.StringComparison.Ordinal); if (index > 0) { var directoryTest = (templateFolderPath).Remove(index, (templateFolderPath).Length - index); if (System.IO.Directory.Exists(directoryTest) == false) { System.IO.Directory.CreateDirectory(directoryTest); } } var newFilePath = String.Format("{0}_{1}{2}", templateFolderPath, Regex.Replace((DateTime.Now.ToString(CultureInfo.InvariantCulture)), @"[^a-z0-9]+", ""), FileType); File.Copy(templateFelePath, newFilePath, true); return newFilePath; } private void OpenForRewriteFile(String filePath, System.Data.DataTable dataTable, System.Collections.Hashtable hashtable) { Row rowTemplate = null; var footer = new List<Footer>(); var firsIndexFlag = false; using (var document = SpreadsheetDocument.Open(filePath, true)) { Sheet sheet; try { sheet = document.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>().SingleOrDefault(s => s.Name == SheetName); } catch (Exception ex) { throw new Exception(String.Format("        \"{0}\"!\n",SheetName), ex); } if (sheet == null) { throw new Exception(String.Format("    \"{0}\"!\n",SheetName)); } var worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheet.Id.Value); var sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>(); var rowsForRemove = new List<Row>(); var fields = new List<Field>(); foreach (var row in worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>()) { var celsForRemove = new List<Cell>(); foreach (var cell in row.Descendants<Cell>()) { if (cell == null) { continue; } var value = GetCellValue(cell, document.WorkbookPart); if (value.IndexOf("DataField:", StringComparison.Ordinal) != -1) { if (!firsIndexFlag) { firsIndexFlag = true; rowTemplate = row; } fields.Add(new Field(Convert.ToUInt32(Regex.Replace(cell.CellReference.Value, @"[^\d]+", "")) , new string(cell.CellReference.Value.ToCharArray().Where(p => !char.IsDigit(p)).ToArray()) , value.Replace("DataField:", ""))); } if (value.IndexOf("Label:", StringComparison.Ordinal) != -1 && rowTemplate == null) { var labelName = value.Replace("Label:", "").Trim(); if (!hashtable.ContainsKey(labelName)) { throw new Exception(String.Format("   \"{0}\"", labelName)); } cell.CellValue = new CellValue(hashtable[labelName].ToString()); cell.DataType = new EnumValue<CellValues>(CellValues.String); } if (rowTemplate == null || row.RowIndex <= rowTemplate.RowIndex || String.IsNullOrWhiteSpace(value)) { continue; } var item = footer.SingleOrDefault(p => p._Row.RowIndex == row.RowIndex); if (item == null) { footer.Add(new Footer(row, cell, value.IndexOf("Label:", StringComparison.Ordinal) != -1 ? hashtable[value.Replace("Label:", "").Trim()].ToString() : value)); } else { item.AddMoreCell(cell, value.IndexOf("Label:", StringComparison.Ordinal) != -1 ? hashtable[value.Replace("Label:", "").Trim()].ToString() : value); } celsForRemove.Add(cell); } foreach (var cell in celsForRemove) { cell.Remove(); } if (rowTemplate != null && row.RowIndex != rowTemplate.RowIndex) { rowsForRemove.Add(row); } } if (rowTemplate == null || rowTemplate.RowIndex == null || rowTemplate.RowIndex < 0) { throw new Exception("     ,  !"); } foreach (var row in rowsForRemove) { row.Remove(); } var index = rowTemplate.RowIndex; foreach (var row in from System.Data.DataRow item in dataTable.Rows select CreateRow(rowTemplate, index, item, fields)) { sheetData.InsertBefore(row, rowTemplate); index++; } foreach (var newRow in footer.Select(item => CreateLabel(item, (UInt32)dataTable.Rows.Count))) { sheetData.InsertBefore(newRow, rowTemplate); } rowTemplate.Remove(); } } private Row CreateLabel(Footer item, uint count) { var row = item._Row; row.RowIndex = new UInt32Value(item._Row.RowIndex + (count - 1)); foreach (var cell in item.Cells) { cell._Cell.CellReference = new StringValue(cell._Cell.CellReference.Value.Replace(Regex.Replace(cell._Cell.CellReference.Value, @"[^\d]+", ""), row.RowIndex.ToString())); cell._Cell.CellValue = new CellValue(cell.Value); cell._Cell.DataType = new EnumValue<CellValues>(CellValues.String); row.Append(cell._Cell); } return row; } private Row CreateRow(Row rowTemplate, uint index, System.Data.DataRow item, List<Field> fields) { var newRow = (Row)rowTemplate.Clone(); newRow.RowIndex = new UInt32Value(index); foreach (var cell in newRow.Elements<Cell>()) { cell.CellReference = new StringValue(cell.CellReference.Value.Replace(Regex.Replace(cell.CellReference.Value, @"[^\d]+", ""), index.ToString(CultureInfo.InvariantCulture))); foreach (var fil in fields.Where(fil => cell.CellReference == fil.Column + index)) { cell.CellValue = new CellValue(item[fil._Field].ToString()); cell.DataType = new EnumValue<CellValues>(CellValues.String); } } return newRow; } private string GetCellValue(Cell cell, WorkbookPart wbPart) { var value = cell.InnerText; if (cell.DataType == null) { return value; } switch (cell.DataType.Value) { case CellValues.SharedString: var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault(); if (stringTable != null) { value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText; } break; } return value; } private void OpenFile(string filePath) { if (!File.Exists(filePath)) { throw new Exception(String.Format("    \"{0}\"!", filePath)); } var process = Process.Start(filePath); if (process != null) { process.WaitForExit(); } } } } 


2) рдкрд╛рдж - рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЗ рдмрд╛рдж рдЖрдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрдиреЗрдВ рдФрд░ рдЙрдирдХреА рдХреЛрд╢рд┐рдХрд╛рдПрдБ рд╣реЛрдВрдЧреАред
рдкрд╛рдж рд╡рд░реНрдЧ
 using System; using System.Collections.Generic; using DocumentFormat.OpenXml.Spreadsheet; namespace Framework.Create { public class Footer { /// <summary> ///  /// </summary> public Row _Row { get; private set; } /// <summary> ///    /// </summary> public List<CellForFooter> Cells { get; private set; } public Footer(Row row, Cell cell, String cellValue) { _Row = new Row((Row)row.Clone()) { RowIndex = row.RowIndex }; var _Cell = (Cell)cell.Clone(); _Cell.CellReference = cell.CellReference; Cells = new List<CellForFooter> { new CellForFooter(_Cell, cellValue) }; } public void AddMoreCell(Cell cell, String cellValue) { var _Cell = (Cell)cell.Clone(); _Cell.CellReference = cell.CellReference; Cells.Add(new CellForFooter(_Cell, cellValue)); } } } 


3) CellForFooter - рдЗрд╕рдореЗрдВ рд╕реЗрд▓ рдФрд░ рдЙрд╕рдХреЗ рдорд╛рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Footer рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреНрд▓рд╛рд╕ рд╕реЗрд▓рдлрд╝реЛрд░рдлрд╝реВрдЯрд░
 using System; using DocumentFormat.OpenXml.Spreadsheet; namespace Framework.Create { public class CellForFooter { /// <summary> ///  /// </summary> public Cell _Cell { get; private set; } /// <summary> ///  /// </summary> public String Value { get; private set; } public CellForFooter(Cell cell, String value) { _Cell = cell; Value = value; } } } 


4) рдлрд╝реАрд▓реНрдб - рдЙрд╕ рдкрдВрдХреНрддрд┐ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ DataField рд╕реНрдерд┐рдд рд╣реИ, DataField рдХреЗ рд╕рд╛рде рдХрдХреНрд╖реЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдлрд╝реАрд▓реНрдб рдХрд╛ рдирд╛рдо рдЬрд┐рд╕рдХрд╛ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреНрд▓рд╛рд╕ рдлреАрд▓реНрдб
 using System; namespace Framework.Create { public class Field { /// <summary> ///   /// </summary> public uint Row { get; private set; } /// <summary> ///   /// </summary> public String Column { get; private set; } /// <summary> ///  ,   /// </summary> public String _Field { get; private set; } public Field(uint row, String column, String field) { Row = row; Column = column; _Field = field; } } } 


"рд▓реЛрдб" рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣рдо 2 рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рддреЗ рд╣реИрдВред
1) рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ - рдпрд╣ рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рд╣реИрдВрдбрд▓рд░ рд╣реЛрдЧрд╛ред
рд╡рд░реНрдЧ рд▓реЛрдб
 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; namespace Framework.Load { /// <summary> ///    Excel /// </summary> public class Worker { /// <summary> ///   (   ) /// </summary> private const String SheetName = "1"; /// <summary> ///      .xlsx /// </summary> /// <param name="path"></param> /// <returns></returns> public System.Data.DataTable ReadFile(String path) { CheckFile(path); return OpenDocumentForRead(path); } private System.Data.DataTable OpenDocumentForRead(string path) { System.Data.DataTable data = null; using (var document = SpreadsheetDocument.Open(path, false)) { Sheet sheet; try { sheet = document.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>().SingleOrDefault(s => s.Name == SheetName); } catch (Exception ex) { throw new Exception(String.Format("        \"{0}\"!\n", SheetName), ex); } if (sheet == null) { throw new Exception(String.Format("    \"{0}\"!\n", SheetName)); } var relationshipId = sheet.Id.Value; var worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(relationshipId); var sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>(); var firstRow = true; var columsNames = new List<ColumnName>(); foreach (Row row in sheetData.Elements<Row>()) { if (firstRow) { columsNames.AddRange(GetNames(row, document.WorkbookPart)); data = GetTable(columsNames); firstRow = false; continue; } var item = data.NewRow(); foreach (var line in columsNames) { var coordinates = String.Format("{0}{1}", line.Liter, row.RowIndex); var cc = row.Elements<Cell>().SingleOrDefault(p => p.CellReference == coordinates); if (cc == null) { throw new Exception(String.Format("    \"{0}\"!", coordinates)); } item[line.Name.Trim()] = GetVal(cc, document.WorkbookPart); } data.Rows.Add(item); } } return data; } private System.Data.DataTable GetTable(IEnumerable<ColumnName> columsNames) { var teb = new System.Data.DataTable("ExelTable"); foreach (var col in columsNames.Select(columnName => new System.Data.DataColumn { DataType = typeof(String), ColumnName = columnName.Name.Trim() })) { teb.Columns.Add(col); } return teb; } private IEnumerable<ColumnName> GetNames(Row row, WorkbookPart wbPart) { return (from cell in row.Elements<Cell>() where cell != null let text = GetVal(cell, wbPart) where !String.IsNullOrWhiteSpace(text) select new ColumnName(text, Regex.Replace(cell.CellReference.Value, @"[\0-9]", ""))).ToList(); } private string GetVal(Cell cell, WorkbookPart wbPart) { string value = cell.InnerText; if (cell.DataType == null) { return value; } switch (cell.DataType.Value) { case CellValues.SharedString: var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>() .FirstOrDefault(); if (stringTable != null) { value = stringTable.SharedStringTable .ElementAt(int.Parse(value)).InnerText; } break; } return value; } private void CheckFile(String path) { if (String.IsNullOrWhiteSpace(path) || !File.Exists(path)) { throw new Exception(String.Format("  \"{0}\",  !", path)); } } } } 


2) рдХреЙрд▓рдордиреЗрдо - рд▓реЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдо рдХрд╛ рдирд╛рдо рд╣реЛрдЧрд╛ред
рд╡рд░реНрдЧ рдХреЙрд▓рдордирд╛рдо
 using System; namespace Framework.Load { public class ColumnName { /// <summary> ///  ,    /// </summary> public String Name { get; private set; } /// <summary> ///   /// </summary> public String Liter { get; private set; } public ColumnName(string name, string liter) { Name = name; Liter = liter; } } } 


рдкреНрд░реЛрдЬреЗрдХреНрдЯ "рдЗрдВрдЯрд░рдлреЗрд╕реЗрд╕" рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдбреЗрдЯрд╛ IDataForTest рдХрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдПрдВрдЧреЗред
IDataForTest рдЗрдВрдЯрд░рдлрд╝реЗрд╕
 using System; namespace Interfaces { public interface IDataForTest { String A { get; } String B { get; } String C { get; } } } 


"рдХрдиреНрд╡рд░реНрдЯрд░" рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ
ConvertToDataTable - DataTable рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рдХрдиреНрд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╡рд░реНрдЧ ConvertToDataTable
 using System; using System.Collections; using System.Collections.Generic; using System.Data; using Interfaces; namespace Converter { public class ConvertToDataTable { public DataTable ExcelTableLines(IEnumerable<IDataForTest> lines) { var dt = CreateTable(); foreach (var line in lines) { var row = dt.NewRow(); row["AAA"] = line.A; row["BBB"] = line.B; row["CCC"] = line.C; dt.Rows.Add(row); } return dt; } public Hashtable ExcelTableHeader(Int32 count) { var head = new Dictionary<String, String> { { "Date", DateTime.Today.Date.ToShortDateString() }, { "Count", count.ToString() } }; return new Hashtable(head); } private DataTable CreateTable() { var dt = new DataTable("ExelTable"); var col = new DataColumn { DataType = typeof(String), ColumnName = "AAA" }; dt.Columns.Add(col); col = new DataColumn { DataType = typeof(String), ColumnName = "BBB" }; dt.Columns.Add(col); col = new DataColumn { DataType = typeof(String), ColumnName = "CCC" }; dt.Columns.Add(col); return dt; } } } 


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ "OpenXmlPrj"
"рдкреНрд░реЛрдЧреНрд░рд╛рдо" рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ред
рдХрдХреНрд╖рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо
 using System; using System.Collections.Generic; using System.Data; namespace OpenXmlPrj { class Program { static void Main(string[] args) { //   var myData = new List<DataForTest> { new DataForTest("a1","b1","c1"), new DataForTest("a2","b2","c2"), new DataForTest("a3","b3","c3"), new DataForTest("a4","b4","c4"), new DataForTest("a5","b5","c5") }; var ex = new Converter.ConvertToDataTable(); //ex.ExcelTableLines(myData) -     DataTable //ex.ExcelTableHeader(myData.Count) -    Label //template -     -  new Framework.Create.Worker().Export(ex.ExcelTableLines(myData), ex.ExcelTableHeader(myData.Count), "template"); Console.WriteLine("Excel File Has Created!\nFor Read Data From Excel, press any key!"); Console.ReadKey(); //"C:\\Loading\\ReadMePlease.xlsx" -   ,      (  DataTable) var dt = new Framework.Load.Worker().ReadFile("C:\\Loading\\ReadMePlease.xlsx"); var myDataFromExcel = new List<DataForTest>(); //  ,    DataTable foreach (DataRow item in dt.Rows) { myDataFromExcel.Add(new DataForTest(item)); } Console.WriteLine("---------- Data ---------------------"); //   foreach (var line in myDataFromExcel) { Console.WriteLine("{0} | {1} | {2}", line.A, line.B, line.C); } Console.WriteLine("Done. Press any key, for exit!"); Console.ReadKey(); } } } 


рдФрд░ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ "DataForTest" рд╣реИред
рд╡рд░реНрдЧ DataForTest
 using System; using System.Data; using Interfaces; namespace OpenXmlPrj { public class DataForTest : IDataForTest { public String A { get; private set; } public String B { get; private set; } public String C { get; private set; } public DataForTest(String a, String b, String c) { A = a; B = b; C = c; } public DataForTest(DataRow item) { A = item["MyFieldA"].ToString(); B = item["MyFieldB"].ToString(); C = item["MyFieldC"].ToString(); } } } 


рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ "OpenXmlPrj" рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рд╕реЗ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдЗрдВрдЯрд░рдлреЗрд╕, рдлреНрд░реЗрдорд╡рд░реНрдХ, рдХрдирд╡рд░реНрдЯрд░
рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд░реНрддреЗрдВ:
1. рдПрдХреНрд╕реЗрд▓ рд╢реАрдЯ, рдЗрд╕реЗ "рд╢реАрдЯ 1" рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдпрджрд┐ рдЖрдк рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдХреЛ рдирд╛рдо рднреА рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛)ред
2. DataField рдХреЗ рдмрд╛рдж рдирд╛рдо: DataTable рдореЗрдВ рдХреЙрд▓рдо рдирд╛рдореЛрдВ рд╕реЗ рд╕рдЦреНрддреА рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
3. рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ ".xlsx" рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬрд┐рд╕ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╣рдо рдбреЗрдЯрд╛ рдкрдврд╝реЗрдВрдЧреЗ, рдЙрд╕рдХреЗ рд▓рд┐рдП рд╢рд░реНрддреЗрдВ:
1. рдПрдХреНрд╕реЗрд▓ рд╢реАрдЯ, рдЗрд╕реЗ "рд╢реАрдЯ 1" рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдпрджрд┐ рдЖрдк рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдХреЛ рдирд╛рдо рднреА рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛)ред
2. рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХреЙрд▓рдо рдХрд╛ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдлрд┐рд░ рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВрдЧреЗред

GitHub рдореЗрдВ рд╕реНрд░реЛрдд рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред

Source: https://habr.com/ru/post/In203522/


All Articles