Отличная идея! Веб-решение значительно упростит работу. Вот готовые инструменты и подходы:
Готовые решения (быстрый старт)
1. Ragic (самый простой)
- Готовый конструктор баз данных в вебе
- Импорт из Excel/CSV
- Формулы, связи между таблицами
- Бесплатно до 10 пользователей
2. Airtable
- Гибрид Excel и базы данных
- Простой интерфейс
- Мощные возможности
- Есть бесплатный тариф
3. Google Sheets + Apps Script
- Знакомый интерфейс
- Автоматизация через скрипты
- Совместный доступ
- Бесплатно
Самописное решение на PHP (полный контроль)
Быстрый старт:
php
<?php
// index.php - главная страница
if ($_FILES['csv_file']) {
$data = process_csv($_FILES['csv_file']['tmp_name']);
$_SESSION['report_data'] = $data;
header('Location: report.php');
}
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="csv_file" accept=".csv">
<button>Загрузить</button>
</form>
Обработка CSV:
php
function process_csv($file_path) {
$data = [];
if (($handle = fopen($file_path, "r")) !== FALSE) {
while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
$data[] = $row;
}
fclose($handle);
}
return $data;
}
Готовые библиотеки для PHP
Для работы с Excel:
- PhpSpreadsheet - чтение/запись Excel файлов
- League\Csv - работа с CSV
- SimpleXLSX - легкая библиотека для XLSX
Установка через Composer:
bash
composer require phpoffice/phpspreadsheet
composer require league/csv
Пример готового решения
Структура проекта:
text
/reports-app
├── index.php # Загрузка файлов
├── upload.php # Обработка загрузки
├── report.php # Просмотр отчета
├── export.php # Экспорт в Excel
└── config.php # Настройки
index.php (главная
php
<!DOCTYPE html>
<html>
<head>
<title>Система отчетов</title>
<link href="
Для просмотра ссылки Войди или Зарегистрируйся" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h2>Загрузка данных для отчета</h2>
<form action="upload.php" method="post" enctype="multipart/form-data" class="mb-4">
<div class="mb-3">
<label class="form-label">Выберите CSV файл:</label>
<input type="file" name="data_file" class="form-control" accept=".csv" required>
</div>
<button type="submit" class="btn btn-primary">Загрузить и обработать</button>
</form>
<?php if (isset($_SESSION['reports'])

?>
<h3>Доступные отчеты:</h3>
<ul>
<?php foreach($_SESSION['reports'] as $report

?>
<li><a href="report.php?id=<?= $report['id'] ?>"><?= $report['name'] ?></a></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>
</body>
</html>
upload.php (обработчик
php
<?php
session_start();
require_once 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\IOFactory;
if ($_FILES['data_file']) {
$file = $_FILES['data_file']['tmp_name'];
$file_type = pathinfo($_FILES['data_file']['name'], PATHINFO_EXTENSION);
try {
if ($file_type === 'csv') {
$data = processCsv($file);
} elseif (in_array($file_type, ['xlsx', 'xls'])) {
$data = processExcel($file);
}
// Сохраняем в сессию
$report_id = uniqid();
$_SESSION['reports'][$report_id] = [
'id' => $report_id,
'name' => $_FILES['data_file']['name'],
'data' => $data,
'created' => date('Y-m-d H:i:s')
];
header("Location: report.php?id=$report_id");
exit;
} catch (Exception $e) {
die("Ошибка обработки файла: " . $e->getMessage());
}
}
function processCsv($file) {
$data = [];
if (($handle = fopen($file, "r")) !== FALSE) {
while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
$data[] = $row;
}
fclose($handle);
}
return $data;
}
function processExcel($file) {
$spreadsheet = IOFactory::load($file);
$worksheet = $spreadsheet->getActiveSheet();
$data = [];
foreach ($worksheet->getRowIterator() as $row) {
$rowData = [];
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(FALSE);
foreach ($cellIterator as $cell) {
$rowData[] = $cell->getCalculatedValue();
}
$data[] = $rowData;
}
return $data;
}
?>