現代のアプリケーション開発の世界では、Excelドキュメントを操作する必要があることがよくあります。ほとんどの場合、これらはさまざまな種類のレポートですが、xls / xファイルがデータストレージとして使用されることもあります。たとえば、ユーザーがデータをアプリケーションにアップロードしたり、人間が読み取れる形式でアップロードしたりできる必要がある場合、Excelが事実上の標準です。比較的フレンドリーなインターフェース、透明な構造、そしてその普及と相まって...より良い解決策をすぐに挙げることは難しいです。
ただし、多くの人は依然としてExcelを重くて不器用で複雑なものと関連付けています。通常のC#開発者が、表形式のレポートを例として使用して、簡単なExcelドキュメントを簡単に生成する方法を見てみましょう。
歴史的参照
独自の.xls(Excel Binary File Format)が主流であった時代は過ぎ去り、Office Open XML内には.xlsx(Excel Workbook)しかありません。後者は、XMLファイルを含む通常の.zipアーカイブです。私たちはその構造を掘り下げません、私はあなたがそれを決して必要としないことを心から願っています。
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;
Generateメソッドの最終バージョンは何と言っていますか?
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();
}
まず第一に、私たちがタスクにうまく対処したこと、つまり、最初のExcelレポートを生成し、スタイルを操作し、関連するいくつかの問題を解決したことです。
第二に、新しい仕事を探すのは理にかなっているかもしれませんが、先を見据えて、私はこれで急いでいません...この出版物が1回以上のビューを取得した場合、第2部では、スタイリングをデータ入力ロジックから分離する方法について説明します、セル操作を簡素化し、コードを一般的に保守しやすくします。