У меня было 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