In der modernen Welt der Anwendungsentwicklung ist es häufig erforderlich, mit Excel-Dokumenten zu arbeiten. Meistens handelt es sich dabei um verschiedene Arten von Berichten, aber manchmal werden xls / x-Dateien als Datenspeicher verwendet. Wenn ein Benutzer beispielsweise Daten in eine Anwendung hochladen oder in einer für Menschen lesbaren Form hochladen muss, ist Excel der De-facto-Standard. Relativ benutzerfreundliche Oberfläche, transparente Struktur, gepaart mit ihrer Verbreitung ... es ist schwer, eine bessere Lösung ohne weiteres zu nennen.
Viele Leute assoziieren Excel jedoch immer noch mit etwas Schwerem, Unbeholfenem und Komplexem. Lassen Sie uns sehen, wie wir als normale C # -Entwickler auf einfache Weise ein einfaches Excel-Dokument am Beispiel eines tabellarischen Berichts erstellen können.
Historischer Bezug
Die Zeiten, in denen die proprietären XLS-Dateien (Excel Binary File Format) dominierten, sind lange vorbei, und jetzt haben wir nur noch XLSX (Excel Workbook) in Office Open XML. Letzteres ist ein reguläres ZIP-Archiv mit XML-Dateien. Wir werden uns nicht mit seiner Struktur befassen, ich hoffe aufrichtig, dass Sie es nie brauchen werden.
github, , , . EPPlus. , Excel, EPPlus. 4 , 5‐ .
, , - , Excel - 100500%. - - — .
, . — . — , . , - backend- - , id . , id , .
, , - " excel MarketReport". , , — :

EPPlus 4.5.3.3 .
Generate. ExcelPackage , . .
main , Excel . .
, exception:InvalidOperationException: The workbook must contain at least one worksheet
, Excel , . , :
var sheet = package.Workbook.Worksheets
.Add("Market Report");... ! , , 2,5KB - Excel .
. Cells . , , - :
sheet.Cells["B2"].Value = "Company:";
sheet.Cells[2, 3].Value = report.Company.Name;.
sheet.Cells["B2"].Value = "Company:";
sheet.Cells[2, 3].Value = report.Company.Name;
sheet.Cells["B3"].Value = "Location:";
sheet.Cells["C3"].Value = $"{report.Company.Address}, " +
$"{report.Company.City}, " +
$"{report.Company.Country}";
sheet.Cells["B4"].Value = "Sector:";
sheet.Cells["C4"].Value = report.Company.Sector;
sheet.Cells["B5"].Value = report.Company.Description;History:
sheet.Cells[8, 2, 8, 4].LoadFromArrays(new object[][]{ new []{"Capitalization", "SharePrice", "Date"} });
var row = 9;
var column = 2;
foreach (var item in report.History)
{
sheet.Cells[row, column].Value = item.Capitalization;
sheet.Cells[row, column + 1].Value = item.SharePrice;
sheet.Cells[row, column + 2].Value = item.Date;
row++;
}LoadFromArrays, () . , object EPPlus ToString, .
, , .

