8.х Выгрузка из 1С в Word через ТабличныйДокумент

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем metaltao, 22 май 2010.

  1. TopicStarter Overlay
    metaltao
    Offline

    metaltao

    Регистрация:
    19 апр 2008
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Доброго дня/вечера/утра, уважаемые пользователи!
    Очередной вопрос возник по работе с Word. Вот и обращаюсь к вам!

    Делаю выгрузку из табличного документа в документ doc. Выгружаю таблицу. Однако у ячеек таблицы разный размер. Параметр "ШиринаКолонки" (как написано в помощнике) содержит ширину колонок в области (в так называемых средних символах шрифта). Фраза абсолютно непонятная :( Нашла в интернете автоматическую установку ширины колонки, из которой можно сделать вывод, что этот параметр содержит количество символов в ячейке. Однако сие ничем не подкреплено :(

    В свойствах ячейки таблицы Word есть два параметра для загрузки ширины - "Width" и "PreferredWidth". Опять же покопавшись в интернете выяснила, что параметр "PreferredWidth" как раз и подходит для установки ширины. В данном параметре значение хранится в пунктах.

    Вот и возник вопрос - каким образом преобразовать значение из параметра "ШиринаКолонки" в значение параметра "PreferredWidth". То бишь как преобразовать средние символы шрифта к пунктам (или сантиметрам, что тоже подходит).

    Вот примерный код, который у меня получился:
    Код:
        Таблица = ДокWord.Tables.Item(1);
    // Пройдем по табличному документу для получения данных
    Для ТекущаяСтрока = 1 По КонечнаяСтрока Цикл
    Для ТекущаяКолонка = 1 По КонечныйСтолбец Цикл    
    // Получим область текущей ячейки
    ОбластьЯчейки = ТабДок.Область(ТекущаяСтрока, ТекущаяКолонка);
    // Получим текст ячейки
    ТекстЯчейки = ОбластьЯчейки.Текст;
    // Запишем полученный текст в ячейку созданной таблицы
    ЯчейкаТаблицы = Таблица.Cell(ТекущаяСтрока, ТекущаяКолонка);
    ЯчейкаТаблицы.Range().InsertAfter(ТекстЯчейки);
    ЯчейкаТаблицы.PreferredWidthType = 1;
    ЯчейкаТаблицы.PreferredWidth = ОбластьЯчейки.ШиринаКолонки; 
    КонецЦикла;
    КонецЦикла;
    
    
    
    Однако ячейки в сформированном документе получаются странной ширины - не такой, как в ТабДок. Пробовала умножать ширину колонки на размер шрифта в данной ячейке в пунктах, но тоже выходит не очень :(
    А может быть есть другой способ? Помогите, пожалуйста!
    Заранее спасибо за ответы!
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Честно говоря, навскидку вспомню только один способ - вывести на экран ТП и получить размер области.
    Еще вариант - посмотреть в макете, сколько мм в размере...
  3. TopicStarter Overlay
    metaltao
    Offline

    metaltao

    Регистрация:
    19 апр 2008
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    по поводу мм в макете: не получится :( пишу обработку "универсальную" для большого количества документов, чьи печатные формы нужно выгружать в док (excel не предлагать - нужно именно в doc).

    а вот про вывод на экран можно поподробнее? если не очень сложно :unsure:
  4. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Так, по моему, наврал. Я вывод на экран применял для другого...
    Надо проверять.

    Как вариант (дурацкий, правда) - делаем таблицу размеров в зависимости от шрифта и ее используем для расчета. Но это - изврат, конечно...

    Думаю, что я бы пошел в этом случае через пропорции. Т.е. известна ширина страницы, потом вычисляем соотношение длин ячеек и так же делаем для ворда уже. Это будет работать всегда.
  5. TopicStarter Overlay
    metaltao
    Offline

    metaltao

    Регистрация:
    19 апр 2008
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Пропорции - это вариант... Правда тут есть небольшая проблема: у ячеек, в которых нет текста, ШиринаКолонки = 0 (или фиг знает от чего это зависит... у меня были очень маленькие пустые ячейки, но с ШиринаКолонки = 0.125). Поэтому пришлось делать всё топорным способом :)
    На скорую руку сделала вычисление 10 мм ячейки (примерно при этом ШиринаКолонки = 4.88) и просто умножала на нужные мне величины. Ну и переводила потом в пункты стандартной функцией word :) взяла миллиметры просто так - реально можно было и сантиметры :)

    Код:
        Таблица = ДокWord.Tables.Item(1);
    // Пройдем по табличному документу для получения данных
    Для ТекущаяСтрока = 1 По КонечнаяСтрока Цикл
    Для ТекущаяКолонка = 1 По КонечныйСтолбец Цикл    
    // Получим область текущей ячейки
    ОбластьЯчейки = ТабДок.Область(ТекущаяСтрока, ТекущаяКолонка);
    // Получим текст ячейки
    ТекстЯчейки = ОбластьЯчейки.Текст;
    // Запишем полученный текст в ячейку созданной таблицы
    ЯчейкаТаблицы = Таблица.Cell(ТекущаяСтрока, ТекущаяКолонка);
    ЯчейкаТаблицы.Range().InsertAfter(ТекстЯчейки);
    ЯчейкаТаблицы.PreferredWidthType = 3;
    ЯчейкаТаблицы.PreferredWidth = Word.MillimetersToPoints(ОбластьЯчейки.ШиринаКолонки * 10 / 4.88); 
    КонецЦикла;
    КонецЦикла;
    
    
    ПС BabySG, давно хотела сказать - спасибо Вам большое за помощь :) не первый раз меня выручаете! СПАСИБО!
  6. TopicStarter Overlay
    metaltao
    Offline

    metaltao

    Регистрация:
    19 апр 2008
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Значит проблема решалась следующим образом:
    Так как все макеты у меня под A4 сделаны, то пришлось подстраивать ширину таблицы под ширину документа. Отступы документа сделала стандартными, а в оставшиеся сантиметры растягивала (или сжимала) таблицу.

    В табличном документе есть параметр ШиринаКолонки, который содержит ширину колонок в области (в так называемых средних символах шрифта). Если этот параметр подогнать под сантиметры (или миллиметры), то тогда легко можно растянуть таблицу на A4. Для подгонки я попробовала умножать на разные числа и в итоге получила следующий алгоритм:

    1. Вычисляем ширину таблицы в так называемых средних символах шрифта.
    2. Вычисляем свободную область документа (без отступов).
    3. Начиная с 1 ищем такой множитель, чтобы произведение ширины таблицы и множителя дали мне значение меньшее либо равное количеству сантиметров в свободной области.
    4. При выводе таблицы в документ word перевожу полученную ширину в точки (стандартными средствами word).

    Ну и собстно сам код:
    Код:
        // Получить таблицу как объект в отдельную переменную (таблица единственная)
    Таблица = ДокWord.Tables.Item(1);
    // Установим предпочитаемую ширину колонок всей таблицы
    Таблица.Columns.PreferredWidth = Word.MillimetersToPoints(0);
    // Создадим массив для хранения ширин колонок
    ШириныСтолбцов = Новый Массив();
    Для Индекс = 1 По КонечныйСтолбец Цикл
    ШириныСтолбцов.Добавить(0);
    КонецЦикла; 
    
    Для ТекущаяСтрока = 1 По КонечнаяСтрока Цикл
    Для ТекущаяКолонка = 1 По КонечныйСтолбец Цикл
    // Получим область текущей ячейки
    ОбластьЯчейки = ТабДок.Область(ТекущаяСтрока, ТекущаяКолонка);
    // Посчитаем максимальную ширину колонки 
    Если ОбластьЯчейки.ШиринаКолонки > ШириныСтолбцов[ТекущаяКолонка - 1] Тогда
    ШириныСтолбцов[ТекущаяКолонка - 1] = ОбластьЯчейки.ШиринаКолонки;
    КонецЕсли; 
    КонецЦикла; 
    КонецЦикла; 
    
    // 210 - ширина документа word A4 в миллиметрах
    МаксимальноДоступнаяШирина = 210 - ТабДок.ПолеСлева - ТабДок.ПолеСправа;
    
    ШиринаТаблицы = 0;
    Для Индекс = 0 По ШириныСтолбцов.ВГраница() Цикл
    ШиринаТаблицы= ШиринаТаблицы+ ШириныСтолбцов[Индекс];
    КонецЦикла; 
    Делитель = 1;
    НайденДелитель = Ложь;
    Пока НЕ НайденДелитель Цикл
    Если ШиринаТаблицы* 10 / Делитель >= МаксимальноДоступнаяШирина Тогда
    Делитель = Делитель + 0.01;
    Иначе
    НайденДелитель = Истина;
    КонецЕсли; 
    КонецЦикла; 
    // Пройдем по табличному документу для получения данных
    Для ТекущаяСтрока = 1 По КонечнаяСтрока Цикл
    Для ТекущаяКолонка = 1 По КонечныйСтолбец Цикл    
    // Получим область текущей ячейки
    ОбластьЯчейки = ТабДок.Область(ТекущаяСтрока, ТекущаяКолонка);
    // Получим текст ячейки
    ТекстЯчейки = ОбластьЯчейки.Текст;
    // Запишем полученный текст в ячейку созданной таблицы
    ЯчейкаТаблицы = Таблица.Cell(ТекущаяСтрока, ТекущаяКолонка);
    ЯчейкаТаблицы.Range().InsertAfter(ТекстЯчейки);
    ЯчейкаТаблицы.PreferredWidthType = 3;
    ЯчейкаТаблицы.PreferredWidth = Word.MillimetersToPoints(ШириныСтолбцов[ТекущаяКолонка - 1]); 
    КонецЦикла;
    КонецЦикла;
    
    
    
    
    Не хватает тут подгонки текста под измененную ячейку (она же могла и уменьшиться) и работы с объединенными ячейками...
    Ну и работает только для макетов, у которых на каждой строчке одинаковое количество колонок. так что не ругайте сильно :)

    Надеюсь, что кому-нибудь пригодится :)

Поделиться этой страницей