Files
Backend-Api/CompanyManagement.Infrastructure.Excel/EmployeeBankInfo/EmployeeBankInfoExcelGenerator.cs

224 lines
10 KiB
C#

using OfficeOpenXml;
using OfficeOpenXml.Style;
namespace CompanyManagement.Infrastructure.Excel.EmployeeBankInfo;
public class EmployeeBankInfoExcelGenerator
{
public static byte[] Generate(List<EmployeeBankInfoExcelViewModel> list)
{
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
using var package = new ExcelPackage();
var worksheet = package.Workbook.Worksheets.Add("EmployeeBankInfo");
worksheet.Cells[1, 1].Value = "نام پرسنل";
// پیدا کردن بیشترین تعداد حساب بانکی در بین افراد
int maxAccounts = list.Max(p => p.BankAccounts.Count);
for (int i = 0; i < maxAccounts; i++)
{
worksheet.Cells[1, 2 + i * 3].Value = $"نام بانک";
worksheet.Cells[1, 3 + i * 3].Value = $"مشخصات حساب";
worksheet.Cells[1, 3 + i * 3, 1, 4 + i * 3].Merge = true;
}
// تنظیم رنگ خاکستری برای هدر
using (var range = worksheet.Cells[1, 1, 1, 1 + maxAccounts * 3])
{
range.Style.Font.Bold = true;
range.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
range.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray);
range.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
range.Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick;
range.Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick;
range.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick;
range.Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick;
}
for (int i = 0; i < maxAccounts; i++)
{
worksheet.Cells[1, 2 + i * 3].Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
worksheet.Cells[1, 2 + i * 3].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
worksheet.Cells[1, 3 + i * 3].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
worksheet.Cells[1, 3 + i * 3].Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
}
int row = 2;
foreach (var personnel in list)
{
int startRow = row;
int endRow = row + 2;
var personnelNameCell = worksheet.Cells[startRow, 1, endRow, 1];
personnelNameCell.Merge = true;
personnelNameCell.Value = personnel.Name;
personnelNameCell.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
personnelNameCell.Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
personnelNameCell.Style.Border.BorderAround(ExcelBorderStyle.Thick);
int bankNameCol = 2;
for (int j = 0; j < maxAccounts; j++)
{
var bankCell = worksheet.Cells[row, bankNameCol, row + 2, bankNameCol];
bankCell.Merge = true;
bankCell.Style.Border.BorderAround(ExcelBorderStyle.Thick);
bankCell.Style.Border.Right.Style = ExcelBorderStyle.Thin;
bankCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
bankCell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
worksheet.Cells[row, bankNameCol + 1].Style.Border.BorderAround(ExcelBorderStyle.Thin);
worksheet.Cells[row, bankNameCol + 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
worksheet.Cells[row + 1, bankNameCol + 1].Style.Border.BorderAround(ExcelBorderStyle.Thin);
worksheet.Cells[row + 1, bankNameCol + 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
worksheet.Cells[row + 2, bankNameCol + 1].Style.Border.BorderAround(ExcelBorderStyle.Thin);
worksheet.Cells[row + 2, bankNameCol + 1].Style.Border.Bottom.Style = ExcelBorderStyle.Thick;
worksheet.Cells[row + 2, bankNameCol + 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
worksheet.Cells[row, bankNameCol + 2].Style.Border.BorderAround(ExcelBorderStyle.Thin);
worksheet.Cells[row, bankNameCol + 2].Style.Border.Right.Style = ExcelBorderStyle.Thick;
worksheet.Cells[row + 1, bankNameCol + 2].Style.Border.BorderAround(ExcelBorderStyle.Thin);
worksheet.Cells[row + 1, bankNameCol + 2].Style.Border.Right.Style = ExcelBorderStyle.Thick;
worksheet.Cells[row + 2, bankNameCol + 2].Style.Border.BorderAround(ExcelBorderStyle.Thin);
worksheet.Cells[row + 2, bankNameCol + 2].Style.Border.Right.Style = ExcelBorderStyle.Thick;
worksheet.Cells[row + 2, bankNameCol + 2].Style.Border.Bottom.Style = ExcelBorderStyle.Thick;
var bankAccountsCount = personnel.BankAccounts.Count;
if (j < bankAccountsCount)
{
worksheet.Cells[row, bankNameCol + 1].Value = "کارت";
worksheet.Cells[row + 1, bankNameCol + 1].Value = "شبا";
worksheet.Cells[row + 2, bankNameCol + 1].Value = "حساب";
var bankInfo = personnel.BankAccounts.OrderByDescending(x => x.IsDefault).ToList()[j];
bankCell.Value = string.IsNullOrWhiteSpace(bankInfo.BankName) ? "-" : bankInfo.BankName;
worksheet.Cells[row , bankNameCol + 2].Style.HorizontalAlignment = string.IsNullOrWhiteSpace(bankInfo.CardNumber)? ExcelHorizontalAlignment.Center:ExcelHorizontalAlignment.General;
worksheet.Cells[row + 1, bankNameCol + 2].Style.HorizontalAlignment = string.IsNullOrWhiteSpace(bankInfo.ShebaNumber) ? ExcelHorizontalAlignment.Center : ExcelHorizontalAlignment.General;
worksheet.Cells[row + 2, bankNameCol + 2].Style.HorizontalAlignment = string.IsNullOrWhiteSpace(bankInfo.AccountNumber) ? ExcelHorizontalAlignment.Center : ExcelHorizontalAlignment.General;
worksheet.Cells[row, bankNameCol + 2].Value = string.IsNullOrWhiteSpace(bankInfo.CardNumber) ? "-" : bankInfo.CardNumber;
worksheet.Cells[row + 1, bankNameCol + 2].Value = string.IsNullOrWhiteSpace(bankInfo.ShebaNumber) ? "-" : bankInfo.ShebaNumber;
worksheet.Cells[row + 2, bankNameCol + 2].Value = string.IsNullOrWhiteSpace(bankInfo.AccountNumber) ? "-" : bankInfo.AccountNumber;
if (bankInfo.IsDefault)
{
worksheet.Cells[row, bankNameCol, row + 2, bankNameCol + 2].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
worksheet.Cells[row, bankNameCol, row + 2, bankNameCol + 2].Style.Fill.BackgroundColor.SetColor(1, 198, 224, 180);
}
}
else
{
bankCell.Value = "-";
worksheet.Cells[row, bankNameCol + 1].Value = "-";
worksheet.Cells[row + 1, bankNameCol + 1].Value = "-";
worksheet.Cells[row + 2, bankNameCol + 1].Value = "-";
}
worksheet.Columns[bankNameCol].Width = 15;
worksheet.Columns[bankNameCol + 2].Width = 16;
worksheet.Columns[1].Width = 16;
bankNameCol += 3;
}
row += 3;
}
// Adjust column widths
//worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
worksheet.View.RightToLeft = true;
return package.GetAsByteArray();
}
public static byte[] Generate2(List<EmployeeBankInfoExcelViewModel> list)
{
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
using var package = new ExcelPackage();
foreach (var employee in list)
{
var worksheet = package.Workbook.Worksheets.Add(employee.Name);
// تنظیم هدر ستون‌ها
worksheet.Cells[1, 1].Value = "Bank Name";
worksheet.Cells[1, 2].Value = "Card Number";
worksheet.Cells[1, 3].Value = "Account Number";
worksheet.Cells[1, 4].Value = "Sheba Number";
worksheet.Cells[1, 5].Value = "Is Default";
for (int i = 0; i < employee.BankAccounts.Count; i++)
{
var account = employee.BankAccounts[i];
int row = i + 2;
worksheet.Cells[row, 1].Value = account.BankName;
worksheet.Cells[row, 2].Value = account.CardNumber;
worksheet.Cells[row, 3].Value = account.AccountNumber;
worksheet.Cells[row, 4].Value = account.ShebaNumber;
worksheet.Cells[row, 5].Value = account.IsDefault ? "Yes" : "No";
// استایل‌دهی به سطرها
worksheet.Cells[row, 1, row, 5].Style.Fill.PatternType = ExcelFillStyle.Solid;
worksheet.Cells[row, 1, row, 5].Style.Fill.BackgroundColor
.SetColor(account.IsDefault ? System.Drawing.Color.Green : System.Drawing.Color.White);
// استایل‌دهی به متن
worksheet.Cells[row, 1, row, 5].Style.Font.Color
.SetColor(account.IsDefault ? System.Drawing.Color.White : System.Drawing.Color.Black);
}
}
return package.GetAsByteArray();
}
private static void ApplyHeaderStyle(ExcelRange cell)
{
cell.Style.Font.Bold = true;
cell.Style.Fill.PatternType = ExcelFillStyle.Solid;
cell.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray);
cell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
cell.Style.Border.BorderAround(ExcelBorderStyle.Thin);
}
private static void ApplyGeneralDataStyle(ExcelRange cell)
{
cell.Style.Border.BorderAround(ExcelBorderStyle.Thin);
cell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
cell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
cell.Style.Fill.PatternType = ExcelFillStyle.Solid;
}
}