function handleFile(event) { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = async (e) => { const data = new Uint8Array(e.target.result); const wb = XLSX.read(data, {type:'array'}); const sheet = wb.Sheets[wb.SheetNames[0]]; // Читаем как массив массивов (header: 1), чтобы игнорировать отсутствие заголовков const rows = XLSX.utils.sheet_to_json(sheet, {header: 1}); if(rows.length === 0) return alert("Файл пуст"); document.getElementById('progress-container').style.display = 'block'; document.getElementById('btnLoad').disabled = true; // Начинаем с 0 строки, так как заголовков нет for(let i=0; i < rows.length; i++) { const row = rows[i]; // Берем данные по позиции: 0 - имя, 1 - адрес const n = row[0] || "Без имени"; const a = row[1]; if(a && a.length > 5) { const coords = await getCoords(a.toString()); if(coords) { clients.push({name: n, addr: a, lat: coords.lat, lon: coords.lon}); updateUI(); } } const p = Math.round(((i+1)/rows.length)*100); document.getElementById('progress-bar').style.width = p + '%'; document.getElementById('prog-text').innerText = `Загружаем: ${p}% (${i+1} из ${rows.length})`; } document.getElementById('progress-container').style.display = 'none'; document.getElementById('btnLoad').disabled = false; alert("Готово! Все точки из Липецка на карте."); }; reader.readAsArrayBuffer(file); }