pdf e exel
This commit is contained in:
375
lib/pages/excel_export_service.dart
Normal file
375
lib/pages/excel_export_service.dart
Normal file
@@ -0,0 +1,375 @@
|
||||
import 'dart:io';
|
||||
import 'package:excel/excel.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
import 'package:supabase_flutter/supabase_flutter.dart';
|
||||
import 'package:flutter/material.dart' hide Border, BorderStyle;
|
||||
|
||||
class ExcelExportService {
|
||||
static Future<void> generateAndPrintBoxScoreExcel({
|
||||
required String gameId,
|
||||
required String myTeam,
|
||||
required String opponentTeam,
|
||||
required String myScore,
|
||||
required String opponentScore,
|
||||
required String season,
|
||||
required String targetTeam,
|
||||
}) async {
|
||||
try {
|
||||
final supabase = Supabase.instance.client;
|
||||
|
||||
// ── 1. DADOS DO JOGO ───────────────────────────────────────────────────
|
||||
final gameData = await supabase.from('games').select().eq('id', gameId).maybeSingle();
|
||||
String dateStr = "---";
|
||||
if (gameData != null && gameData['game_date'] != null) {
|
||||
String rawDate = gameData['game_date'].toString();
|
||||
dateStr = rawDate.length >= 10 ? rawDate.substring(0, 10) : rawDate;
|
||||
}
|
||||
|
||||
// ── 2. ESTATÍSTICAS DOS JOGADORES ──────────────────────────────────────
|
||||
final statsResponse = await supabase.from('player_stats').select().eq('game_id', gameId);
|
||||
if (statsResponse.isEmpty) return;
|
||||
|
||||
// ── 3. NOMES E NÚMEROS DAS EQUIPAS E JOGADORES ───────────────────────
|
||||
final membersResponse = await supabase.from('members').select('id, name, number');
|
||||
final Map<String, Map<String, dynamic>> memberInfo = {
|
||||
for (var m in membersResponse) m['id'].toString(): m
|
||||
};
|
||||
|
||||
final teamsResponse = await supabase.from('teams').select('id, name');
|
||||
final Map<String, String> teamNames = {
|
||||
for (var t in teamsResponse) t['id'].toString(): t['name'].toString()
|
||||
};
|
||||
|
||||
// ── 4. CONFIGURAÇÃO DO EXCEL ───────────────────────────────────────────
|
||||
var excel = Excel.createExcel();
|
||||
String sheetName = 'Estatísticas';
|
||||
Sheet sheet = excel[sheetName];
|
||||
excel.setDefaultSheet(sheetName);
|
||||
if (excel.tables.keys.contains('Sheet1')) excel.delete('Sheet1');
|
||||
|
||||
// ── ESTILOS E CORES PREMIUM ───────────────────────────────────────────
|
||||
final corPrincipal = ExcelColor.fromHexString('#A00000'); // Vermelho escuro
|
||||
final corFundoCinza = ExcelColor.fromHexString('#F5F5F5');
|
||||
final corFundoCinzaEscuro = ExcelColor.fromHexString('#E0E0E0');
|
||||
final cor2P = ExcelColor.fromHexString('#E3F2FD'); // Azul claro
|
||||
final cor3P = ExcelColor.fromHexString('#E8F5E9'); // Verde claro
|
||||
final corGlobal = ExcelColor.fromHexString('#FFF9C4');// Amarelo claro
|
||||
final corLL = ExcelColor.fromHexString('#FFF3E0'); // Laranja claro
|
||||
final corReb = ExcelColor.fromHexString('#F3E5F5'); // Roxo claro
|
||||
final borderGrey = ExcelColor.fromHexString('#BDBDBD');
|
||||
|
||||
CellStyle styleTituloJogo = CellStyle(bold: true, fontSize: 16);
|
||||
CellStyle styleNomeEquipa = CellStyle(bold: true, fontSize: 14, fontColorHex: ExcelColor.white, backgroundColorHex: corPrincipal, horizontalAlign: HorizontalAlign.Center, verticalAlign: VerticalAlign.Center);
|
||||
CellStyle styleTituloSecundario = CellStyle(bold: true, fontSize: 12, fontColorHex: ExcelColor.black, backgroundColorHex: corFundoCinzaEscuro, horizontalAlign: HorizontalAlign.Center, verticalAlign: VerticalAlign.Center);
|
||||
|
||||
CellStyle styleGrelha(ExcelColor bgCol, {bool isBold = false}) {
|
||||
return CellStyle(
|
||||
bold: isBold, backgroundColorHex: bgCol,
|
||||
horizontalAlign: HorizontalAlign.Center, verticalAlign: VerticalAlign.Center,
|
||||
leftBorder: Border(borderStyle: BorderStyle.Thin, borderColorHex: borderGrey),
|
||||
rightBorder: Border(borderStyle: BorderStyle.Thin, borderColorHex: borderGrey),
|
||||
topBorder: Border(borderStyle: BorderStyle.Thin, borderColorHex: borderGrey),
|
||||
bottomBorder: Border(borderStyle: BorderStyle.Thin, borderColorHex: borderGrey),
|
||||
);
|
||||
}
|
||||
|
||||
final styleGeral = styleGrelha(ExcelColor.white);
|
||||
final styleGeralBold = styleGrelha(ExcelColor.white, isBold: true);
|
||||
final styleNome = CellStyle(horizontalAlign: HorizontalAlign.Left, verticalAlign: VerticalAlign.Center, leftBorder: Border(borderStyle: BorderStyle.Thin, borderColorHex: borderGrey), rightBorder: Border(borderStyle: BorderStyle.Thin, borderColorHex: borderGrey), topBorder: Border(borderStyle: BorderStyle.Thin, borderColorHex: borderGrey), bottomBorder: Border(borderStyle: BorderStyle.Thin, borderColorHex: borderGrey));
|
||||
|
||||
// ── CABEÇALHO DO JOGO ────────────────────────────────────────────────
|
||||
sheet.cell(CellIndex.indexByString("A1")).value = TextCellValue("JOGO:");
|
||||
sheet.cell(CellIndex.indexByString("A1")).cellStyle = CellStyle(bold: true);
|
||||
sheet.cell(CellIndex.indexByString("B1")).value = TextCellValue("$myTeam vs $opponentTeam");
|
||||
sheet.cell(CellIndex.indexByString("B1")).cellStyle = styleTituloJogo;
|
||||
|
||||
sheet.cell(CellIndex.indexByString("A2")).value = TextCellValue("COMPETIÇÃO:");
|
||||
sheet.cell(CellIndex.indexByString("A2")).cellStyle = CellStyle(bold: true);
|
||||
sheet.cell(CellIndex.indexByString("B2")).value = TextCellValue(season);
|
||||
|
||||
sheet.cell(CellIndex.indexByString("A3")).value = TextCellValue("DATA:");
|
||||
sheet.cell(CellIndex.indexByString("A3")).cellStyle = CellStyle(bold: true);
|
||||
sheet.cell(CellIndex.indexByString("B3")).value = TextCellValue(dateStr);
|
||||
|
||||
sheet.cell(CellIndex.indexByString("A4")).value = TextCellValue("RESULTADO:");
|
||||
sheet.cell(CellIndex.indexByString("A4")).cellStyle = CellStyle(bold: true);
|
||||
sheet.cell(CellIndex.indexByString("B4")).value = TextCellValue("$myScore - $opponentScore");
|
||||
sheet.cell(CellIndex.indexByString("B4")).cellStyle = CellStyle(bold: true, fontColorHex: corPrincipal);
|
||||
|
||||
// ── TOTAIS POR PERÍODO (NOVA SECÇÃO) ─────────────────────────────────
|
||||
sheet.cell(CellIndex.indexByString("A6")).value = TextCellValue("PONTUAÇÃO POR PERÍODO");
|
||||
sheet.cell(CellIndex.indexByString("A6")).cellStyle = CellStyle(bold: true, fontColorHex: corPrincipal);
|
||||
|
||||
List<String> periodHeaders = ["EQUIPA", "1º Q", "2º Q", "3º Q", "4º Q", "TOTAL"];
|
||||
for (int i = 0; i < periodHeaders.length; i++) {
|
||||
var cell = sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: 6));
|
||||
cell.value = TextCellValue(periodHeaders[i]);
|
||||
cell.cellStyle = styleGrelha(corFundoCinza, isBold: true);
|
||||
}
|
||||
|
||||
// Linha Minha Equipa
|
||||
List<dynamic> myRow = [
|
||||
myTeam,
|
||||
gameData?['my_q1']?.toString() ?? '-',
|
||||
gameData?['my_q2']?.toString() ?? '-',
|
||||
gameData?['my_q3']?.toString() ?? '-',
|
||||
gameData?['my_q4']?.toString() ?? '-',
|
||||
myScore
|
||||
];
|
||||
for (int i = 0; i < myRow.length; i++) {
|
||||
var cell = sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: 7));
|
||||
cell.value = TextCellValue(myRow[i].toString());
|
||||
cell.cellStyle = i == 0 ? styleNome : styleGeralBold;
|
||||
}
|
||||
|
||||
// Linha Adversário
|
||||
List<dynamic> oppRow = [
|
||||
opponentTeam,
|
||||
gameData?['opp_q1']?.toString() ?? '-',
|
||||
gameData?['opp_q2']?.toString() ?? '-',
|
||||
gameData?['opp_q3']?.toString() ?? '-',
|
||||
gameData?['opp_q4']?.toString() ?? '-',
|
||||
opponentScore
|
||||
];
|
||||
for (int i = 0; i < oppRow.length; i++) {
|
||||
var cell = sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: 8));
|
||||
cell.value = TextCellValue(oppRow[i].toString());
|
||||
cell.cellStyle = i == 0 ? styleNome : styleGeralBold;
|
||||
}
|
||||
|
||||
int r = 11; // 👈 AS TABELAS PRINCIPAIS AGORA COMEÇAM MAIS ABAIXO (Linha 12 no Excel)
|
||||
|
||||
// Agrupar estatísticas por equipa
|
||||
Map<String, List<dynamic>> statsByTeam = {};
|
||||
for(var s in statsResponse) {
|
||||
String tId = s['team_id'].toString();
|
||||
statsByTeam.putIfAbsent(tId, () => []).add(s);
|
||||
}
|
||||
|
||||
// ── CONSTRUÇÃO DAS TABELAS DE CADA EQUIPA ────────────────────────────
|
||||
for (var entry in statsByTeam.entries) {
|
||||
String tId = entry.key;
|
||||
List<dynamic> tStats = entry.value;
|
||||
String tName = teamNames[tId] ?? "Equipa $tId";
|
||||
|
||||
if (targetTeam != 'Ambas' && tName != targetTeam) continue;
|
||||
|
||||
tStats.sort((a, b) {
|
||||
var mInfoA = memberInfo[a['member_id'].toString()];
|
||||
var mInfoB = memberInfo[b['member_id'].toString()];
|
||||
int numA = int.tryParse(mInfoA?['number']?.toString() ?? '0') ?? 0;
|
||||
int numB = int.tryParse(mInfoB?['number']?.toString() ?? '0') ?? 0;
|
||||
return numA.compareTo(numB);
|
||||
});
|
||||
|
||||
List<Map<String, dynamic>> processedPlayers = [];
|
||||
int tMin=0, tPts=0, t2m=0, t2a=0, t3m=0, t3a=0, tFgm=0, tFga=0, tftm=0, tfta=0;
|
||||
int torb=0, tdrb=0, tStl=0, tAst=0, tTov=0, tBlk=0, tFls=0;
|
||||
int tSo=0, tIl=0, tLi=0, tPa=0, tTresS=0, tDr=0;
|
||||
|
||||
for(var stat in tStats) {
|
||||
var mInfo = memberInfo[stat['member_id'].toString()];
|
||||
String pNum = mInfo != null ? (mInfo['number']?.toString() ?? "-") : "-";
|
||||
String pName = mInfo != null ? (mInfo['name']?.toString() ?? "Desconhecido") : "Desconhecido";
|
||||
|
||||
int minSecs = stat['minutos_jogados'] ?? 0;
|
||||
int pts = stat['pts'] ?? 0;
|
||||
int p2m = stat['p2m'] ?? 0; int p2a = stat['p2a'] ?? 0;
|
||||
int p3m = stat['p3m'] ?? 0; int p3a = stat['p3a'] ?? 0;
|
||||
int fgm = stat['fgm'] ?? 0; int fga = stat['fga'] ?? 0;
|
||||
int ftm = stat['ftm'] ?? 0; int fta = stat['fta'] ?? 0;
|
||||
int orb = stat['orb'] ?? 0; int drb = stat['drb'] ?? 0; int tr = orb + drb;
|
||||
int stl = stat['stl'] ?? 0; int ast = stat['ast'] ?? 0;
|
||||
int tov = stat['tov'] ?? 0; int blk = stat['blk'] ?? 0; int fls = stat['fls'] ?? 0;
|
||||
int so = stat['so'] ?? 0; int il = stat['il'] ?? 0; int li = stat['li'] ?? 0;
|
||||
int pa = stat['pa'] ?? 0; int tresS = stat['tres_seg'] ?? 0; int dr = stat['dr'] ?? 0;
|
||||
|
||||
tMin+=minSecs; tPts+=pts; t2m+=p2m; t2a+=p2a; t3m+=p3m; t3a+=p3a;
|
||||
tFgm+=fgm; tFga+=fga; tftm+=ftm; tfta+=fta; torb+=orb; tdrb+=drb;
|
||||
tStl+=stl; tAst+=ast; tTov+=tov; tBlk+=blk; tFls+=fls;
|
||||
tSo+=so; tIl+=il; tLi+=li; tPa+=pa; tTresS+=tresS; tDr+=dr;
|
||||
|
||||
processedPlayers.add({
|
||||
'num': pNum, 'name': pName, 'minSecs': minSecs, 'pts': pts,
|
||||
'p2m': p2m, 'p2a': p2a, 'p3m': p3m, 'p3a': p3a, 'fgm': fgm, 'fga': fga,
|
||||
'ftm': ftm, 'fta': fta, 'orb': orb, 'drb': drb, 'tr': tr,
|
||||
'stl': stl, 'ast': ast, 'tov': tov, 'blk': blk, 'fls': fls,
|
||||
'so': so, 'il': il, 'li': li, 'pa': pa, '3s': tresS, 'dr': dr
|
||||
});
|
||||
}
|
||||
|
||||
// TABELA 1: LANÇAMENTOS E RESSALTOS
|
||||
var teamStart = CellIndex.indexByColumnRow(columnIndex: 0, rowIndex: r);
|
||||
var teamEnd = CellIndex.indexByColumnRow(columnIndex: 18, rowIndex: r);
|
||||
sheet.merge(teamStart, teamEnd, customValue: TextCellValue("ESTATÍSTICAS DA EQUIPA: ${tName.toUpperCase()} (Lançamentos e Ressaltos)"));
|
||||
for(int i=0; i<=18; i++) sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: r)).cellStyle = styleNomeEquipa;
|
||||
r++;
|
||||
|
||||
void criarCategoria(int colStart, int colEnd, String texto, CellStyle estilo) {
|
||||
sheet.merge(CellIndex.indexByColumnRow(columnIndex: colStart, rowIndex: r), CellIndex.indexByColumnRow(columnIndex: colEnd, rowIndex: r), customValue: TextCellValue(texto));
|
||||
for(int i=colStart; i<=colEnd; i++) sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: r)).cellStyle = estilo;
|
||||
}
|
||||
|
||||
for(int i=0; i<=3; i++) sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: r)).cellStyle = styleGrelha(corFundoCinza);
|
||||
criarCategoria(4, 6, "2 PONTOS", styleGrelha(cor2P, isBold: true));
|
||||
criarCategoria(7, 9, "3 PONTOS", styleGrelha(cor3P, isBold: true));
|
||||
criarCategoria(10, 12, "GLOBAL", styleGrelha(corGlobal, isBold: true));
|
||||
criarCategoria(13, 15, "L. LIVRES", styleGrelha(corLL, isBold: true));
|
||||
criarCategoria(16, 18, "RESSALTOS", styleGrelha(corReb, isBold: true));
|
||||
r++;
|
||||
|
||||
List<String> colsT1 = ["Nº", "NOME", "MIN", "PTS", "C", "T", "%", "C", "T", "%", "C", "T", "%", "C", "T", "%", "RO", "RD", "TR"];
|
||||
for(int i = 0; i < colsT1.length; i++) {
|
||||
var cell = sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: r));
|
||||
cell.value = TextCellValue(colsT1[i]);
|
||||
|
||||
if (i >= 4 && i <= 6) cell.cellStyle = styleGrelha(cor2P, isBold: true);
|
||||
else if (i >= 7 && i <= 9) cell.cellStyle = styleGrelha(cor3P, isBold: true);
|
||||
else if (i >= 10 && i <= 12) cell.cellStyle = styleGrelha(corGlobal, isBold: true);
|
||||
else if (i >= 13 && i <= 15) cell.cellStyle = styleGrelha(corLL, isBold: true);
|
||||
else if (i >= 16 && i <= 18) cell.cellStyle = styleGrelha(corReb, isBold: true);
|
||||
else cell.cellStyle = styleGrelha(corFundoCinza, isBold: true);
|
||||
}
|
||||
r++;
|
||||
|
||||
for(var p in processedPlayers) {
|
||||
String minStr = '${p['minSecs'] ~/ 60}:${(p['minSecs'] % 60).toString().padLeft(2, '0')}';
|
||||
String p2Pct = p['p2a'] > 0 ? '${((p['p2m'] / p['p2a']) * 100).toStringAsFixed(0)}%' : '-';
|
||||
String p3Pct = p['p3a'] > 0 ? '${((p['p3m'] / p['p3a']) * 100).toStringAsFixed(0)}%' : '-';
|
||||
String fgPct = p['fga'] > 0 ? '${((p['fgm'] / p['fga']) * 100).toStringAsFixed(0)}%' : '-';
|
||||
String ftPct = p['fta'] > 0 ? '${((p['ftm'] / p['fta']) * 100).toStringAsFixed(0)}%' : '-';
|
||||
|
||||
List<CellValue> rowData = [
|
||||
TextCellValue(p['num']), TextCellValue(p['name']), TextCellValue(minStr), IntCellValue(p['pts']),
|
||||
IntCellValue(p['p2m']), IntCellValue(p['p2a']), TextCellValue(p2Pct),
|
||||
IntCellValue(p['p3m']), IntCellValue(p['p3a']), TextCellValue(p3Pct),
|
||||
IntCellValue(p['fgm']), IntCellValue(p['fga']), TextCellValue(fgPct),
|
||||
IntCellValue(p['ftm']), IntCellValue(p['fta']), TextCellValue(ftPct),
|
||||
IntCellValue(p['orb']), IntCellValue(p['drb']), IntCellValue(p['tr'])
|
||||
];
|
||||
|
||||
for(int i = 0; i < rowData.length; i++) {
|
||||
var cell = sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: r));
|
||||
cell.value = rowData[i];
|
||||
if (i == 1) cell.cellStyle = styleNome;
|
||||
else if (i == 3) cell.cellStyle = styleGeralBold;
|
||||
else cell.cellStyle = styleGeral;
|
||||
}
|
||||
r++;
|
||||
}
|
||||
|
||||
String t2Pct = t2a > 0 ? '${((t2m / t2a) * 100).toStringAsFixed(0)}%' : '-';
|
||||
String t3Pct = t3a > 0 ? '${((t3m / t3a) * 100).toStringAsFixed(0)}%' : '-';
|
||||
String tFgPct = tFga > 0 ? '${((tFgm / tFga) * 100).toStringAsFixed(0)}%' : '-';
|
||||
String tftPct = tfta > 0 ? '${((tftm / tfta) * 100).toStringAsFixed(0)}%' : '-';
|
||||
String tMinStr = '${tMin ~/ 60}:${(tMin % 60).toString().padLeft(2, '0')}';
|
||||
|
||||
List<CellValue> totalRowT1 = [
|
||||
TextCellValue(""), TextCellValue("TOTAL EQUIPA"), TextCellValue(tMinStr), IntCellValue(tPts),
|
||||
IntCellValue(t2m), IntCellValue(t2a), TextCellValue(t2Pct),
|
||||
IntCellValue(t3m), IntCellValue(t3a), TextCellValue(t3Pct),
|
||||
IntCellValue(tFgm), IntCellValue(tFga), TextCellValue(tFgPct),
|
||||
IntCellValue(tftm), IntCellValue(tfta), TextCellValue(tftPct),
|
||||
IntCellValue(torb), IntCellValue(tdrb), IntCellValue(torb + tdrb)
|
||||
];
|
||||
|
||||
for(int i = 0; i < totalRowT1.length; i++) {
|
||||
var cell = sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: r));
|
||||
cell.value = totalRowT1[i];
|
||||
cell.cellStyle = styleGrelha(corFundoCinza, isBold: true);
|
||||
if (i >= 4 && i <= 6) cell.cellStyle = styleGrelha(cor2P, isBold: true);
|
||||
else if (i >= 7 && i <= 9) cell.cellStyle = styleGrelha(cor3P, isBold: true);
|
||||
else if (i >= 10 && i <= 12) cell.cellStyle = styleGrelha(corGlobal, isBold: true);
|
||||
else if (i >= 13 && i <= 15) cell.cellStyle = styleGrelha(corLL, isBold: true);
|
||||
else if (i >= 16 && i <= 18) cell.cellStyle = styleGrelha(corReb, isBold: true);
|
||||
}
|
||||
r += 3;
|
||||
|
||||
// TABELA 2: OUTRAS ESTATÍSTICAS
|
||||
var secStart = CellIndex.indexByColumnRow(columnIndex: 0, rowIndex: r);
|
||||
var secEnd = CellIndex.indexByColumnRow(columnIndex: 12, rowIndex: r);
|
||||
sheet.merge(secStart, secEnd, customValue: TextCellValue("OUTRAS ESTATÍSTICAS: ${tName.toUpperCase()}"));
|
||||
for(int i=0; i<=12; i++) sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: r)).cellStyle = styleTituloSecundario;
|
||||
r++;
|
||||
|
||||
List<String> colsT2 = ["Nº", "NOME", "BR", "AS", "BP", "BLK", "FLS", "SO", "IL", "LI", "PA", "3S", "DR"];
|
||||
for(int i = 0; i < colsT2.length; i++) {
|
||||
var cell = sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: r));
|
||||
cell.value = TextCellValue(colsT2[i]);
|
||||
cell.cellStyle = styleGrelha(corFundoCinza, isBold: true);
|
||||
}
|
||||
r++;
|
||||
|
||||
for(var p in processedPlayers) {
|
||||
List<CellValue> rowData2 = [
|
||||
TextCellValue(p['num']), TextCellValue(p['name']),
|
||||
IntCellValue(p['stl']), IntCellValue(p['ast']), IntCellValue(p['tov']),
|
||||
IntCellValue(p['blk']), IntCellValue(p['fls']), IntCellValue(p['so']),
|
||||
IntCellValue(p['il']), IntCellValue(p['li']), IntCellValue(p['pa']),
|
||||
IntCellValue(p['3s']), IntCellValue(p['dr'])
|
||||
];
|
||||
for(int i = 0; i < rowData2.length; i++) {
|
||||
var cell = sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: r));
|
||||
cell.value = rowData2[i];
|
||||
cell.cellStyle = (i == 1) ? styleNome : styleGeral;
|
||||
}
|
||||
r++;
|
||||
}
|
||||
|
||||
List<CellValue> totalRowT2 = [
|
||||
TextCellValue(""), TextCellValue("TOTAL EQUIPA"),
|
||||
IntCellValue(tStl), IntCellValue(tAst), IntCellValue(tTov), IntCellValue(tBlk), IntCellValue(tFls),
|
||||
IntCellValue(tSo), IntCellValue(tIl), IntCellValue(tLi), IntCellValue(tPa), IntCellValue(tTresS), IntCellValue(tDr)
|
||||
];
|
||||
for(int i = 0; i < totalRowT2.length; i++) {
|
||||
var cell = sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: r));
|
||||
cell.value = totalRowT2[i];
|
||||
cell.cellStyle = styleGrelha(corFundoCinza, isBold: true);
|
||||
}
|
||||
r += 4;
|
||||
}
|
||||
|
||||
// ── DESTAQUES DO JOGO ───────────────────────────────────────
|
||||
if (gameData != null) {
|
||||
var startD = CellIndex.indexByColumnRow(columnIndex: 0, rowIndex: r);
|
||||
var endD = CellIndex.indexByColumnRow(columnIndex: 3, rowIndex: r);
|
||||
sheet.merge(startD, endD, customValue: TextCellValue("DESTAQUES DO JOGO"));
|
||||
for(int i=0; i<=3; i++) sheet.cell(CellIndex.indexByColumnRow(columnIndex: i, rowIndex: r)).cellStyle = styleNomeEquipa;
|
||||
r++;
|
||||
|
||||
void adicionarDestaque(String titulo, String valor) {
|
||||
sheet.cell(CellIndex.indexByColumnRow(columnIndex: 0, rowIndex: r)).value = TextCellValue(titulo);
|
||||
sheet.cell(CellIndex.indexByColumnRow(columnIndex: 0, rowIndex: r)).cellStyle = CellStyle(bold: true);
|
||||
var sV = CellIndex.indexByColumnRow(columnIndex: 1, rowIndex: r);
|
||||
var eV = CellIndex.indexByColumnRow(columnIndex: 3, rowIndex: r);
|
||||
sheet.merge(sV, eV, customValue: TextCellValue(valor));
|
||||
r++;
|
||||
}
|
||||
|
||||
adicionarDestaque("Melhor Marcador:", gameData['top_pts_name'] ?? '---');
|
||||
adicionarDestaque("Melhor Ressaltador:", gameData['top_rbs_name'] ?? '---');
|
||||
adicionarDestaque("Melhor Passador:", gameData['top_ast_name'] ?? '---');
|
||||
adicionarDestaque("MVP da Partida:", gameData['mvp_name'] ?? '---');
|
||||
}
|
||||
|
||||
sheet.setColumnWidth(0, 18.0);
|
||||
sheet.setColumnWidth(1, 26.0);
|
||||
sheet.setColumnWidth(2, 8.0);
|
||||
sheet.setColumnWidth(3, 6.0);
|
||||
for(int i=4; i<=18; i++) sheet.setColumnWidth(i, 5.5);
|
||||
|
||||
var fileBytes = excel.save();
|
||||
if (fileBytes != null) {
|
||||
final directory = await getTemporaryDirectory();
|
||||
String safeName = targetTeam == 'Ambas' ? '${myTeam}_vs_${opponentTeam}'.replaceAll(' ', '_') : targetTeam.replaceAll(' ', '_');
|
||||
final filePath = '${directory.path}/BoxScore_$safeName.xlsx';
|
||||
|
||||
File(filePath)..createSync(recursive: true)..writeAsBytesSync(fileBytes);
|
||||
await Share.shareXFiles([XFile(filePath)], text: 'Estatísticas do Jogo: $myTeam vs $opponentTeam');
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('Erro ao gerar Excel: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user