الشروع في العمل مع Excel في C #

في عالم تطوير التطبيقات الحديث ، غالبًا ما يكون من الضروري العمل مع مستندات Excel. غالبًا ما تكون هذه أنواعًا مختلفة من التقارير ، ولكن في بعض الأحيان يتم استخدام ملفات xls / x لتخزين البيانات. على سبيل المثال ، إذا احتاج المستخدم إلى أن يكون قادرًا على تحميل البيانات إلى تطبيق ما أو تحميلها في نموذج يمكن قراءته ، فإن Excel هو المعيار الفعلي. واجهة ودية نسبيًا ، وهيكل شفاف ، إلى جانب انتشارها ... من الصعب تسمية حل أفضل بشكل مرتجل.

ومع ذلك ، لا يزال العديد من الأشخاص يربطون بين Excel وشيء ثقيل وخرق ومعقد. دعونا نرى كيف يمكننا ، نحن مطورو C # العاديين ، إنشاء مستند Excel بسيط بسهولة باستخدام تقرير جدولي كمثال.

مرجع تاريخي

لقد ولت الأيام التي هيمنت فيها ملكية .xls (تنسيق ملف Excel الثنائي) منذ فترة طويلة والآن لدينا فقط .xlsx (مصنف Excel) ، داخل Office Open XML. هذا الأخير هو أرشيف مضغوط عادي مع ملفات XML. لن نتعمق في هيكلها ، وآمل بصدق ألا تحتاجها أبدًا.

على 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 الأول لدينا ، والعمل مع الأنماط وحتى حل بعض المشاكل ذات الصلة.

ثانيًا ، قد يكون من المنطقي البحث عن وظيفة جديدة ، ولكن بالنظر إلى المستقبل ، لن أكون في عجلة من أمري مع هذا ... إذا حصل هذا المنشور على أكثر من مشاهدة ، فسنتحدث في الجزء الثاني عن كيفية فصل التصميم عن منطق ملء البيانات ، وتبسيط عمليات التلاعب بالخلايا وجعل الكود أكثر قابلية للصيانة بشكل عام.




All Articles