diff --git a/Controllers/LinesController.cs b/Controllers/LinesController.cs index 7010399..5c3c3df 100644 --- a/Controllers/LinesController.cs +++ b/Controllers/LinesController.cs @@ -1360,45 +1360,60 @@ namespace line_gestao_api.Controllers for (int i = 0; i < headers.Count; i++) { var headerRow = headers[i]; - var map = BuildHeaderMap(headerRow); - int colItem = GetCol(map, "ITEM"); - if (colItem == 0) continue; + var itemColumns = headerRow.CellsUsed() + .Where(c => NormalizeHeader(c.GetString()) == "ITEM") + .Select(c => c.Address.ColumnNumber) + .OrderBy(c => c) + .ToList(); + if (itemColumns.Count == 0) continue; var startRow = headerRow.RowNumber() + 1; var endRow = i + 1 < headers.Count ? headers[i + 1].RowNumber() - 1 : lastRow; - for (int r = startRow; r <= endRow; r++) + for (int tableIndex = 0; tableIndex < itemColumns.Count; tableIndex++) { - var itemStr = GetCellString(ws, r, colItem); - if (string.IsNullOrWhiteSpace(itemStr)) continue; + var startCol = itemColumns[tableIndex]; + var endCol = tableIndex + 1 < itemColumns.Count + ? itemColumns[tableIndex + 1] - 1 + : headerRow.LastCellUsed()?.Address.ColumnNumber ?? startCol; - var numeroChip = NullIfEmptyDigits(GetCellByHeaderAny(ws, r, map, - "Nº DO CHIP", "N° DO CHIP", "NUMERO DO CHIP", "N DO CHIP", "NUM. DO CHIP", "N° DO CHIP")); - var observacoes = GetCellByHeaderAny(ws, r, map, "OBSERVAÇÕES", "OBSERVACOES", "OBS"); - if (string.IsNullOrWhiteSpace(numeroChip) && string.IsNullOrWhiteSpace(observacoes)) + var map = BuildHeaderMapRange(headerRow, startCol, endCol); + int colItem = GetCol(map, "ITEM"); + if (colItem == 0) continue; + + for (int r = startRow; r <= endRow; r++) { - continue; - } + var itemStr = GetCellString(ws, r, colItem); + if (string.IsNullOrWhiteSpace(itemStr)) continue; - var now = DateTime.UtcNow; + var numeroChip = NullIfEmptyDigits(GetCellByHeaderAny(ws, r, map, + "Nº DO CHIP", "N° DO CHIP", "NUMERO DO CHIP", "N DO CHIP", "NUM. DO CHIP")); + var observacoes = GetCellByHeaderAny(ws, r, map, "OBSERVAÇÕES", "OBSERVACOES", "OBS"); + if (string.IsNullOrWhiteSpace(numeroChip) && string.IsNullOrWhiteSpace(observacoes)) + { + continue; + } - var e = new ChipVirgemLine - { - Id = Guid.NewGuid(), - Item = TryInt(itemStr), - NumeroDoChip = numeroChip, - Observacoes = string.IsNullOrWhiteSpace(observacoes) ? null : observacoes.Trim(), - CreatedAt = now, - UpdatedAt = now - }; + var now = DateTime.UtcNow; - buffer.Add(e); + var e = new ChipVirgemLine + { + Id = Guid.NewGuid(), + Item = TryInt(itemStr), + NumeroDoChip = numeroChip, + Observacoes = string.IsNullOrWhiteSpace(observacoes) ? null : observacoes.Trim(), + CreatedAt = now, + UpdatedAt = now + }; - if (buffer.Count >= 500) - { - await _db.ChipVirgemLines.AddRangeAsync(buffer); - await _db.SaveChangesAsync(); - buffer.Clear(); + buffer.Add(e); + + if (buffer.Count >= 500) + { + await _db.ChipVirgemLines.AddRangeAsync(buffer); + await _db.SaveChangesAsync(); + buffer.Clear(); + } } } } @@ -1632,6 +1647,21 @@ namespace line_gestao_api.Controllers return map; } + private static Dictionary BuildHeaderMapRange(IXLRow headerRow, int startCol, int endCol) + { + var map = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var cell in headerRow.CellsUsed()) + { + var col = cell.Address.ColumnNumber; + if (col < startCol || col > endCol) continue; + + var k = NormalizeHeader(cell.GetString()); + if (!string.IsNullOrWhiteSpace(k) && !map.ContainsKey(k)) + map[k] = col; + } + return map; + } + private static DateTime? ToUtc(DateTime? dt) { if (dt == null) return null;