Действие, обратное http://infostart.ru/public/172688/ (собственно, "по заявкам" и сделано)
Функция ПолучитьHTMLизТаблицыЗначений(рТаблица,Знач рПараметры=«»,докВладелец=Неопределено) Экспорт
// распознаем параметры
Если ТипЗнч(рПараметры)<>Тип(«Структура») Тогда рПараметры=Новый Структура КонецЕсли;
//рКодировка=?(рПараметры.Свойство(«Кодировка»),рПараметры.Кодировка,»UTF-8″);
рШиринаРамки=?(рПараметры.Свойство(«ШиринаРамки»),рПараметры.ШиринаРамки,0); // в пикселях
Если рШиринаРамки<>0 Тогда // имеет смысл
рЦветРамки=?(рПараметры.Свойство(«ЦветРамки»),рПараметры.ЦветРамки,«»);
рЦветРамкиЯркий=?(рПараметры.Свойство(«ЦветРамкиЯркий»),рПараметры.ЦветРамкиЯркий,«»);
рЦветРамкиТёмный=?(рПараметры.Свойство(«ЦветРамкиТемный»),рПараметры.ЦветРамкиТемный,«»);
рТипРамки=?(рПараметры.Свойство(«ТипРамки»),рПараметры.ТипРамки,«hsides»);
рЛинии=?(рПараметры.Свойство(«Линии»),рПараметры.Линии,«all»);
КонецЕсли;
рМеждуЯчейками=?(рПараметры.Свойство(«МеждуЯчейками»),рПараметры.МеждуЯчейками,0);
рОтступДоЯчейки=?(рПараметры.Свойство(«ОтступДоЯчейки»),рПараметры.ОтступДоЯчейки,1);
рШирина=?(рПараметры.Свойство(«Ширина»),рПараметры.Ширина,100); // макс.ширина, пиксели или проценты
рВысота=?(рПараметры.Свойство(«Высота»),рПараметры.Высота,1);
рЦветФона=?(рПараметры.Свойство(«ЦветФона»),рПараметры.ЦветФона,«»);
рВыравнивание=?(рПараметры.Свойство(«Выравнивание»),рПараметры.Выравнивание,«center»);
рВыравниваниеГор=?(рПараметры.Свойство(«ВыравниваниеГоризонтальное»),рПараметры.ВыравниваниеГоризонтальное,«middle»);
рВыравниваниеВерт=?(рПараметры.Свойство(«ВыравниваниеВертикальное»),рПараметры.ВыравниваниеВертикальное,«center»);
// определимся с документом
Если докВладелец=Неопределено Тогда
док=Новый ДокументHTML(«»);
телдок=док.СоздатьЭлемент(«BODY»);
док.Тело=телдок;
Иначе
док=докВладелец;
телдок=док.Тело;
КонецЕсли;
// собственно делаем таблицу
таб=док.СоздатьЭлемент(«TABLE»);
// ставим параметры таблицы в целом, имеющие свойства в объектной модели 1С
таб.Выравнивание=рВыравнивание; // align
таб.Рамка=СокрЛП(рШиринаРамки); // border
таб.ОтступДоЯчейки=СокрЛП(рОтступДоЯчейки); // cellPadding
таб.РасстояниеМеждуЯчейками=СокрЛП(рМеждуЯчейками); // cellSpacing
таб.ЦветФона=СокрЛП(рЦветФона); // bgColor
таб.Ширина=СокрЛП(рШирина); // width
Если рШиринаРамки<>0 Тогда // имеет смысл
таб.Линии=СокрЛП(рЛинии); // rules (допустимо: all, groups, cols, none, rows)
КонецЕсли;
// ставим параметры таблицы в целом, НЕ имеющие свойств в объектной модели 1С
// ставим их в атрибуты именно к таб, а не ко всему Телу документа, и не к Телу таблицы
атр=док.СоздатьАтрибут(«height»);
атр.Значение=СокрЛП(рВысота);
таб.Атрибуты.УстановитьИменованныйЭлемент(атр);
//
атр=док.СоздатьАтрибут(«cols»); // общее объявление
атр.Значение=СокрЛП(рТаблица.Колонки.Количество());
таб.Атрибуты.УстановитьИменованныйЭлемент(атр);
//
//атр=док.СоздатьАтрибут(«nowrap»); // запрет переносов текста (кому понадобится, раскомментите)
//атр.Значение=Истина;
//таб.Атрибуты.УстановитьИменованныйЭлемент(атр);
// аналогичным образом можно устанавливать прочие свойства таблицы в целом, её строк и ячеек
Если рШиринаРамки<>0 Тогда // имеет смысл
атр=док.СоздатьАтрибут(«borderColor»);
атр.Значение=СокрЛП(рЦветРамки);
таб.Атрибуты.УстановитьИменованныйЭлемент(атр);
атр=док.СоздатьАтрибут(«borderColorLight»);
атр.Значение=СокрЛП(рЦветРамкиЯркий);
таб.Атрибуты.УстановитьИменованныйЭлемент(атр);
атр=док.СоздатьАтрибут(«borderColorDark»);
атр.Значение=СокрЛП(рЦветРамкиТёмный);
таб.Атрибуты.УстановитьИменованныйЭлемент(атр);
// доступные типы рамок: void, above, below, lhs, rhs, hsides, vsides, box
атр=док.СоздатьАтрибут(«frame»);
атр.Значение=СокрЛП(рТипРамки);
таб.Атрибуты.УстановитьИменованныйЭлемент(атр);
КонецЕсли;
// добавляем таблицу и её тело
телдок.ДобавитьДочерний(таб);
телтаб=док.СоздатьЭлемент(«TBODY»);
таб.ДобавитьДочерний(телтаб);
// заполняем таблицу
Для каждого рСтрока Из рТаблица Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
стро=таб.ВставитьСтроку(1); // вопреки документации, Индекс это обязательный параметр
// хотя, строку можно добавлять и так: стро=док.СоздатьЭлемент(«TR»), но ИндексСтроки поменять будет нельзя!
стро.ВертикальноеПоложение=рВыравниваниеВерт;
стро.Выравнивание=рВыравниваниеГор;
стро.ЦветФона=рЦветФона;
телтаб.ДобавитьДочерний(стро);
// коллекция Ячейки — для чтения, а нам надо добавлять
Для каждого кол Из рТаблица.Колонки Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
//яч=стро.ВставитьЯчейку(1); // а вот это почему-то вообще не заработало ни при каких…
яч=док.СоздатьЭлемент(«TD»); // поэтому делаем так
рЗначение=рСтрока[кол.Имя];
Если ТипЗнч(рЗначение)=Тип(«ТаблицаЗначений») Тогда
яч.ДобавитьДочерний(ПолучитьHTMLизТаблицыЗначений(рЗначение,рПараметры,док));
ИначеЕсли ТипЗнч(рЗначение)=Тип(«Массив») Тогда
Для каждого знч Из рЗначение Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
Если ТипЗнч(знч)=Тип(«ТаблицаЗначений») Тогда
яч.ДобавитьДочерний(ПолучитьHTMLизТаблицыЗначений(знч,рПараметры,док));
Иначе // вложенные массивы поддерживать не будем, но при желании можно сделать
тек=док.СоздатьЭлемент(«P»); // можно, например, так
тек.ТекстовоеСодержимое=СокрЛП(Строка(знч));
яч.ДобавитьДочерний(тек);
КонецЕсли;
КонецЦикла;
Иначе // записываем строковое представление
яч.ТекстовоеСодержимое=СокрЛП(Строка(рЗначение));
КонецЕсли;
стро.ДобавитьДочерний(яч);
КонецЦикла;
КонецЦикла;
Если докВладелец<>Неопределено Тогда
Возврат таб; // нужна таблица как ЭлементHTML
Иначе
// нужен полноценный текст результата, записываем получившееся
зап1=Новый ЗаписьHTML;
зап1.УстановитьСтроку(); // вопреки документации, параметр Кодировка не допускается
зап2=Новый ЗаписьDOM; // обойдёмся без явного указания конфигурации записи DOM
зап2.Записать(док,зап1);
Возврат зап1.Закрыть();
КонецЕсли;
КонецФункции
И собственно пример вызова функции:
рПараметры=Новый Структура;
рПараметры.Вставить(«ШиринаРамки»,2);
рПараметры.Вставить(«ТипРамки»,«box»);
рПараметры.Вставить(«ЦветРамки»,«#99cc00»);
рПараметры.Вставить(«ЦветРамкиЯркий»,«#00ff00»);
рПараметры.Вставить(«ЦветРамкиТемный»,«#339966»);
рПараметры.Вставить(«МеждуЯчейками»,0);
рПараметры.Вставить(«ОтступДоЯчейки»,1);
рПараметры.Вставить(«Ширина»,«70%»);
рПараметры.Вставить(«Высота»,1);
рПараметры.Вставить(«ЦветФона»,«#fffacd»);
рПараметры.Вставить(«Выравнивание»,«center»); // всей таблицы
рПараметры.Вставить(«ВыравниваниеГоризонтальное»,«middle»); // текста в ячейках
рПараметры.Вставить(«ВыравниваниеВертикальное»,«center»); // текста в ячейках
//
тб=новый таблицазначений;
тб.Колонки.Добавить(«к1»); тб.Колонки.Добавить(«к2»); тб.Колонки.Добавить(«к3»);
стро=тб.Добавить(); стро.к1=«1»; стро.к2=«2»; стро.к3=«3»;
стро=тб.Добавить(); стро.к1=«4»; стро.к2=«5»; стро.к3=«6»;
тб2=тб.СкопироватьКолонки();
стро=тб2.Добавить(); стро.к1=«Всем»; стро.к2=«большой»; стро.к3=«привет!»;
стро=тб2.Добавить(); стро.к1=«Это пример»; стро.к2=«преобразования таблицы значений»; стро.к3=«в html-таблицу»;
мас=Новый Массив;
мас.Добавить(«Текст выше таблички»); мас.Добавить(тб2); мас.Добавить(«Текст ниже таблички»);
стро=тб.Добавить(); стро.к1=мас; стро.к2=тб2.Скопировать(); стро.к3=«молодцы»;
Сообщить(ПолучитьHTMLизТаблицыЗначений(тб,рПараметры));
Интересно. А нет у тебя заготовок для ТабличныйДокумент -> HTML Table? Интересует перенос оформления в html?
(1) Нету. Если табличный документ не сильно «красивый» да навороченный, можно его через таблицу значений кинуть.
Вот спасибо.
Молодец автор, большую работу сделал!
Отдельное спасибо за то, что выложил текстом, и не приходится скачивать.
Спасибо большое, очень пригодилось.
Очень полезная функция! Спасибо!
Спасибо, очень помогло.
А как можно поменять программно цвет текста в таблице, причем в строках одной конкретной колонки?
(9) juliia1992, придётся немножко покодить, прямо так по-простому вряд ли получится. Сделать?
Спасибо большое!!!
Спасибо
Спасибо. В копилку.
Спасибо огромное! А как добавить шапку таблицы из наименования колонок?
(1) Табличный документ по умолчанию умеет в HTML сохраняться, СКД так сохраняю. Правда только целиком и лишние столбцы справа захватывает, не нашел адекватного способа это побороть
(14) Вызывать те же действия, что пишут конкретную строку таблицы (поячейно-поколонно), только для самой коллекции колонок. Ну, дизайн можно другой наворотить)
(15) Табличные документы проще сериализовать, раздербанить с помощью DOM, например, и вывалить в HTML так же, как показано в этой публикации.
(17) Я так понял у вас из таблиц значений HTML генерируется, а мне надо прямоугольную область из табличного документа с сохранением форматирования(хоть примерным). Не очень представляю как обрабатывать сериализованный табличный документ
(18) вот и говорю, берёте табличный документ со всей прелестью, что в нём, превращаете в xml, а оттуда в html. Примеры кода можно глянуть тут:http://infostart.ru/public/531533/ Обрабатывать его довольно просто, там структура в общем интуитивно понятная. Можно обрабатывать как xml, можно как DOM, можно вообще как текстовый файл.
(18) Вот, дошли руки:
Показать