Конвертирование XLS в PDF




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

39 Comments

  1. Душелов

    Написал, почитав http://infostart.ru/orders/39/

    Reply ↓
  2. CheBurator

    бяка! 😉

    — нужен офис… а если его у мну нет…?

    — подойдет 2007, а если 2003? или не дай бог 2000? — где проверка на версию/возможность?

    — и это похоже на гланды через ЗПС 😉

    — а где вариант для Оо…? в котором есть родное ПДФ…

    Reply ↓
  3. ineoosaki

    А что мешает печатать бесплатным пдф-принтером?

    Reply ↓
  4. ineoosaki

    немного не по теме, но всеже про пдф.

    наткнулся я как-то у себя в архиве на Новейший отчет за 2005год. Решил пдф-хелп почитать. Смотрю, а он (хелп) триальной прогой сконвертирован, и на каждой странице об этом жирным текстом сказано. ИМХО, как-то несолидно к платной проге такой хелп прикладывать.

    Ломанули бы прогу, и не писал бы я об этом здесь. 🙂

    Reply ↓
  5. Душелов

    (2) то, что я дал- самый простой способ, т.к. офис обычно есть у многих… Без всего этого — только внешняя компонента, которая все это будет делать 😉 Написать могу, а есть ли смысл?

    (3) почитай ветку из 1 коммента 😉

    (4) Ломать — плохо! Я уважаю труд других программистов 🙂

    Reply ↓
  6. CheBurator

    (5) > Написать могу, а есть ли смысл?

    есть…

    Reply ↓
  7. CheBurator

    По ссылке http://www.microsoft.com/downloads/details.aspx?displaylang=ru&FamilyID=4d951911-3e7e-4ae6-b059-a2e79ed87041)

    — запрашиваемая страница не найдена.. так и хочется -1 влепить… а еще спрашиваешь нужна ВК или нет….

    Reply ↓
  8. Душелов

    (7) Пинай админов инфостарта, что так коряво отображают ссылки — удали скобку в конце.

    Reply ↓
  9. JohnyDeath

    скобку последнию убери!

    млин, прям как маленький…

    Reply ↓
  10. Abadonna

    (7)Чебуратор, ти мене убив

    Reply ↓
  11. JohnyDeath

    иногда, конечно, хорошо, что Чебур докапывается до мелочей, но это ИМХО уже перебор! Весь свой статус так растеряет 😉

    Reply ↓
  12. CheBurator

    Чебуру не влом растерять весь свой статус… я от эникейщика ухожу все дальше и дальше… матом в адрес админов инфостарта — ну вы поняли.. если там сидят эникейщики, которые толком не могут сделать — это не в моей власти… 😉

    Reply ↓
  13. CheBurator

    так самое интересное что эту приблуду фиг скачаешь, если у тебя на компе офис не стоит… тоже мне, блин, автоматизаторы… (это я автору сабжа… ;-))

    Reply ↓
  14. Душелов

    (13) так и написано, что для этого требуется 😉 1 пункт! 🙂

    Reply ↓
  15. Abadonna

    (12-14) Как-то гаишник меня останавливает:

    — почему скорость превышаешь?

    — дык у тебя ж радара нет

    — как будто я до чего-нибудь еще не докопаюсь 😉

    Reply ↓
  16. ineoosaki

    А вот как в дежавю конвертнуть, не подскажете?

    Reply ↓
  17. Душелов

    (16) а для каких целей? мало информации по этому формату

    Reply ↓
  18. ineoosaki

    (17)

    Мне дежавю больше чем пдф нравиться.

    Хорошая компресия картинок (1мб ч/б картинка бмп уменьшается до 20кб), в просмотрщиках файл быстрее открывается, чем н-р пдф в акробате.

    Reply ↓
  19. JohnyDeath

    (18) pdf, ИМХО, лучше всего открывать FoxIt Reader-ом (бесплатный) https://www.foxitsoftware.com/pdf/reader_2/down_reader.htm

    Reply ↓
  20. moonlight81

    Для таких целей я обычно ставлю бесплатный принтер PDFCreator и на него посылаю печать….вот и получается файлик pdf, а тут промежуточная фаза в виде XLS

    Reply ↓
  21. Душелов

    (20) эту тему обсуждали http://infostart.ru/orders/39/?cp=all

    Reply ↓
  22. gull71

    А можно узнать какой смысл конвертить *.xls в *.pdf, если при сохранении в *.xls теряется форматирование?Не проще напечатать на *.pdf-принтер сразу?Ну если не pdf, то Skitex можно поставить:-)И в дальнейшем отконвертить AcrobatDistiller-ом в pdf?

    Reply ↓
  23. Душелов

    (22) 1. Смотря в формате какого офиса сохранять в xls.

    2. Как я понял, все должно делаться программно.

    Reply ↓
  24. sea-man

    Василь, респект и уважуха!

    Лавр.

    Reply ↓
  25. Душелов

    (24) Лавр, стараемся 🙂

    Reply ↓
  26. dance000

    Поддержу по поводу ненужности формата xls, т.к. у себя сделал что печатается прямо на принтер Adobe Distiller и полученный файлик забираю и складываю куда мне нужно.

    Reply ↓
  27. megatrend

    А через COM-объект бесплатной программы PDFCreator нельзя в файл напечатать? 😉

    Reply ↓
  28. Трактор

    (1) PDFCreator не всегда верно сохраняет. У меня не получилось уместить счёт на одну страницу. Бесплатное решение с помощью опена офиса описано тут http://infostart.ru/public/20710/ Работает лучше PDFCreator’а.

    Reply ↓
  29. barsuk

    Выдает ошибку — Ошибка при вызове метода контекста (ExportAsFixedFormat): Произошла исключительная ситуация (0x800a03ec)

    ExcelWorkBook.ExportAsFixedFormat(0, ФайлВФорматеXLS , 0);

    по причине:

    Произошла исключительная ситуация (0x800a03ec)

    Не работает. Офис 2007.

    Reply ↓
  30. Душелов

    (29) Да, описание ошибки многозначащая… 🙂

    А просто так, из офиса из меню сохраняет?

    Reply ↓
  31. barsuk

    (30) принтера не стояло — из-за этого:) но при попытки открытия пдф файла сохраненног выдает -файл не пдф или поврежден

    Reply ↓
  32. Душелов

    (31) Ну тут уже вопрос к микрософту 🙂

    Reply ↓
  33. barsuk

    Стоит Foxit Reader — он не открывает его. В чем проблема? Файл пересораненный таким образом будет открываться только акробатом? Или им тоже не будет?:)

    Reply ↓
  34. barsuk

    Но если попробовать открыть этот фал экселем — то все нормально:)

    Reply ↓
  35. Душелов

    (34) Я не знаю, как сохраняет офис. Я не разработчик этой надстройки.

    У меня — все открывается. Всеми ридерами. Офис 2007 — лицензия со всеми обновлениями.

    Reply ↓
  36. barsuk

    (35) 🙂 а нет идей почему такое может происходить? Такое ощущение что расширение поменял но в формат пдф не перевел:(

    Reply ↓
  37. cool.vlad4

    Пишу только из удивления и возможно, для тех кому надо сохранять mxl в pdf, используя описанный в статье способ(если excel стоит на сервере, то наверное можно сохранять и в контексте сервера). Вся проблема заключается в том, что при сохранении в xls, картинки теряют прозрачность. Если выставлять размер картинки — растянуть, затем делать фон либо прозрачным, либо rgb(255,255,255,0) , то сохраняется в excel(и кстати в open office тоже) с прозрачностью. Остается проблема размещения в одну страницу, которая легко решается либо макросом, либо лучше через com, например

    xlPaperA4 = 9;

    xlPrintNoComments = -4142;

    xlAutomatic = -4105;

    xlPortrait = 1;

    xlDownThenOver = 1;

    xlPrintErrorsDisplayed = 0;

    ExcelЛист.PageSetup.LeftMargin = Excel.InchesToPoints(0);

    ExcelЛист.PageSetup.RightMargin = Excel.InchesToPoints(0);

    ExcelЛист.PageSetup.TopMargin = Excel.InchesToPoints(0);

    ExcelЛист.PageSetup.BottomMargin = Excel.InchesToPoints(0);

    ExcelЛист.PageSetup.HeaderMargin = Excel.InchesToPoints(0);

    ExcelЛист.PageSetup.FooterMargin = Excel.InchesToPoints(0);

    ExcelЛист.PageSetup.PrintHeadings = False;

    ExcelЛист.PageSetup.PrintGridlines = False;

    ExcelЛист.PageSetup.CenterHorizontally = False;

    ExcelЛист.PageSetup.CenterVertically = False;

    ExcelЛист.PageSetup.Orientation = xlPortrait;

    ExcelЛист.PageSetup.PrintComments = xlPrintNoComments;

    ExcelЛист.PageSetup.Draft = False;

    ExcelЛист.PageSetup.PaperSize = xlPaperA4;

    ExcelЛист.PageSetup.FirstPageNumber = xlAutomatic;

    ExcelЛист.PageSetup.Order = xlDownThenOver;

    ExcelЛист.PageSetup.BlackAndWhite = False;

    ExcelЛист.PageSetup.Zoom = 100;

    ExcelЛист.PageSetup.PrintErrors = xlPrintErrorsDisplayed;

    ExcelЛист.PageSetup.OddAndEvenPagesHeaderFooter = False;

    ExcelЛист.PageSetup.DifferentFirstPageHeaderFooter = False;

    ExcelЛист.PageSetup.ScaleWithDocHeaderFooter = True;

    ExcelЛист.PageSetup.AlignMarginsHeaderFooter = True;

    Reply ↓
  38. Shmell

    Перенос по строкам в многострочном поле не корректно отображается. Само сохранение в xls уже делает все без переноса и соответственно в pdf все не очень красиво переносится

    Reply ↓
  39. sp18s

    (5) только этот код не работает на Office 2003. Ошибка!

    ExportAsFixedFormat добавили в 2010.

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *