Главная
Инструменты
Excel в PHP-массив онлайн
14.12.2017
24134
1 комментарий
В закладки
20
5
Загрузите файл Excel чтобы перевести его в массив PHP, JS, JSON.
Перетащите сюда файл xls, xlsx, csv
или
выберите файл
Номер листа в excel | Удалить пустые строки | ||
---|---|---|---|
Начать со строки | Удалить пустые колонки | ||
Кодировка файла | Добавить ключи в массив |
PHP массив
JS массив
JSON
SQL
14.12.2017, обновлено 05.12.2022
24134
В закладки
20
5
Комментарии 1
Farrux Xalmuratov
15 января 2022 в 19:16
+2
Wy not working convertor?
Ответить
- Скопировать ссылку
- Пожаловаться
Авторизуйтесь, чтобы добавить комментарий.
Доброго времени суток! В данной статье я покажу Вам как можно преобразовать Excel-файл
в PHP объект для дальнейшей работы с ним.
Допустим у нас есть некий Excel-документ, например бухгалтерский баланс некой кредитной организации. И нам необходимо вытащить из его столбцов значения, которые нужно будет назначить соответствующим полям класса.
Для начала создадим файл composer.json со следующим содержимым:
{
"autoload": {
"psr-4": {
"SampleApp\BanksReporting\": "src"
}
},
"require": {
"phpoffice/phpspreadsheet": "^1.20"
}
}
Файловая структура проекта следующая:
.
├── files
│ ├── report_01102021.xlsx
│ └── report_01072021.xlsx
├── src
│ ├── BalanceSheet.php
│ ├── currentPeriodMapper.php
│ ├── previousPeriodMapper.php
│ └── read_excel.php
├── vendor
├── composer.json
└── composer.lock
Далее выполним команду в директории проекта для установки пакета phpoffice/phpspreadsheet:
$ composer install
Содержимое файла класса BalanceSheet. Его содержимое полностью зависит от структуры Вашего Excel-файла. В данном случае он такой:
<?php
namespace SampleAppBanksReporting;
class BalanceSheet
{
// метаданные отчета
public $reportDate;
public $bankName;
public $postAddress;
// активы
public $moneyAssets;
public $fundsInTheCentralBank;
public $mandatoryReserves;
public $fundsInCreditInstitutions;
public $loanDebt;
public $fixedAssets;
public $requirementsForInterest;
public $otherAssets;
public $totalAssets;
// пассивы
public $loansOfTheCentralBank;
public $fundsOfCreditInstitutions;
public $fundsOfClientsNonCreditOrganizations;
public $depositsOfIndividuals;
public $debtObligationsIssued;
public $iterestPaymentOobligations;
public $otherLiabilities;
public $provisionsForPpossibleLosses;
public $totalObligations;
// источники собственных средств
public $fundsOfShareholders;
public $sharesRepurchasedFromShareholders;
public $seigniorage;
public $revaluationOfFixedAssets;
public $deferredExpenses;
public $unusedProfitsOrOutstandingLossesOfPreviousYears;
public $profitOrLossForTheReportingPeriod;
public $totalSourcesOfOwnFunds;
public $totalLiabilities;
// забалансовые пассивы
public $irrevocableObligations;
public $guaranteesByBank;
}
В данном случае я рассматриваю пример отчета в котором есть два столбца — отчетный период и предыдущий период. Для каждого период я создам отдельный файл, возвращающий массив, в котором ключ — это название поля класса BalanceSheet, а значение — название ячейки, в которой лежат необходимые данные.
Файл для предыдущего периода:
<?php
return [
// metadata
'reportDate' => 'A1',
'bankName' => 'C2',
'postAddress' => 'A3',
// Cells
'moneyAssets' => 'D8',
'fundsInTheCentralBank' => 'D9',
'mandatoryReserves' => 'D10',
'fundsInCreditInstitutions' => 'D11',
'loanDebt' => 'D12',
'fixedAssets' => 'D13',
'requirementsForInterest' => 'D14',
'otherAssets' => 'D15',
'totalAssets' => 'D16',
// Liabilities
'loansOfTheCentralBank' => 'D18',
'fundsOfCreditInstitutions' => 'D19',
'fundsOfClientsNonCreditOrganizations' => 'D20',
'depositsOfIndividuals' => 'D21',
'debtObligationsIssued' => 'D22',
'iterestPaymentOobligations' => 'D23',
'otherLiabilities' => 'D24',
'provisionsForPpossibleLosses' => 'D25',
'totalObligations' => 'D26',
// Sources of own funds
'fundsOfShareholders' => 'D28',
'sharesRepurchasedFromShareholders' => 'D29',
'seigniorage' => 'D30',
'revaluationOfFixedAssets' => 'D31',
'deferredExpenses' => 'D32',
'unusedProfitsOrOutstandingLossesOfPreviousYears' => 'D33',
'profitOrLossForTheReportingPeriod' => 'D34',
'totalSourcesOfOwnFunds' => 'D35',
'totalLiabilities' => 'D36',
// Off-balance sheet liabilities
'irrevocableObligations' => 'D38',
'guaranteesByBank' => 'D39',
];
Для текущего периода:
<?php
return [
// metadata
'reportDate' => 'A1',
'bankName' => 'C2',
'postAddress' => 'A3',
// Cells
'moneyAssets' => 'E8',
'fundsInTheCentralBank' => 'E9',
'mandatoryReserves' => 'E10',
'fundsInCreditInstitutions' => 'E11',
'loanDebt' => 'E12',
'fixedAssets' => 'E13',
'requirementsForInterest' => 'E14',
'otherAssets' => 'E15',
'totalAssets' => 'E16',
// Liabilities
'loansOfTheCentralBank' => 'E18',
'fundsOfCreditInstitutions' => 'E19',
'fundsOfClientsNonCreditOrganizations' => 'E20',
'depositsOfIndividuals' => 'E21',
'debtObligationsIssued' => 'E22',
'iterestPaymentOobligations' => 'E23',
'otherLiabilities' => 'E24',
'provisionsForPpossibleLosses' => 'E25',
'totalObligations' => 'E26',
// Sources of own funds
'fundsOfShareholders' => 'E28',
'sharesRepurchasedFromShareholders' => 'E29',
'seigniorage' => 'E30',
'revaluationOfFixedAssets' => 'E31',
'deferredExpenses' => 'E32',
'unusedProfitsOrOutstandingLossesOfPreviousYears' => 'E33',
'profitOrLossForTheReportingPeriod' => 'E34',
'totalSourcesOfOwnFunds' => 'E35',
'totalLiabilities' => 'E36',
// Off-balance sheet liabilities
'irrevocableObligations' => 'E38',
'guaranteesByBank' => 'E39',
];
Обратите внимание, что значения E8, E9, E10 и т.д. — жестко заданные названия ячеек в которых лежат данные. Т.е. предполагается, что нужные значения будут лежать именно в этих ячейках, если нет, то вместо значения Вы получите null. Таким образом, структура разбираемого Excel-файла жестко задана.
Теперь непосредственно код, который будет вытаскивать значения и присваивать их полям класса.
Обратите внимание как PHP рефлексия упрощает инициализацию полей класса.
<?php
require __DIR__ . '/../vendor/autoload.php';
// подключаем классы
use SampleAppBanksReportingBalanceSheet;
use PhpOfficePhpSpreadsheetReaderXlsx;
use PhpOfficePhpSpreadsheetWorksheetWorksheet;
use PhpOfficePhpSpreadsheetRichTextRichText;
// получаем ссылки на ячейки листа
function getCells(Worksheet $sheet)
{
return function(string $cellName) use ($sheet) {
// получаем значение ячейки
$cellValue = $sheet->getCell($cellName)->getValue();
// если значение ячейки является объектом
if ( $cellValue instanceof RichText ) {
$richTextElements = $cellValue->getRichTextElements();
$outputValue = '';
// пробегаемся по всем элементам
foreach($richTextElements as $richTextElement)
{
// и объединяем их в одну строку
$outputValue .= trim($richTextElement->getText()) . ' ';
}
return $outputValue;
}
return $cellValue;
};
}
// конвертируем значения листа в нужный нам объекта
function createBalanceFromSheet(Worksheet $sheet, array $period)
{
$cells = getCells($sheet);
$balance = new BalanceSheet();
// с помощью рефлексии
$refClass = new ReflectionClass(BalanceSheet::class);
// получаем все поля объекта
$properties = $refClass->getProperties();
// проходимся по каждому полю
foreach($properties as $property)
{
// смотрим, что это за поле
switch($property->name)
{
// если дата
case 'reportDate':
// получаем значение из Excel-файла, которое находится в ячейке возвращаемой из массива $period['reportDate']
// в данном случае такова специфика файла, что нужно вырезать часть строки
// полученное значение назначаем свойству класса
$balance->{$property->name} = trim(substr($cells($period['reportDate']), -12));
break;
case 'bankName':
$balance->{$property->name} = $cells($period['bankName']);
break;
case 'postAddress':
$balance->{$property->name} = trim(substr($cells($period['postAddress']), 32));
break;
default:
$balance->{$property->name} = $cells($period[$property->name]);
};
}
// возвращаем объект
return $balance;
}
// открываем первый лист Excel-файла
$reader = new Xlsx();
$spreadsheet = $reader->load('./files/report_01102021.xlsx');
$sheet = $spreadsheet->getSheet(0);
// массивы с адресами ячеек, где лежат данные
$currentPeriod = require('currentPeriodMapper.php');
$previousPeriod = require('previousPeriodMapper.php');
// создаем объекты из листа отдельно для каждого периода
// на этом этапе Вы уже может сохранить эти данные в базу например,
// или провести какие либо с ними вычисления
$currentBalance = createBalanceFromSheet($sheet, $currentPeriod);
$previousBalance = createBalanceFromSheet($sheet, $previousPeriod);
// преобразуем это все в JSON для отладки
$json_c = json_encode($currentBalance, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
$json_p = json_encode($previousBalance, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// выводим в консоль
print($json_c);
print($json_p);
Таким образом в данной статье мы рассмотрели пример, то как можно вытащить данные из какого-либо отчета на PHP в структурированном виде. Что делать с этими данными дальше — зависит от Ваших задач. По ним например, можно сделать аналитику, загрузить в базу и т.д.
-
Создано 02.12.2021 11:37:37
-
Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
I have an excel spreadsheet that contains some formulas to calculate ROI for an upcoming product of a client. Is it possible to convert this into a php script whereby a user would type into some boxes and then submit it working out the same. The excel spreadsheet is here: http://www.solidcamxpress.co.uk/roi.xls
asked Aug 18, 2010 at 19:03
1
Sure, PHP can do math just like Excel’s formulas. However, there is no magic method of converting Excel to a Web page, if that’s what you’re asking.
answered Aug 18, 2010 at 19:06
4
@Cameron
There is a software in the market which can convert the spreadsheet to active html/php with ease. You can get the software at the following url:
http://www.spreadsheetconverter.com
Even you can also convert the spreadsheet by yourself as it is simple to convert with scripts. but you can also this software for the conversion =)
answered Mar 2, 2015 at 12:30
You can use PHPExcel to read an existing spreadsheet and extract its data/formulas, but converting those formulas from Excel syntax to PHP is rather non-trivial.
Unless you’re doing a generalized Excel->PHP converter, the time/effort required to write such a converter will be far greater than it would take you do analyze the one spreadsheet by hand and code up some PHP stuff to recreate it.
answered Aug 18, 2010 at 20:26
Marc BMarc B
354k43 gold badges417 silver badges495 bronze badges
-
September 30 2015, 13:16
- IT
- Cancel
Сегодня расскажу как легко и быстро перенести любой объем данных из таблицы Excel в среду PHP и как с помощью PHP сгенерировать Excel файл и наполнить его данными. Такая задача часто возникает при разработке сайтов интернет магазинов и других площадок, где используются таблицы MySql. Так, например, мне нужно было перенести список, где было 5000 фамилий из Excel в Mysql, часто еще нужно вывести результаты опроса с сайта в Excel таблицу.
Итак, для начала вам нужно скачать два вспомогательных файла, которые помогут нам в работе. Первая библиотека переносит данные из Excel в PHP, и вторая для переноса из PHP в Excel.
После загрузки распаковываем все файлы и создаем документ index.php, дальше будем работать в нем. Сначала напишем код для импорта данных из Excel. Вставляем следующие строчки, все пояснения есть в коде.
Copy Source | Copy HTML
- <?php
- require_once ('Excel_to_PHP/reader.php'); // подключаем файл reader.php из папки
- $Excel = new Spreadsheet_Excel_Reader(); // создаем объект
- $Excel->setOutputEncoding('utf-8'); // устанавливаем кодировку
- $Excel->read('example.xls'); // открываем нужный Excel файл
- $count = $Excel->sheets[ 0]['numRows']; // узнаем количество строк в 1 листе
- for ($rowNum = 1; $rowNum <= $count; $rowNum++) {echo $Excel->sheets[ 0]['cells'][$rowNum][1];} // циклом выводим все данные из первого столбца
- for ($rowNum = 1; $rowNum <= $count; $rowNum++) {echo $Excel->sheets[ 0]['cells'][$rowNum][2];} // циклом выводим все данные из второго столбца
- ?>
Теперь в этом же документе напишем код для генерации Excel файла и создадим там две ячейки.
Copy Source | Copy HTML
- <?php
- require_once 'PHP_to_Excel/classes/PHPExcel.php'; // Подключаем файл PHPExcel из папки
- $phpexcel = new PHPExcel(); // Создаём объект PHPExcel
- $page = $phpexcel->setActiveSheetIndex( 0); // Делаем активной первую страницу и получаем её
- $page->setCellValue("A$i", "Привет"); // записываем данные в ячейку A1
- $page->setCellValue("B$i", "Всем"); // записываем данные в ячейку B1
- $page->setTitle("Example"); // Заголовок делаем "Example"
- $objWriter = PHPExcel_IOFactory::createWriter($phpexcel, 'Excel2007'); //Начинаем готовиться к записи информации в xlsx-файл
- $objWriter->save("example.xlsx"); //Записываем в файл
- ?>
Созданный файл появится в той же папке, что и index.php под именем example.xlsx.
В профессии разработчика часто приходится сталкиваться с работой с табличными данными (списки товаров, новостей, мероприятий). С точки зрения пользователя проще всего работать с excel или google sheets api и заказчик зачастую может прислать данные для импорта на сайт в одном из этих форматов. Сегодня мы рассмотрим простую библиотеку SimpleXLSX, которая умеет конвертировать excel-файл в формате .xlsx в обычный массив на php.
Скачать библиотеку вы можете по ссылке с github. Я работаю в основном с WordPress, поэтому ее подключение у меня выглядит следующим образом:
require_once get_template_directory() . '/includes/plugin-additions/simplexlsx.class.php';
В качестве примера мы будем использовать простой пример списка городов:
Обработка такого массива может выглядеть следующим образом: первую строку мы собираем в массив заголовков, остальные строки соотносим с этими заголовками, если файла не существует, то возвращаем ошибку.
// Simple XLSX Parser Template
$fileImport = get_stylesheet_directory() . '/data/example.xlsx';
if ( $xlsx = SimpleXLSX::parse( $fileImport )) {
$sheetData = $xlsx->rows(1);
$excel = array();
$names = array();
foreach ( $sheetData as $keyD => $sheetRow ) {
if ( $keyD == 0 ) {
foreach ( $sheetRow as $keyC => $sheetCol ) {
if ( $sheetCol ) $names[$keyC] = $sheetCol;
}
} else {
if ( $sheetRow['0'] ) $title = $sheetRow['0'];
foreach ( $sheetRow as $keyC => $sheetCol ) {
if ( isset( $title ) && $sheetCol ) {
$excel[$title][$names[$keyC]] = $sheetCol;
}
}
unset( $title );
} // // end if $keyD != 0
} // end foreach $sheetData
var_dump( $excel );
} else {
var_dump( SimpleXLSX::parse_error() );
}
Итоговый массив $excel
в этом примере выглядит так:
array(5) {
["Архангельск"]=>
array(4) {
["title"]=>
string(22) "Архангельск"
["english"]=>
string(11) "Arkhangelsk"
["ISO"]=>
string(6) "RU-ARK"
["population"]=>
string(7) "346 979"
}
["Волгоград"]=>
array(4) {
["title"]=>
string(18) "Волгоград"
["english"]=>
string(9) "Volgograd"
["ISO"]=>
string(6) "RU-VGG"
["population"]=>
string(9) "1 008 998"
}
["Кемерово"]=>
array(4) {
["title"]=>
string(16) "Кемерово"
["english"]=>
string(8) "Kemerovo"
["ISO"]=>
string(6) "RU-KEM"
["population"]=>
string(7) "556 382"
}
["Тамбов"]=>
array(4) {
["title"]=>
string(12) "Тамбов"
["english"]=>
string(6) "Tambov"
["ISO"]=>
string(6) "RU-TAM"
["population"]=>
string(7) "292 140"
}
["Хабаровск"]=>
array(5) {
["title"]=>
string(18) "Хабаровск"
["english"]=>
string(10) "Khabarovsk"
["ISO"]=>
string(24) "RU-KHA"
["population"]=>
string(24) "616 372"
}
}
PS. Эта библиотека не умеет писать в excel-файлы и в случае такой необходимости есть отдельная библиотека simplexlsxgen того же автора.
Читайте также
I need to import data from excel to php, as I heard It’s so hard, so I need convert excel file to csv. But I have the problem, I can’t convert successfully, when I trying I get error message:
My original excel file looks like:
And after convert to csv:
What’s the problem? I need to convert and keep the same format.
My php file for csv reading looks like:
<?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);
}
?>
And result how It looks like after reading in php:
example
So I need any ideas how to convert xls to csv without loosing format or how to import data from excel file to php. Anyone can help me, please? Thank you.