Выбор цвета в ячейке Excel




Принцип обмена данными из 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='\

32 Comments

  1. GSoft

    а выложить всю обработку?)

    Reply
  2. levran

    (2) да она там в три строчки =)

    Reply
  3. levran

    =) первый минус как и первый плюс всегда волнителен, хорошо бы еще узнать причину, но увы и ах.

    Reply
  4. Altair777

    (3) за три строчки 🙂

    Кстати, а почему Вы не спросили у andreyho за что он поставил плюс? 😉

    Reply
  5. levran

    (4) плюсики это пазитиф, зачем спрашивать про позитиф =) а вот минусики … насчет трех строчек, это была не похвальба, там действительно было мало кода, который я и выложил в первоначальной версии этого текста. А после уже написал комментарий про три строчки. Далее было решено выложить более полную версию обработки. поэтому и код из текста был перенес в обработку. Так что не вижу причины для минуса. Просьба (1) была выполнена. Ну хотя ладно, минус так минус. Тоже наука =)

    Reply
  6. levran

    (4) кстати логичнее было бы заминусовать комментарий, а не текст и обработку. Имхо канечно же.

    Reply
  7. Altair777

    (5) Вот-вот… Написали бы статью по работе с Excel’ем средствами 1С, я бы поставил бы БОЛЬШОЙ жирный плюс 😉

    А так…. три строчки кода в описании разве тянут на плюс? Скажите честно, положа рука на сердце. Или, лучше, на желто-красную книжечку 😀

    А вот на минус тянут. За захламление ресурса.

    (6) Я минусовал не коммантерий, а именно обработку.

    Даже не саму обработку, а ее отсутствие.

    Reply
  8. levran

    (7) Сначала это была статья. И в ней, после комментария, я выложил код обработки по выводу цвета. Чуть позже, когда я закончил писать обработку по выводу в Ексель, кроме цвета были использованы еще другие функции ОЛЕ екселя и появилось желание поделиться найденными приемами, но мне подумалось, что выкладывать весь код обработки слишком громоздко, посему статья превратилась в обработку. Которую я и выложил. Если бы я мог удалять комментарий, я бы свой удалил, чтобы не вводить людей в заблуждение.

    Reply
  9. levran

    Вообще первоначальный замысел был сохранить соответствие цветов и номеров. Для себя и других. Подобного ресурса на инфостаре я не нашел, поэтому прошу пояснить что именно Вы считаете «захламлением»?

    Reply
  10. Altair777

    (8) > Сначала это была статья

    😀

    Под статьей я понимал именно статью, а не 5-6 фраз

    Reply
  11. Altair777

    Эх.. жалко нельзя еще один минус поставить…. 😉

    57

    ЛистЭксель.Cells(Сч,1).Interior.ColorIndex=Сч;

    {D:DOWNLOADS1СRABOTA_S_EXCEL.ERT(406)}: Microsoft Office Excel: Нельзя установить свойство ColorIndex класса Interior

    Reply
  12. levran

    (11) странно, если нельзя, то почему работает?

    Reply
  13. Altair777

    +(11)

    Reply
  14. Altair777

    (12) Не работает 🙂

    Reply
  15. Noy

    (14) и не будет. в палитре Екселя всего 56 цветов. об этом четко написано в справке к Екселю, даже все цвета нарисованы (в Екселе открываем Визуал — там справка — поиск «ColorIndex Property»)

    Reply
  16. Altair777

    (15) наверно, автор об этом не знает.

    В коде написано:

    Для Сч=1 По 255 Цикл
    Сообщить(сч);
    ЛистЭксель.Cells(Сч,2).Value=Сч;
    ЛистЭксель.Cells(Сч,1).Interior.ColorIndex=Сч;
    КонецЦикла;
    Reply
  17. Noy

    15+ причем у автора на скриншоте тоже всего 56 цветов, а в коде счетчик идет до 255…

    Reply
  18. Altair777

    (17) У меня уже была мысль, что автор — это совсем не автор 😉

    Reply
  19. Noy

    (18) Ты слишком строг. Автор захотел поделиться «открытием», которое неважно оформил, за что получил от тебя минус. А ты начинаешь «наезжать»…

    Reply
  20. Altair777

    (19) Ладненько, больше не буду 🙂

    Но минус я поставил заслуженно, хоть и заблаговременно.

    Интуиция…

    Reply
  21. levran

    хех

    Reply
  22. GSoft

    Объем = глФРМ<<?>>(Товар.РеквОбъем);

    {C:TEMPРАБОТА_С_EXCEL.ERT(336)}: Функция не обнаружена (глФРМ)

    Продажи = глФРМ<<?>>(тзСводнаяТаблицаПоТовару.Продажи);

    {C:TEMPРАБОТА_С_EXCEL.ERT(337)}: Функция не обнаружена (глФРМ)

    Остаток = глФРМ<<?>>(тзСводнаяТаблицаПоТовару.Остаток);

    {C:TEMPРАБОТА_С_EXCEL.ERT(338)}: Функция не обнаружена (глФРМ)

    ОстатокВДнях = глФРМ<<?>>(тзСводнаяТаблицаПоТовару.ОстатокВДнях);

    {C:TEMPРАБОТА_С_EXCEL.ERT(339)}: Функция не обнаружена (глФРМ)

    Reply
  23. Altair777

    (22) Автор, можно было бы часть функций из Глобальника в обработку добавить.

    Там все равно говнокода много и так 🙂

    Или хотя бы указывайте, что это работает в таких-то и таких-то конфигурациях.

    Reply
  24. Tolpinski

    Объем = глФРМ<<?>>(Товар.РеквОбъем);

    {C:! NEW2009-10-14РАБОТА_С_EXCEL.ERT(336)}: Функция не обнаружена (глФРМ)

    Зачем использовать глобальные функции в универсальной обработке?

    Reply
  25. markers

    Есть возможность переопределить любой индекс своим цветом, если интересно могу поделится

    Reply
  26. levran

    (25) да, интересно!

    Reply
  27. markers

    Это делаем в начале работы с экселем

    Цвета = Excel.ActiveWorkbook.Colors.Выгрузить(); // Получим все индексы цвета экселя

    Цвета[51] = «14725528»; // Переопределим 51-й индекс цвета своим

    МассивДляExcel = Новый COMSafeArray(Цвета,»VT_I4″); // Конвертируем в массив используемый в COM, в ковычках указан тип значений

    Excel.ActiveWorkbook.Colors = МассивДляExcel; // Скормим экселю его же масив с переопределёнными элементами

    А когда нам надо использовать переопределённый нами выше индекс пишем:

    АктивнаяКнига.Cells(10, 5).Interior.Color = Цвета[51]; // Красим

    А терь ответ на возможный вопрос «А почему не переопределённый индекс присваиваешь, а цвет?» Отвечаю, опытным путём установлено что если ты переопределяешь индекс и с таким цветом другой индекс уже есть, он не переопределяется… а когда мы задаём ячейкам именно цвет а не индекс, он сам автоматически находит и подставляет нужный индекс.

    А теперь, как получить цифру цвета «14725528» ? Я не нашёл как сконвертировать из 1С в эксель цвет, поэтому пришлось написать прожку: http://infostart.ru/public/58687/

    Reply
  28. markers

    Так же могу выложить полностью обработку свою которая не привязана к базе (заполняет тестовыми данными) где применена и раскраска и закачка картинок и автоматическое сжатие картинок путём добавление макроса, выполнение и удаление макроса (чтоб у клиентов не вопило). Если есть интерес, то скажите, выложу.

    Reply
  29. UrbSI

    Хех. А мне кажется, что проще в 1С-ке заполнить табличную часть отчета(документа), затем, воспользовавшись атрибутами и методами области таблицы, раскрасить ее, а потом уж через меню «файл-сохранить как» сохранить как файл в формате еxcel. И будет красочно и красиво. 😀

    Reply
  30. markers

    (29) Несогласен! Если не смотреть на производительность то да, но вот если смотреть на неё и ещё если тебе надо сделать некоторые операции что через стандартные средства 1С никак не сделать, то очень даже лучше сразу формировать в эксель. Например у нас прайс формируется немного нестандартный (переделан стандартный), Например в нём есть поле «Код» с ведущими нулями и есть ссылка, если просто прогнать через стандартную в 1С, то у кода не будет нулей, и не будет ссылки, наш гореписатель (работал год назад) сделал так: Формировался прайс, сохранялся, открывался через ком, доделывалось нужное (ссылки, тип поля код) что не супер в плане производительности да и вообще всё было сделано очень криво, потому было решено написать формирование прайс-листа с нуля и сразу выгрузку в Excel, добавив поддержку таких фишек как добавление картинок. Конечно мне пришлось попарится и перерыть весь инет через разные поисковики, чтобы подготовить рыбу прайса которую наш 1С прогер наполнит данными. Кстати эту рыбу могу дать! Там перенос данных осуществляется через массив (а не поячеечно).

    См. Приложение! В той рыбе нет привязке к ИБ, только подправьте пути.

    Reply
  31. levran

    markers спасибо =)

    Reply
  32. Gal_B

    Цвета, к слову сказать, не совпадают. Пришлось «методом тыка» подбирать, но это в принципе не страшно))

    Reply

Leave a Comment

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