181 lines
6.2 KiB
C#
181 lines
6.2 KiB
C#
using ClosedXML.Excel;
|
|
|
|
namespace line_gestao_api.Services
|
|
{
|
|
public class GeralSpreadsheetTemplateService
|
|
{
|
|
private const string WorksheetName = "GERAL";
|
|
private const int HeaderRow = 1;
|
|
private const int FirstDataRow = 2;
|
|
private const int LastColumn = 31; // A..AE
|
|
|
|
private static readonly string[] Headers =
|
|
{
|
|
"CONTA",
|
|
"LINHA",
|
|
"CHIP",
|
|
"CLIENTE",
|
|
"USUÁRIO",
|
|
"PLANO CONTRATO",
|
|
"FRAQUIA",
|
|
"VALOR DO PLANO R$",
|
|
"GESTÃO VOZ E DADOS R$",
|
|
"SKEELO",
|
|
"VIVO NEWS PLUS",
|
|
"VIVO TRAVEL MUNDO",
|
|
"VIVO SYNC",
|
|
"VIVO GESTÃO DISPOSITIVO",
|
|
"VALOR CONTRATO VIVO",
|
|
"FRANQUIA LINE",
|
|
"FRANQUIA GESTÃO",
|
|
"LOCAÇÃO AP.",
|
|
"VALOR CONTRATO LINE",
|
|
"DESCONTO",
|
|
"LUCRO",
|
|
"STATUS",
|
|
"DATA DO BLOQUEIO",
|
|
"SKIL",
|
|
"MODALIDADE",
|
|
"CEDENTE",
|
|
"SOLICITANTE",
|
|
"DATA DA ENTREGA OPERA.",
|
|
"DATA DA ENTREGA CLIENTE",
|
|
"VENC. DA CONTA",
|
|
"TIPO DE CHIP"
|
|
};
|
|
|
|
private static readonly double[] ColumnWidths =
|
|
{
|
|
11.00, 12.00, 21.43, 70.14, 58.29, 27.71, 11.00, 18.14,
|
|
20.71, 11.00, 14.57, 18.14, 11.00, 19.57, 21.43, 14.57,
|
|
16.29, 13.00, 20.71, 13.00, 13.00, 14.57, 16.29, 13.00,
|
|
16.29, 39.43, 27.86, 25.00, 27.71, 16.29, 13.00
|
|
};
|
|
|
|
private static readonly int[] TextColumns =
|
|
{
|
|
1, 2, 3, 4, 5, 6, 7, 16, 17, 22, 24, 25, 26, 27, 31
|
|
};
|
|
|
|
private static readonly int[] CurrencyColumns =
|
|
{
|
|
8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21
|
|
};
|
|
|
|
private static readonly int[] DateColumns =
|
|
{
|
|
23, 28, 29, 30
|
|
};
|
|
|
|
public byte[] BuildPlanilhaGeralTemplate()
|
|
{
|
|
using var workbook = new XLWorkbook();
|
|
var ws = workbook.Worksheets.Add(WorksheetName);
|
|
|
|
BuildHeader(ws);
|
|
ConfigureColumns(ws);
|
|
ConfigureDataFormatting(ws);
|
|
ConfigureSheetView(ws);
|
|
|
|
using var stream = new MemoryStream();
|
|
workbook.SaveAs(stream);
|
|
return stream.ToArray();
|
|
}
|
|
|
|
private static void BuildHeader(IXLWorksheet ws)
|
|
{
|
|
for (var i = 0; i < Headers.Length; i++)
|
|
{
|
|
ws.Cell(HeaderRow, i + 1).Value = Headers[i];
|
|
}
|
|
|
|
var headerRange = ws.Range(HeaderRow, 1, HeaderRow, LastColumn);
|
|
headerRange.Style.Font.FontName = "Calibri";
|
|
headerRange.Style.Font.FontSize = 11;
|
|
headerRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
|
|
headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
|
|
headerRange.Style.Border.TopBorder = XLBorderStyleValues.Thin;
|
|
headerRange.Style.Border.BottomBorder = XLBorderStyleValues.Thin;
|
|
headerRange.Style.Border.LeftBorder = XLBorderStyleValues.Thin;
|
|
headerRange.Style.Border.RightBorder = XLBorderStyleValues.Thin;
|
|
|
|
ws.Row(HeaderRow).Height = 14.25;
|
|
|
|
var navy = XLColor.FromHtml("#002060");
|
|
var purple = XLColor.FromHtml("#7030A0");
|
|
var orange = XLColor.FromHtml("#D9A87E");
|
|
var red = XLColor.FromHtml("#FF0000");
|
|
var yellow = XLColor.FromHtml("#FFFF00");
|
|
var white = XLColor.White;
|
|
var black = XLColor.Black;
|
|
|
|
ApplyHeaderBlock(ws, 1, 6, navy, white, bold: true); // A-F
|
|
ApplyHeaderBlock(ws, 22, 31, navy, white, bold: true); // V-AE
|
|
ApplyHeaderBlock(ws, 7, 15, purple, white, bold: true); // G-O
|
|
ApplyHeaderBlock(ws, 16, 19, orange, white, bold: true);// P-S
|
|
ApplyHeaderBlock(ws, 20, 20, red, white, bold: true); // T
|
|
ApplyHeaderBlock(ws, 21, 21, yellow, black, bold: true);// U
|
|
|
|
// Exceções no bloco azul (sem negrito): CHIP, CLIENTE, USUÁRIO => C, D, E
|
|
ws.Cell(1, 3).Style.Font.Bold = false;
|
|
ws.Cell(1, 4).Style.Font.Bold = false;
|
|
ws.Cell(1, 5).Style.Font.Bold = false;
|
|
}
|
|
|
|
private static void ApplyHeaderBlock(
|
|
IXLWorksheet ws,
|
|
int startCol,
|
|
int endCol,
|
|
XLColor bgColor,
|
|
XLColor fontColor,
|
|
bool bold)
|
|
{
|
|
var range = ws.Range(HeaderRow, startCol, HeaderRow, endCol);
|
|
range.Style.Fill.BackgroundColor = bgColor;
|
|
range.Style.Font.FontColor = fontColor;
|
|
range.Style.Font.Bold = bold;
|
|
}
|
|
|
|
private static void ConfigureColumns(IXLWorksheet ws)
|
|
{
|
|
for (var i = 0; i < ColumnWidths.Length; i++)
|
|
{
|
|
ws.Column(i + 1).Width = ColumnWidths[i];
|
|
}
|
|
}
|
|
|
|
private static void ConfigureDataFormatting(IXLWorksheet ws)
|
|
{
|
|
// Prepara um range vazio com estilo base para facilitar preenchimento manual
|
|
var dataPreviewRange = ws.Range(FirstDataRow, 1, 1000, LastColumn);
|
|
dataPreviewRange.Style.Font.FontName = "Calibri";
|
|
dataPreviewRange.Style.Font.FontSize = 11;
|
|
dataPreviewRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
|
|
|
|
foreach (var col in TextColumns)
|
|
{
|
|
ws.Column(col).Style.NumberFormat.Format = "@";
|
|
}
|
|
|
|
foreach (var col in CurrencyColumns)
|
|
{
|
|
ws.Column(col).Style.NumberFormat.Format = "\"R$\" #,##0.00";
|
|
}
|
|
|
|
foreach (var col in DateColumns)
|
|
{
|
|
ws.Column(col).Style.DateFormat.Format = "dd/MM/yyyy";
|
|
}
|
|
|
|
// O campo ITÉM é gerado internamente pelo sistema e não faz parte do template.
|
|
}
|
|
|
|
private static void ConfigureSheetView(IXLWorksheet ws)
|
|
{
|
|
ws.ShowGridLines = false;
|
|
ws.SheetView.FreezeRows(1); // Freeze em A2 (mantém linha 1 fixa)
|
|
ws.Range(1, 1, 1, LastColumn).SetAutoFilter();
|
|
}
|
|
}
|
|
}
|