Premiers pas avec Excel en C #

Dans le monde moderne du développement d'applications, il est souvent nécessaire de travailler avec des documents Excel. Le plus souvent, il s'agit de différents types de rapports, mais parfois des fichiers xls / x sont utilisés comme stockage de données. Par exemple, si un utilisateur doit être en mesure de télécharger des données dans une application ou de les télécharger sous une forme lisible par l'homme, Excel est la norme de facto. Interface relativement conviviale, structure transparente, couplée à sa prévalence ... il est difficile de nommer une meilleure solution à l'improviste.

Cependant, de nombreuses personnes associent encore Excel à quelque chose de lourd, de maladroit et de complexe. Voyons comment nous, les développeurs C # ordinaires, pouvons facilement générer un document Excel simple en utilisant un rapport tabulaire comme exemple.

Référence historique

L'époque où dominait le .xls propriétaire (Excel Binary File Format) est révolue depuis longtemps et maintenant nous n'avons que .xlsx (Excel Workbook), dans Office Open XML. Ce dernier est une archive .zip régulière avec des fichiers XML. Nous n'entrerons pas dans sa structure, j'espère sincèrement que vous n'en aurez jamais besoin.

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;

,   .

Que dit la version finale de la méthode 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();
}

Tout d'abord, tout d'abord, que nous avons réussi à faire face à la tâche, à savoir, généré notre premier rapport Excel, travaillé avec des styles et même résolu quelques problèmes connexes.

Deuxièmement, il peut être judicieux de chercher un nouvel emploi, mais pour l' avenir , je ne serais pas pressé avec cela ... Si cette publication obtient 1+ vues, alors dans la deuxième partie, nous parlerons de la façon dont vous pouvez séparer le style de la logique de remplissage des données , simplifie les manipulations des cellules et rend le code plus maintenable en général.




All Articles