Конвертация excel в php

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

Cameron's user avatar

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

Ryan Chouinard's user avatar

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

abhishek bagul's user avatar

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 B's user avatar

Marc BMarc B

354k43 gold badges417 silver badges495 bronze badges

Преобразование Excel-файла в PHP класс

Доброго времени суток! В данной статье я покажу Вам как можно преобразовать 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)!

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

September 30 2015, 13:16

Category:

  • IT
  • Cancel

Сегодня расскажу как легко и быстро перенести любой объем данных из таблицы Excel в среду PHP и как с помощью PHP сгенерировать Excel файл и наполнить его данными. Такая задача часто возникает при разработке сайтов интернет магазинов и других площадок, где используются таблицы MySql. Так, например, мне нужно было перенести список, где было 5000 фамилий из Excel в Mysql, часто еще нужно вывести результаты опроса с сайта в Excel таблицу.

Итак, для начала вам нужно скачать два вспомогательных файла, которые помогут нам в работе. Первая библиотека переносит данные из Excel в PHP, и вторая для переноса из PHP в Excel.

После загрузки распаковываем все файлы и создаем документ index.php, дальше будем работать в нем. Сначала напишем код для импорта данных из Excel. Вставляем следующие строчки, все пояснения есть в коде.

Copy Source | Copy HTML

  1. <?php
  2. require_once ('Excel_to_PHP/reader.php'); // подключаем файл reader.php из папки
  3. $Excel = new Spreadsheet_Excel_Reader(); // создаем объект
  4. $Excel->setOutputEncoding('utf-8'); // устанавливаем кодировку
  5. $Excel->read('example.xls'); // открываем нужный Excel файл
  6. $count = $Excel->sheets[ 0]['numRows']; // узнаем количество строк в 1 листе
  7. for ($rowNum = 1; $rowNum <= $count; $rowNum++) {echo $Excel->sheets[ 0]['cells'][$rowNum][1];} // циклом выводим все данные из первого столбца
  8. for ($rowNum = 1; $rowNum <= $count; $rowNum++) {echo $Excel->sheets[ 0]['cells'][$rowNum][2];} // циклом выводим все данные из второго столбца
  9. ?>

Теперь в этом же документе напишем код для генерации Excel файла и создадим там две ячейки.

Copy Source | Copy HTML

  1. <?php
  2.   require_once 'PHP_to_Excel/classes/PHPExcel.php'; // Подключаем файл PHPExcel из папки
  3.   $phpexcel = new PHPExcel(); // Создаём объект PHPExcel
  4.   $page = $phpexcel->setActiveSheetIndex( 0); // Делаем активной первую страницу и получаем её
  5.   $page->setCellValue("A$i", "Привет"); // записываем данные в ячейку A1
  6.   $page->setCellValue("B$i", "Всем"); // записываем данные в ячейку B1
  7.   $page->setTitle("Example"); // Заголовок делаем "Example"
  8.   $objWriter = PHPExcel_IOFactory::createWriter($phpexcel, 'Excel2007'); //Начинаем готовиться к записи информации в xlsx-файл
  9.   $objWriter->save("example.xlsx"); //Записываем в файл
  10. ?>

Созданный файл появится в той же папке, что и 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 того же автора.

Читайте также

Главная

Инструменты

Excel в PHP-массив онлайн

14.12.2017

24133

1 комментарий

В закладки

20

5

Загрузите файл Excel чтобы перевести его в массив PHP, JS, JSON.

Перетащите сюда файл xls, xlsx, csv
или
выберите файл

Номер листа в excel Удалить пустые строки
Начать со строки Удалить пустые колонки
Кодировка файла Добавить ключи в массив

PHP массив

JS массив

JSON

SQL

14.12.2017, обновлено 05.12.2022

24133

В закладки

20

5

Комментарии 1

Farrux Xalmuratov
Farrux Xalmuratov

15 января 2022 в 19:16

