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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2024-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 не будет опубликован. Обязательные поля помечены *