-, , - ... , , " - " - .
, , , , , ... , backend , Excel Sheet!
. — , — . ?
- Excel, , . , ... , :
sheet.Cells[1, 1, row, column + 2].AutoFitColumns();
sheet.Column(2).Width = 14;
sheet.Column(3).Width = 12;, Style. 3- . , ...
sheet.Cells[9, 4, 9 + report.History.Length, 4].Style.Numberformat.Format = "yyyy";
sheet.Cells[9, 2, 9 + report.History.Length, 2].Style.Numberformat.Format = "### ### ### ##0";, . , EPPlus, — ExcelRange, , 1 .
sheet.Column(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Left;
sheet.Cells[8, 3, 8 + report.History.Length, 3].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;, Style.Font, , , 2- , , Excel:
sheet.Cells[8, 2, 8, 4].Style.Font.Bold = true;
sheet.Cells["B2:C4"].Style.Font.Bold = true;, . - - , ... ?
sheet.Cells[8, 2, 8 + report.History.Length, 4].Style.Border.BorderAround(ExcelBorderStyle.Double);
sheet.Cells[8, 2, 8, 4].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;" , , ?" - , , 9-...
, EPPlus API. , :
var capitalizationChart = sheet.Drawings.AddChart("FindingsChart", OfficeOpenXml.Drawing.Chart.eChartType.Line);
capitalizationChart.Title.Text = "Capitalization";
capitalizationChart.SetPosition(7, 0, 5, 0);
capitalizationChart.SetSize(800, 400);
var capitalizationData = (ExcelChartSerie)(capitalizationChart.Series.Add(sheet.Cells["B9:B28"], sheet.Cells["D9:D28"]));
capitalizationData.Header = report.Company.Currency;, :
sheet.Protection.IsProtected = true;Was sagt die endgültige Version der Generate-Methode?
public byte[] Generate(MarketReport report)
{
var package = new ExcelPackage();
var sheet = package.Workbook.Worksheets
.Add("Market Report");
sheet.Cells["B2"].Value = "Company:";
sheet.Cells[2, 3].Value = report.Company.Name;
sheet.Cells["B3"].Value = "Location:";
sheet.Cells["C3"].Value = $"{report.Company.Address}, " +
$"{report.Company.City}, " +
$"{report.Company.Country}";
sheet.Cells["B4"].Value = "Sector:";
sheet.Cells["C4"].Value = report.Company.Sector;
sheet.Cells["B5"].Value = report.Company.Description;
sheet.Cells[8, 2, 8, 4].LoadFromArrays(new object[][]{ new []{"Capitalization", "SharePrice", "Date"} });
var row = 9;
var column = 2;
foreach (var item in report.History)
{
sheet.Cells[row, column].Value = item.Capitalization;
sheet.Cells[row, column + 1].Value = item.SharePrice;
sheet.Cells[row, column + 2].Value = item.Date;
row++;
}
sheet.Cells[1, 1, row, column + 2].AutoFitColumns();
sheet.Column(2).Width = 14;
sheet.Column(3).Width = 12;
sheet.Cells[9, 4, 9+ report.History.Length, 4].Style.Numberformat.Format = "yyyy";
sheet.Cells[9, 2, 9+ report.History.Length, 2].Style.Numberformat.Format = "### ### ### ##0";
sheet.Column(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Left;
sheet.Cells[8, 3, 8 + report.History.Length, 3].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
sheet.Column(4).Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
sheet.Cells[8, 2, 8, 4].Style.Font.Bold = true;
sheet.Cells["B2:C4"].Style.Font.Bold = true;
sheet.Cells[8, 2, 8 + report.History.Length, 4].Style.Border.BorderAround(ExcelBorderStyle.Double);
sheet.Cells[8, 2, 8, 4].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
var capitalizationChart = sheet.Drawings.AddChart("FindingsChart", OfficeOpenXml.Drawing.Chart.eChartType.Line);
capitalizationChart.Title.Text = "Capitalization";
capitalizationChart.SetPosition(7, 0, 5, 0);
capitalizationChart.SetSize(800, 400);
var capitalizationData = (ExcelChartSerie)(capitalizationChart.Series.Add(sheet.Cells["B9:B28"], sheet.Cells["D9:D28"]));
capitalizationData.Header = report.Company.Currency;
sheet.Protection.IsProtected = true;
return package.GetAsByteArray();
}Zunächst einmal, dass wir die Aufgabe erfolgreich gemeistert haben , nämlich unseren ersten Excel-Bericht erstellt, mit Stilen gearbeitet und sogar einige verwandte Probleme gelöst haben.
Zweitens mag es sinnvoll sein, nach einem neuen Job zu suchen, aber mit Blick auf die Zukunft würde ich es nicht eilig haben ... Wenn diese Veröffentlichung mehr als 1 Aufrufe erhält, werden wir im zweiten Teil darüber sprechen, wie Sie das Styling von der Datenfülllogik trennen können , vereinfachen Sie Zellmanipulationen und machen Sie den Code im Allgemeinen wartbarer.