+2

Wy not working convertor?

Ответить

  • Скопировать ссылку
  • Пожаловаться

Авторизуйтесь, чтобы добавить комментарий.

22.03.2022

Простой php скрипт, который для конвертации эксель файла (xls) в JSON. Использует phpoffice/phpspreadsheet

Еще есть набор примеров: Работа с XLSX через библиотеку phpoffice/phpspreadsheet

Методы класса:

xl2json — конвертация Эксель файла в JSON

  • $sInFile — имя эксель файла, может быть как XSLX так и XLS.

  • $sOutFile — имя выходного JSON файла.

  • $sEmpty — на что заменять пустые поля.

  • $bTrim — удалять пробелы и другие системные символы в начале и конце значения из ячейки.

json2xl — обратная конвертация JSON в XLS

  • $sInFile — имя JSON файла, может быть как XSLX так и XLS.

  • $sOutFile — имя выходного Эксель файла.

  • $bAddOldColNum — выводить ли первым столбцом старые номера строк (из исходного файла).

01_converter.php (Download)

 <?php

error_reporting(E_ALL);
ini_set('display_errors', 'On');
require_once('../vendor/autoload.php');

use PhpOfficePhpSpreadsheetIOFactory;
use PhpOfficePhpSpreadsheetSpreadsheet;


class soConverter {

    public function xl2json($sInFile, $sOutFile, $sEmpty = '', $bTrim = false)
    {
        $oSpreadsheet = IOFactory::load($sInFile);
        $oCells = $oSpreadsheet->getActiveSheet()->getCellCollection();

        $aTMP = [];
        for ($iRow = 1; $iRow <= $oCells->getHighestRow(); $iRow++) {
            $oTMP = new stdClass();
            $oTMP->_row_num = $iRow;
            for ($iCol = 'A'; $iCol <= $oCells->getHighestColumn(); $iCol++)
            {
                $oCell = $oCells->get($iCol.$iRow);
                $val = $oCell?$oCell->getValue():'';
                if ($bTrim && $val) {
                    // "u{00a0}" ==  
                    $val = trim(str_replace("u{00a0}", '', $val));
                }

                if (!$val) {
                    $val = $sEmpty;
                }

                $oTMP->$iCol = $val;
            }

            $aTMP[] = $oTMP;
        }

        file_put_contents($sOutFile, json_encode($aTMP));
    }

    public function json2xl($sInFile, $sOutFile, $bAddOldColNum = false)
    {
        $aRows = json_decode(file_get_contents($sInFile));
        $oSpreadsheet = new Spreadsheet();
        $oSpreadsheet->setActiveSheetIndex(0);

        $iRow = 1;
        foreach($aRows as $oRow)
        {
            $sCol = 'A';
            foreach($oRow as $sName => $sVal)
            {
//                echo $sCol .': '. $sVal . "n";
                if ( (!$bAddOldColNum) && ($sName == '_row_num') ) {
                    continue;
                }

                $oSpreadsheet->getActiveSheet()->setCellValue($sCol.$iRow, $sVal);

                $sCol++;
            }

            $iRow++;
        }

        $oWriter = IOFactory::createWriter($oSpreadsheet, 'Xlsx');
        $oWriter->save($sOutFile);
    }


}

$oConverter = new soConverter();



// $sInFile = 'FORMAT_OLD.xls';
$sInFile1 = 'FORMAT_NEW.xlsx';
$sOutFile1 = 'out_01.json';
//$oConverter->xl2json($sInFile1, $sOutFile1, '---', true);


$sInFile2 = $sOutFile1;
$sOutFile2 = 'result.xlsx';
//$oConverter->json2xl($sInFile2, $sOutFile2, true);

Понравилась статья? Поделить с друзьями:
  • Конвертация excel в kml
  • Конвертация eml в word
  • Конвертация dwg в excel
  • Конвертация docx для word
  • Конвертация docx в excel