Время на прочтение
6 мин
Количество просмотров 105K
Введение
Здравствуй, $habrauser!
Бывает так, что вам нужно импортировать файл Excel в базу MySQL, но готового решения нигде нет. Вот и я, когда меня попросил друг поискать легкий способ импорта, сперва решил
загуглить
поискать решение. Увы, запрос php excel to mysql не дал ничего конкретного, или же описанные способы были довольно таки не удобны. Тогда же я решил найти библиотеку для работы с Excel на PHP, и мне попалась PHPExcel. Но опять же меня ждало разочарование, запрос phpexcel to mysql не дал ничего путного (я ленивый пользователь и дальше 1й страницы не хожу). В итоге я решил создать свой
велосипед
скрипт, которым и хочу поделиться с вами.
Начало
Итак, библиотеку я нашел, скачал и начал разбираться. Для начала нужно было подключить библиотеку и создать подключение к базе, что совсем не сложно:
require_once "PHPExcel.php";
$connection = new mysqli("localhost", "user", "pass", "base");
$connection->set_charset("utf8");
Далее нужно открыть файл Excel для чтения:
$PHPExcel_file = PHPExcel_IOFactory::load("./file.xlsx");
После открытия файла, нам нужно перебрать все листы в нем и каждый добавить в базу MySQL (можно и 1 конкретный, но об этом позже):
foreach ($PHPExcel_file->getWorksheetIterator() as $worksheet) {
// ...
}
Ну а теперь самое интересное…
Перебор и добавление
Мы будем исходить из того, что таблицы у нас нет (или есть, но с другими данными) и ее нужно создать. Для этого нам нужно получить имена для столбцов (в соответствии с просьбой друга, имена могут находиться в 1 строчке таблицы):
// Строка для названий столбцов таблицы MySQL
$columns_str = "";
// Количество столбцов на листе Excel
$columns_count = PHPExcel_Cell::columnIndexFromString($worksheet->getHighestColumn());
// Перебираем столбцы листа Excel и генерируем строку с именами через запятую
for ($column = 0; $column < $columns_count; $column++) {
$columns_str .= ($columns_name_on1line ? "column" . $column : $worksheet->getCellByColumnAndRow($column, 1)->getCalculatedValue()) . ",";
}
// Обрезаем строку, убирая запятую в конце
$columns_str = substr($columns_str, 0, -1);
Далее удаляем таблицу из базы, если она существовала, и создаем новую:
$connection->query("DROP TABLE IF EXISTS exceltable");
$connection->query("CREATE TABLE exceltable (" . str_replace(",", " TEXT NOT NULL,", $columns_str) . " TEXT NOT NULL)");
Как видно из кода, значения будут иметь тип TEXT. Теперь приступаем собственно к перебору ячеек и добавления их в базу. Конечно, такой алгоритм не сложно найти на просторах Stack Overflow, однако было замечено, что происходить ошибка при попытки чтения объединенных ячеек (точнее несоответствие количества столбцов и значений в запросе). Это я и решил учесть:
// Количество строк на листе Excel
$rows_count = $worksheet->getHighestRow();
// Перебираем строки листа Excel
for ($row = 1; $row <= $rows_count; $row++) {
// Строка со значениями всех столбцов в строке листа Excel
$value_str = "";
// Перебираем столбцы листа Excel
for ($column = 0; $column < $columns_count; $column++) {
// Строка со значением объединенных ячеек листа Excel
$merged_value = "";
// Ячейка листа Excel
$cell = $worksheet->getCellByColumnAndRow($column, $row);
// Перебираем массив объединенных ячеек листа Excel
foreach ($worksheet->getMergeCells() as $mergedCells) {
// Если текущая ячейка - объединенная,
if ($cell->isInRange($mergedCells)) {
// то вычисляем значение первой объединенной ячейки, и используем её в качестве значения
// текущей ячейки
$merged_value = $worksheet->getCell(explode(":", $mergedCells)[0])->getCalculatedValue();
break;
}
}
// Проверяем, что ячейка не объединенная: если нет, то берем ее значение, иначе значение первой
// объединенной ячейки
$value_str .= "'" . (strlen($merged_value) == 0 ? $cell->getCalculatedValue() : $merged_value) . "',";
}
// Обрезаем строку, убирая запятую в конце
$value_str = substr($value_str, 0, -1);
// Добавляем строку в таблицу MySQL
$connection->query("INSERT INTO exceltable (" . $columns_str . ") VALUES (" . $value_str . ")");
}
Все дело в функцию!
Конечно, данный скрипт был бы гораздо удобнее, если бы все объединить в функцию. Поэтому итоговый результат получается такой:
Функция excel2mysql
// Подключаем библиотеку
require_once "PHPExcel.php";
// Функция преобразования листа Excel в таблицу MySQL, с учетом объединенных строк и столбцов.
// Значения берутся уже вычисленными. Параметры:
// $worksheet - лист Excel
// $connection - соединение с MySQL (mysqli)
// $table_name - имя таблицы MySQL
// $columns_name_line - строка с именами столбцов таблицы MySQL (0 - имена типа column + n)
function excel2mysql($worksheet, $connection, $table_name, $columns_name_line = 0) {
// Проверяем соединение с MySQL
if (!$connection->connect_error) {
// Строка для названий столбцов таблицы MySQL
$columns_str = "";
// Количество столбцов на листе Excel
$columns_count = PHPExcel_Cell::columnIndexFromString($worksheet->getHighestColumn());
// Перебираем столбцы листа Excel и генерируем строку с именами через запятую
for ($column = 0; $column < $columns_count; $column++) {
$columns_str .= ($columns_name_line == 0 ? "column" . $column : $worksheet->getCellByColumnAndRow($column, $columns_name_line)->getCalculatedValue()) . ",";
}
// Обрезаем строку, убирая запятую в конце
$columns_str = substr($columns_str, 0, -1);
// Удаляем таблицу MySQL, если она существовала
if ($connection->query("DROP TABLE IF EXISTS " . $table_name)) {
// Создаем таблицу MySQL
if ($connection->query("CREATE TABLE " . $table_name . " (" . str_replace(",", " TEXT NOT NULL,", $columns_str) . " TEXT NOT NULL)")) {
// Количество строк на листе Excel
$rows_count = $worksheet->getHighestRow();
// Перебираем строки листа Excel
for ($row = $columns_name_line + 1; $row <= $rows_count; $row++) {
// Строка со значениями всех столбцов в строке листа Excel
$value_str = "";
// Перебираем столбцы листа Excel
for ($column = 0; $column < $columns_count; $column++) {
// Строка со значением объединенных ячеек листа Excel
$merged_value = "";
// Ячейка листа Excel
$cell = $worksheet->getCellByColumnAndRow($column, $row);
// Перебираем массив объединенных ячеек листа Excel
foreach ($worksheet->getMergeCells() as $mergedCells) {
// Если текущая ячейка - объединенная,
if ($cell->isInRange($mergedCells)) {
// то вычисляем значение первой объединенной ячейки, и используем её в качестве значения
// текущей ячейки
$merged_value = $worksheet->getCell(explode(":", $mergedCells)[0])->getCalculatedValue();
break;
}
}
// Проверяем, что ячейка не объединенная: если нет, то берем ее значение, иначе значение первой
// объединенной ячейки
$value_str .= "'" . (strlen($merged_value) == 0 ? $cell->getCalculatedValue() : $merged_value) . "',";
}
// Обрезаем строку, убирая запятую в конце
$value_str = substr($value_str, 0, -1);
// Добавляем строку в таблицу MySQL
$connection->query("INSERT INTO " . $table_name . " (" . $columns_str . ") VALUES (" . $value_str . ")");
}
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
return true;
}
// Соединение с базой MySQL
$connection = new mysqli("localhost", "user", "pass", "base");
// Выбираем кодировку UTF-8
$connection->set_charset("utf8");
// Загружаем файл Excel
$PHPExcel_file = PHPExcel_IOFactory::load("./file.xlsx");
// Преобразуем первый лист Excel в таблицу MySQL
$PHPExcel_file->setActiveSheetIndex(0);
echo excel2mysql($PHPExcel_file->getActiveSheet(), $connection, "excel2mysql0", 1) ? "OKn" : "FAILn";
// Перебираем все листы Excel и преобразуем в таблицу MySQL
foreach ($PHPExcel_file->getWorksheetIterator() as $index => $worksheet) {
echo excel2mysql($worksheet, $connection, "excel2mysql" . ($index != 0 ? $index : ""), 1) ? "OKn" : "FAILn";
}
Заключение
Что ж, надеюсь данная статья поможет вам. Ну, или, если вы захотите
изобрести свой велосипед, но только с моторчиком
написать свой скрипт, эта статья поможет вам начать.
P.S.
Это моя первая, и думаю, не последняя статья. Поэтому жду ваших советов и поправок, как тут принято, в комментариях.
Update
Вижу, все-таки, мне удалось создать небольшую дискуссию, но не все понимают, почему было сделано именно так. Постараюсь объяснить.
Во-первых: с этим должен был работать пожилой человек, которому будет трудновато объяснить как сохранить файл в CSV, при этом не потеряв данные (а такое исключать нельзя, к тому же у них свой формат на файл XLS, который приходит сверху) и, тем более, как это импортировать через phpMyAdmin (который, кстати, с версии 3.4.5 не поддерживает XLS/XLSX, советую посмотреть почему) или подобное. Так что это не подходит.
Во-вторых: все это должно быть расположено на хостинге, и установка модулей как на сервер, так и для локальных программ не подходит (к тому же там Linux, а не Windows, как некоторые подумали).
В-третьих: это дело проводится раз в полгода, однако от безделья я решил написать такую функцию, способную обобщить импорт (вдруг кому нужно).
Теперь о хорошем: переписал данную функцию в класс, исправил кое-что и добавил возможность экспорта из MySQL в Excel. Забрать можно отсюда.
Извините, что не ответил в комментариях, решил что в самой статье будет уместние.
I want to import data from excel file using PHP and then if possible, save it to a MySQL database.
morten.c
3,4125 gold badges40 silver badges45 bronze badges
asked Jan 14, 2010 at 19:32
Importing from Excel files (XLS) is way harder than improting from CSV files. Usually I save my XLS to CSV with Excel then work on this CSV with PHP…
Look at PHP function fgetcsv at:
http://ca.php.net/manual/en/function.fgetcsv.php
<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
echo "<p> $num fields in line $row: <br /></p>n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . "<br />n";
}
}
fclose($handle);
}
?>
If you still want to load XLS directly from PHP it’s possible (but how reliable)… A quick seach resulted in http://sourceforge.net/projects/phpexcelreader/ which might be helpful.
answered Jan 14, 2010 at 19:34
AlexVAlexV
22.5k17 gold badges87 silver badges122 bronze badges
1
Quite possible. You can save your Excel file as a CSV file, and use fgetcsv() to read that file in to PHP. fgetcsv()
will parse your data into an array, which you can then create SQL queries out of to put into your database.
If all you’re doing is putting it into a database, you might be able to bypass the need for a PHP script entirely and just use MySQL’s LOAD DATA INFILE
syntax on your CSV file instead:
LOAD DATA LOCAL INFILE '/importfile.csv'
INTO TABLE test_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY 'n'
(field1, filed2, field3);
answered Jan 14, 2010 at 19:36
zombatzombat
92.1k24 gold badges157 silver badges164 bronze badges
Best bet is to export from Excel to a CSV (Comma separated values) file. These files are easy to parse and load. If you are reading directly from an XLS file, I’m not sure how to do that. You might want to look and see if there is a libarary for PHP that can read Excel data files.
answered Jan 14, 2010 at 19:34
Here’s a tutorial on reading/writing an Excel spreadsheet directly (without having to export to CSV). The necessary packages are available from SourceForge and PEAR (cf. article).
answered Jan 14, 2010 at 19:42
AndiDogAndiDog
68k21 gold badges160 silver badges204 bronze badges
<?
i$db = mysql_connect(“localhost”, “root”, “”) or die(“Could not connect.”);
if(!$db)
die(“no db”);
if(!mysql_select_db(“test”,$db))
die(“No database selected.”);
if(isset($_POST['submit']))
{
$filename=$_POST['filename'];
$handle = fopen(“$filename”, “r”);
while (($data = fgetcsv($handle, 1000, “,”)) !== FALSE)
{
$import=”INSERT into sample(name,email) values(‘$data[0]‘,’$data[1]‘)”;
mysql_query($import) or die(mysql_error());
}
fclose($handle);
print “Import done”;
}
else
{
print “<form action=’import.php’ method=’post’>”;
print “Type file name to import:<br>”;
print “<input type=’text’ name=’filename’ size=’20′><br>”;
print “<input type=’submit’ name=’submit’ value=’submit’></form>”;
}
?>
Source
Matthieu
4,5854 gold badges40 silver badges59 bronze badges
answered Jan 21, 2011 at 11:18
Welcome to a tutorial on how to import an Excel Spreadsheet into a MySQL database with PHP. So you have a project that requires reading some data from a spreadsheet and save them into the database? Sadly, PHP cannot read Excel files natively.
In order to import Excel files into the database:
- We have to use a third-party library that can read Excel files. PHPSpreadsheet is a good recommendation, and we can get it easily using Composer –
composer require phpoffice/phpspreadsheet
- Create the database table, and Excel file to import.
- Use PHPSpreadsheet to read the Excel spreadsheet, extract the data, and insert them into the database.
Just how exactly is this done? Let us walk through an example in this guide – Read on!
ⓘ I have included a zip file with all the example source code at the start of this tutorial, so you don’t have to copy-paste everything… Or if you just want to dive straight in.
TLDR – QUICK SLIDES
Fullscreen Mode – Click Here
TABLE OF CONTENTS
DOWNLOAD & NOTES
First, here is the download link to the source code as promised.
QUICK NOTES
- A copy of PHPSpreadsheet is not included in the zip file. Please download the latest version by yourself.
- Create a test database and import
2a-dummy.sql
. - Change the database settings in
3-import.php
to your own, then launch it in the browser.
If you spot a bug, feel free to comment below. I try to answer short questions too, but it is one person versus the entire world… If you need answers urgently, please check out my list of websites to get help with programming.
EXAMPLE CODE DOWNLOAD
Click here to download the source code, I have released it under the MIT license, so feel free to build on top of it or use it in your own project.
All right, let us now get into an example of importing an Excel file into the database.
STEP 1) INSTALL PHPSPREADSHEET
There are no native functions in PHP to read Excel files. So we need to download and use a third-party library called PHPSpreadsheet – Here’s how to get it.
- The easiest way is to use an application manager called Composer – Something like Git, quite a useful one for pulling libraries automatically. A small hassle to download and install, but a one-time effort nonetheless.
- After installing Composer, open the command prompt and navigate to your project folder –
cd HTTP/FOLDER/
. - Run
composer require phpoffice/phpspreadsheet
.
That’s all. Composer will automatically pull the latest version into the vendor/
folder.
STEP 2) DUMMY DATABASE TABLE & EXCEL FILE
2A) DUMMY USERS TABLE
2a-dummy.sql
CREATE TABLE `users` (
`id` bigint(20) NOT NULL,
`name` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `users`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `email` (`email`);
ALTER TABLE `users`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
For this example, we will use a very simple users table with only 3 fields.
Field | Description |
id | Primary key, auto-increment. |
name | The user’s name. |
The user’s email address. |
2B) DUMMY EXCEL FILE
2b-dummy.xlsx
Name | |
John Doe | john@doe.com |
Jane Doe | jane@doe.com |
Josh Doe | josh@doe.com |
Joy Doe | joy@doe.com |
Janus Doe | janus@doe.com |
Jay Doe | jay@doe.com |
June Doe | june@doe.com |
Julius Doe | julius@doe.com |
Jess Doe | jess@doe.com |
Jack Doe | jack@doe.com |
Next, we have some dummy users in an Excel file that need to be imported into the above table.
STEP 3) PHP IMPORT SCRIPT
3-import.php
<?php
// (A) CONNECT TO DATABASE - CHANGE SETTINGS TO YOUR OWN!
$dbhost = "localhost";
$dbname = "test";
$dbchar = "utf8mb4";
$dbuser = "root";
$dbpass = "";
$pdo = new PDO(
"mysql:host=$dbhost;charset=$dbchar;dbname=$dbname",
$dbuser, $dbpass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
// (B) PHPSPREADSHEET TO LOAD EXCEL FILE
require "vendor/autoload.php";
$reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$spreadsheet = $reader->load("2b-dummy.xlsx");
$worksheet = $spreadsheet->getActiveSheet();
// (C) READ DATA + IMPORT
$sql = "INSERT INTO `users` (`name`, `email`) VALUES (?,?)";
foreach ($worksheet->getRowIterator() as $row) {
// (C1) FETCH DATA FROM WORKSHEET
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false);
$data = [];
foreach ($cellIterator as $cell) { $data[] = $cell->getValue(); }
// (C2) INSERT INTO DATABASE
print_r($data);
try {
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
echo "OK - USER ID - {$pdo->lastInsertId()}<br>";
} catch (Exception $ex) { echo $ex->getMessage() . "<br>"; }
$stmt = null;
}
// (D) CLOSE DATABASE CONNECTION
if ($stmt !== null) { $stmt = null; }
if ($pdo !== null) { $pdo = null; }
Yep, this one looks a little intimidating at first but is actually very straightforward.
- Connect to the database. Remember to change the settings to your own.
- Load the PHPSpreadsheet library, and use it to open the dummy Excel spreadsheet.
- Read the cells of the spreadsheet, and import them into the database.
- The end. Close the database connection.
SPREADSHEETS WITH FORMULA
Take note that PHPSpreadSheet will not evaluate the cell formula. Do your own “convert formulas to values” in Excel, and save it as a different spreadsheet before importing.
DATE & TIME CELLS
This is yet another gotcha… Basically, convert the date/time cell into a string or text first.
LINKS & REFERENCES
- Need to do the opposite of exporting into Excel files? – Here’s how.
- Check out the PHPSpreadsheet GitHub Page here.
- Also, the official documentation.
YOUTUBE TUTORIAL
INFOGRAPHIC CHEAT SHEET
THE END
Thank you for reading, and we have come to the end of this guide. I hope that it has helped you with your project, and if you want to share anything with this guide, please feel free to comment below. Good luck and happy coding!
by Vincy. Last modified on April 8th, 2023.
Database backup and restore is the most important part of maintaining software. Taking automatic periodical backup is a must for any project.
In case of unknown security flaws which may collapse your system. In such an unfortunate situation, it will be the holy grail to save you if you have a backup.
It is not only enough to take a backup by exporting your database. Also, we need to experiment with importing backups to ensure the restoration.
Backup files can be in any format. Many of the database clients support SQL, Excel or CSV format files to import external data.
We will create our own PHP database client only for importing Excel data into a database.
Restoring Excel backup into a database via programming will save us time. Let us study how to implement a quick restore by importing bulk data from Excel files. You may visit my earlier export data in CSV format if you want an export example.
This screenshot shows the output by displaying the list of imported rows from the database.
What is inside?
- About this Excel import example
- File Structure
- Database script
- Creating UI to upload import template
- Parse Excel data using PHPSpreadsheet
- Output: Excel import and data listing
About this Excel import example
This example allows users to choose the import template via HTML form input. A sample Excel template is added with this downloadable resource.
With a valid file, the HTML form submitted will call PHP to process Excel parsing.
In PHP, the PHPSpreadsheet library is used to read the Excel file data and convert it into an array.
The code will execute the database insert row by row by iterating the array data.
File Structure
See the Excel import example’s file structure shown below. The vendor folder has the PHPSpreadsheet library and its dependencies.
I have given a sample import template with these files to experiment with the import operation.
The schema.sql has the script to create the target database. You can find the SQL script in the next section.
Database script
Import the following SQL script and create a database environment. Also, configure your database details in DataSource.php to make this example work.
--
-- Database: `import_excel`
--
-- --------------------------------------------------------
--
-- Table structure for table `tbl_info`
--
CREATE TABLE `tbl_info` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`description` varchar(50) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
--
-- Indexes for table `tbl_info`
--
ALTER TABLE `tbl_info`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT for table `tbl_info`
--
ALTER TABLE `tbl_info`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;;
Creating UI to upload import template
This HTML form with the file upload option is used to choose the Excel source. On submitting this form, the Excel file will be sent to the PHP to parse the data source. This file upload option will only allow the Excel files to choose using the accept attribute.
This code also contains the response HTML for displaying the message returned from PHP. This message is shown based on the type of response sent from PHP after Excel import.
<h2>Import Excel File into MySQL Database using PHP</h2>
<div class="outer-container">
<div class="row">
<form class="form-horizontal" action="" method="post"
name="frmExcelImport" id="frmExcelImport"
enctype="multipart/form-data" onsubmit="return validateFile()">
<div Class="input-row">
<label>Choose your file. <a href="Template/import-template.xlsx"
download>Download excel template</a></label>
<div>
<input type="file" name="file" id="file" class="file"
accept=".xls,.xlsx">
</div>
<div class="import">
<button type="submit" id="submit" name="import" class="btn-submit">Import
Excel and Save Data</button>
</div>
</div>
</form>
</div>
</div>
<div id="response"
class="<?php if(!empty($type)) { echo $type . " display-block"; } ?>"><?php if(!empty($message)) { echo $message; } ?></div>
<?php
$sqlSelect = "SELECT * FROM tbl_info";
$result = $db->select($sqlSelect);
if (! empty($result)) {
?>
<table class='tutorial-table'>
<thead>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<?php
foreach ($result as $row) { // ($row = mysqli_fetch_array($result))
?>
<tbody>
<tr>
<td><?php echo $row['name']; ?></td>
<td><?php echo $row['description']; ?></td>
</tr>
<?php
}
?>
</tbody>
</table>
<?php
}
?>
Parse Excel data using PHPSpreadsheet
In this PHP code, I specified the array of allowed file types for the file-type validation in PHP. I validated the uploaded file type along with the array allowed type.
If a match is found, the code will execute other logic. Otherwise, it will return the error message to the user.
With successful validation, excel file parsing read and convert the data into an array. Each array index has an array of row data. After reading the non-empty row data, I ran the database insert and showed the response.
<?php
use PhppotDataSource;
use PhpOfficePhpSpreadsheetReaderXlsx;
require_once 'DataSource.php';
$db = new DataSource();
$conn = $db->getConnection();
require_once ('vendor/autoload.php');
if (isset($_POST["import"])) {
$allowedFileType = [
'application/vnd.ms-excel',
'text/xls',
'text/xlsx',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
];
if (in_array($_FILES["file"]["type"], $allowedFileType)) {
$targetPath = 'uploads/' . $_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'], $targetPath);
$Reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$spreadSheet = $Reader->load($targetPath);
$excelSheet = $spreadSheet->getActiveSheet();
$spreadSheetAry = $excelSheet->toArray();
$sheetCount = count($spreadSheetAry);
for ($i = 1; $i <= $sheetCount; $i ++) {
$name = "";
if (isset($spreadSheetAry[$i][0])) {
$name = mysqli_real_escape_string($conn, $spreadSheetAry[$i][0]);
}
$description = "";
if (isset($spreadSheetAry[$i][1])) {
$description = mysqli_real_escape_string($conn, $spreadSheetAry[$i][1]);
}
if (! empty($name) || ! empty($description)) {
$query = "insert into tbl_info(name,description) values(?,?)";
$paramType = "ss";
$paramArray = array(
$name,
$description
);
$insertId = $db->insert($query, $paramType, $paramArray);
// $query = "insert into tbl_info(name,description) values('" . $name . "','" . $description . "')";
// $result = mysqli_query($conn, $query);
if (! empty($insertId)) {
$type = "success";
$message = "Excel Data Imported into the Database";
} else {
$type = "error";
$message = "Problem in Importing Excel Data";
}
}
}
} else {
$type = "error";
$message = "Invalid File Type. Upload Excel File.";
}
}
?>
Note: Download the PHPSpreadsheet and include it in the vendor directory.
Download
↑ Back to Top
От автора: в этом уроке мы рассмотрим экспорт из Excel в MySQL на PHP. В одном из уроков нашего сайта, мы с Вами изучали библиотеку PHPExcel, которая используется для работы с таблицами Microsoft Excel, используя язык PHP. При этом на примере создания прайс-листа для сайта, мы научились переносить данные из СУБД MySql в данные таблицы. Но очень часто при разработке сайтов, необходимо выполнить обратную задачу – выгрузить данные из таблиц Microsoft Excel в базу данных СУБД MySql. Поэтому в данном уроке мы займемся решением данной задачи.
Установка библиотеки PHPExcel
Для начала хотел бы обратить Ваше внимание на то, что данный урок – это своего рода продолжение урока Генерация прайс-листа в формате Excel при помощи PHP. Phpexcel, который публиковался ранее.
При этом если Вы не знакомы с библиотекой PHPExcel и с основами работы с ней, то настоятельно рекомендую просмотреть вышеуказанный урок, так как сегодня мы не будем тратить время на изучение основ. Для данного урока мы будем использовать тестовый сайт, который написан с использованием объектно-ориентированного подхода и шаблона проектирования MVC. Сейчас я не буду приводить его код, так как он будет доступен Вам в дополнительных материалах к уроку. В функционале данного сайта описан механизм загрузки на сервер файлов формата Excel и соответственно, данный механизм нам необходимо доработать, а именно, после успешной загрузки файла на сервер, необходимо прочитать содержимое данного файла и перенести данные из необходимых столбцов таблицы Excel, в базу данных MySql.
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля
Получить курс сейчас!
Теперь давайте установим библиотеку PHPExcel. Для этого мы воспользуемся инструментом Composer, (для тех кто не знаком с данным инструментов, рекомендую посмотреть урок Введение в Composer, поэтому открываем командную строку, переходим в каталог с тестовым сайтом и выполняем следующую команду:
composer require phpoffice/phpexcel |
После установки библиотеки, в корневом каталоге тестового сайта, была создана папка vendor. В данной папке расположен файл autoload.php, который необходимо обязательно подключить в файле index.php (файл autoload.php содержит инструкции по подключению необходимых классов библиотеки).
require_once «vendor/autoload.php»; |
Подготовка к работе
Для данного урока нам потребуется база данных MySql, в которую мы будем осуществлять выгрузку данных. Структура таблицы main (в данную таблицу мы будем выгружать данные), тестовой базы данных:
При этом имена полей таблицы main, совпадают с заголовками столбцов документа Excel. Так как формировать SQl запрос по вставке данных, мы будем динамически и при этом, из таблицы Excel мы будем выгружать данные только из определенных столбцов, имена которых представлены в конфигурационном файле.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class Config { public $cells = array( ‘D’=>‘order’, ‘F’=>‘date port’, ‘B’=>‘customer’, ‘G’=>‘country’, ‘J’=>‘products’, ‘K’=>‘grade’, ‘U’=>‘date’, ‘M’=>‘size’, ‘P’=>‘length’, ‘Q’=>‘quantity’, ‘U’=>‘date’, ‘V’=>‘gruzo’, ); } |
То есть, как Вы видите в свойстве $cells класса Config, содержится массив с именами столбцов, таблицы Excel, данные которых подлежат выгрузке в базу данных. При этом в качестве ключей используются имена столбцов, а в качестве значений — заголовки каждого столбца и соответственно заголовки столбцов одноименны с полями таблицы main, базы данных. Таким образом, добавляя или удаляя ячейки из данного массива, мы указываем какие данные необходимо загрузить из таблицы Excel.
Перенос данных из Excel в MySql
В тестовом сайте, за загрузку файла на сервер отвечает метод export(), класса Controller, при этом на данном этапе код данного метода, следующий:
public function export() { if(!empty($_FILES[‘xls’][‘tmp_name’])) { $file = $this—>uploadFile($_FILES); } } |
Обратите внимание, что после успешной загрузки файла на сервер – возвращается имя загруженного файла, для дальнейшей работы. Поэтому вызовем на исполнение метод xlsToMysql($file), который выполнит перенос данных из таблицы Excel в базу данных MySql:
public function export() { if(!empty($_FILES[‘xls’][‘tmp_name’])) { $file = $this—>uploadFile($_FILES); if($this—>xlsToMysql($file)) { header(‘Location:index.php’); } } } |
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля
Получить курс сейчас!
Код метода xlsToMysql($file), для начала, разберем по порядку, а затем я приведу его в полном виде. То есть дальнейшие пояснения относятся к коду будущего метода. Первым делом получаем объект модели и объект класса PHPExcel:
$this—>model = $this—>getModel(); $this—>xls = $this—>getPhpExcel($file); |
Метод getModel() – не представляет интереса так как возвращает объект модели тестового сайта. Метод getPhpExcel($file), возвращает объект класса PHPExcel, для файла, имя которого содержится в переменной $file – то есть это имя — только что загруженного файла в систему. Другими словами мы загружаем файл с таблицей Excel, для дальнейших манипуляций, при этом возвращается объект, который мы будем использовать. Код метода getPhpExcel($file):
public function getPhpExcel($file) { return PHPExcel_IOFactory::load($file); } |
Далее продолжаем описывать код метода xlsToMysql($file) и устанавливаем активный лист таблицы Excel с индексом 0 (напомню, что индексация листов Excel начинается с нуля) и получаем объект активного листа с данными:
$this—>xls—>setActiveSheetIndex(0); $sheet = $this—>xls—>getActiveSheet(); |
Далее используя метод getRowIterator(), объекта активного листа – рекурсивно обходим все строки таблицы Excel и формируем объект с полученными данными:
$rowIterator = $sheet—>getRowIterator(); |
Используя цикл foreach() мы можем пройтись по объекту $rowIterator и получить доступ к каждой строке таблицы в отдельности:
foreach($rowIterator as $row) { if($row—>getRowIndex() != 1) { $cellIterator = $row—>getCellIterator(); foreach($cellIterator as $cell) { $cellPath = $cell—>getColumn(); if(isset($this—>config—>cells[$cellPath])) { $arr[$row—>getRowIndex()][$this—>config—>cells[$cellPath]] = $cell—>getCalculatedValue(); } } } } |
При этом на каждой итерации цикла в переменную $row, попадает объект одной строки таблицы Excel. Для определения индекса каждой строки, используем метод getRowIndex(). Далее, если на текущей итерации индекс строки не равен 1, так как в первой строке располагается шапка таблицы, значит, рекурсивно обходим все ячейки текущей строки, используя метод getCellIterator(). А затем, аналогично проходимся в цикле foreach(), по полученному объекту, получая, тем самым, доступ к каждой ячейке в отдельности. Для получения имени столбца, для текущей ячейки – используем метод getColumn(). При этом, если имя ячейки, присутствует в массиве свойства cells, объекта Config, значит, получаем данные текущей ячейки, используя метод getCalculatedValue().
Хотел бы обратить Ваше внимание, на следующее – если в некой ячейке таблицы содержится дата, то для преобразования данной даты в формат языка PHP, необходимо использовать статический метод ExcelToPHP($cell->getCalculatedValue()) класса PHPExcel_Shared_Date, который вернет дату из ячейки таблицы Excel, в формате timestamp. Полный код метода xlsToMysql():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
protected function xlsToMysql ($file) { $this—>model = $this—>getModel(); $this—>xls = $this—>getPhpExcel($file); $this—>xls—>setActiveSheetIndex(0); $sheet = $this—>xls—>getActiveSheet(); $rowIterator = $sheet—>getRowIterator(); $arr = array(); foreach ($rowIterator as $row) { if($row—>getRowIndex() != 1) { $cellIterator = $row—>getCellIterator(); foreach ($cellIterator as $cell) { $cellPath = $cell—>getColumn(); if(isset($this—>config—>cells[$cellPath])) { if($cellPath == ‘U’) { if($cell—>getCalculatedValue() == ‘00.00.0000’ || $cell—>getCalculatedValue() == ») { $t = ‘0000-00-00’; } else { $t = date( ‘Y-m-d’, PHPExcel_Shared_Date::ExcelToPHP( $cell—>getCalculatedValue() ) ); } $arr[$row—>getRowIndex()][$this—>config—>cells[$cellPath]] =$t; continue; } if($cellPath == ‘F’) { if($cell—>getCalculatedValue() == ‘00.00.0000’ || $cell—>getCalculatedValue() == ») { $t = ‘0000-00-00’; } else { $t = date( ‘Y-m-d’, PHPExcel_Shared_Date::ExcelToPHP( $cell—>getCalculatedValue() ) ); } $arr[$row—>getRowIndex()][$this—>config—>cells[$cellPath]] =$t; continue; } $arr[$row—>getRowIndex()][$this—>config—>cells[$cellPath]] = $cell—>getCalculatedValue(); } } } } $res = $this—>model—>inserExcel($arr); if(!$res) { exit(); } return TRUE; } |
В итоге, работы данного метода, мы получаем следующий массив данных:
То есть в каждой ячейке данного массива, содержится массив с данными по отдельной строке таблицы Excel. Соответственно данный массив передаем методу модели insertExcel(), который сформирует SQL запрос для вставки данных в таблицу main базы данных MySql. Код метода модели insertExcel():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public function insertExcel($arr) { $fields = »; foreach($arr[2] as $key => $cell) { $fields .= ‘`’.$key.‘`’.‘,’; } $fields = trim($fields,‘,’); $str = »; // INSERT INTO `main` («,«,«..) VALUES (»,»,»,),(),(),(); foreach($arr as $item) { $str .= «(«; foreach($item as $cell) { $str .= «‘».$this—>db—>real_escape_string($cell).«‘,»; } $str = trim($str,«,»); $str .= «),»; } $str = trim($str,«,»); $query = «INSERT INTO `main` («.$fields.«) VALUES «.$str; $result = $this—>db—>query($query); if($result) { return TRUE; } } |
Данный метод формирует SQL запрос вида INSERT INTO main
(field1
,field2
,field3
..) VALUES (‘data1′,’data2′,’data3’,),(),(),(); — для добавления всех данных из переданного массива в таблицу main базы данных. Соответственно после выполнения данного SQL запроса – информация из таблиц Microsoft Excel будет перенесена в базу данных MySql.
На этом данный урок завершен. Всего Вам доброго и удачного кодирования!
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля
Получить курс сейчас!
Разработка веб-приложения на PHP
Скачайте видеокурс и узнайте, как создать веб-приложение на PHP
Скачать