Excel2html на PHP c вытаскиванием изображений

в 18:25, , рубрики: Excel, php, метки: ,

У меня было 400 Excel файлов и мне из них надо было достать изображения, при этом к ним создать html страницы, в которых будут находиться эти изображения. В ручную их перебирать — нереально долго, поэтому зашел в Google. Но к моему удивлению ни один из Excel Reader`ов не может вытаскивать изображения из Excel файлов. Поэтому пришлось ломать голову, как же мне выполнить задание.

Идея пришла быстро — использовать класс COM у PHP. Но опять же в интернете я не нашел, как можно выдернуть изображения. Путем раздумий, чтения документации про Excel написал следующий скрипт (он может работать только на компьютере с OS Windows и установленной программой Microsoft Excel):

<?php
          // Создаем COM объект с которым будем дальше работать
          $xls = new COM("Excel.Application") or die("Невозможно создать COM объект");
          // указываем, что сама программа не должна запуститься
          $xls->Application->Visible = 0;
          // указываем файл, который нам нужно прочитать
          $workBook = $xls->Workbooks->Open("full_path_to_excel.xls");
          // Сохраняем книгу как HTML
          $xls->Workbooks[1]->SaveAs('full_path_to_new_file.html', 44);
          // Закрываем книгу
          $xls->Workbooks->Close();
          // закрываем программу Excel
          $xls->Application->Quit();
          // открываем полученный файл (в данном случае открываем книгу 1), new_file - название html файла который создали выше
          $file_path = "path_to_html_file_dir/new_file.files/sheet001.html";
          $f = fopen($file_path, "r");
          $file = fread($f, filesize($file_path));
          fclose($f);
         // отчищаем от лишнего новый html файл
         $start = explode("<!--[", $file);
         unset($start[0]);
         foreach($start as $s){
                  if(trim($s) != ""){
                           $my_text = explode"endif]-->", $s);
                           $matches[] = $my_text[0];
                  }
         }
         $images = array();
         foreach($matches as $v){
                  preg_match("|<v:imagedata src="(.*)" o:title=".*"/>|Umsi", $v, $mat);
                  if(isset($mat[1]) AND $mat[1] != ""){
                           $images[] = array("img" => $mat[1], "text" => "<!--[".$v."endif]-->");
                  }
         }
         // получили массив $images в котором содержится название изображения и текст, который его заменял
         // заменяем код в на стандартные html теги (img)
         // path_to_images - путь к изображениям, совпадает с путем к html файлу
         foreach($images as $image){
                  $file = str_replace($image["text"], "<img src='./path_to_images/".$file_name."/".$image["img"]."' alt='' />", $file);
         }
         // делаем поиск информации в ячейках таблицы
         $tr = explode("<tr", $file);
         unset($tr[0]);
         $trs = "";
         foreach($tr as $t){
                  $tr_text = explode(">", $t);
                  unset($tr_text[0]);
                  $tr_text = implode(">", $tr_text);
                  $td = explode("<td", $tr_text);
                  unset($td[0]);
                  $tds = array();
                  $img = false;
                  $image = "";
                  foreach($td as $val){
                           $s = explode(">", $val);
                           unset($s[0]);
                           $s = preg_replace("|s+|", " ", trim(str_replace(array("n", "r", "rn", "nr", "</td>", " "), "", implode(">", $s))));

                           if(substr_count($s, "<img src='") > 0){
                                    // делаем поиск по изображениям
                                    preg_match("|<img src='./path_to_images/".$file_name."/(.*)' alt='' />|Umsi", $s, $matches);
                                    $image = trim($matches[1]);
                           }
                           // отчищаем от тегов
                           $tds[] = strip_tags($s, "<img>");
                  }
                  $trs .= "<tr>";
                  foreach($tds as $t){
                           $trs .= "<td>".$t."</td>";
                  }
                  $trs .= "</tr>";
         }
         // Создаем чистую таблицу
         $text = "<table border=1>";
         $text .= $trs;
         $text .= "</table>";
         // удаляем старый html файл, с которым мы работали
         @unlink($file_path);
         // создаем этот же файл
         $f = fopen($file_path, "a+");
         fwrite($f, $text); // вносим информацию в файл
         fclose($f);
         // Отображаем информацию в таблицы:
         echo $text;
?>

Все. Я понимаю, что этот код не идеален, требует кучи доработок, все дополнения будут чуть позже, когда сделаю скрипт, который не требует OS Windows и программы Excel

Автор: koksharov

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js