Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение finsoftrz »

Вот бланк в rtf, сформированный FRB. Его смотреть надо через Word. OpenOffice имеет погрешность в вычислении горизонтальных координат фреймов (разные единицы измерения относительно Word). Поэтому в настройках программ я задаю, какой пакет используется, и в своем дизайнере автоматически корректирую погрешность. Если открыть в блокноте, то можно достаточно легко разобраться, как формировать. Когда Word сохраняет файл в rtf, то включает туда кучу служебной информации, а тут все чисто и прозрачно. Для договоров я такой подход не рекомендовал бы.
Вложения
1.zip
(3.65 КБ) 167 скачиваний
C6/C11, ШВС, tps/btrieve.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение Yufil »

Брось взгляд на генератор отчётов combit List & Label. Есть совсем простой пример Кларион-приложения ( examples\people.app ) с экспортом в rtf/pdf/xls https://mega.nz/#!lsRDjQrJ!3Vldj49d4Zyx ... F3oK91lh_o. Cейчас вроде бы можно генерить и docx, давно не смотрел.

Бланки могут правиться пользователями ( было такое ), можно поиграться с примером. Но, естественно, не без ограничений.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение RaFaeL »

Игорь Столяров писал(а): 13 Февраль 2020, 5:41 Кратко поясню происходящее:
1. Находим поле табличного блока (и устанавливаем курсор в левую верхнюю ячейку таблицы);
2. Вставляем значение каждой колонки в текущую ячейку и "нажимаем клавишу" стрелка вправо.
3. При заполнении строки, Word сам добавляет новую строку и переходит на неё - поэтому после
последнего поля, последней записи - не делаем "нажатие клавиши" (иначе будет пустая, лишняя строка).
4. Всё. Таблица вставлена. Надеюсь, что излишне говорить о том, что пользователь сам может задать в шаблоне
нужные ему форматы, выравнивание, оформление, цвета и т.д. отдельно для каждой ячейки в таблице …
Игорь, я извиняюсь, но эмулировать "нажатия клавиш" это детский сад, а не программирование. А если он это вот [T01] не в таблице напишет? Я уж не говорю о том, что все видимо заточено под какую-то жестко заданную таблицу. Несерьезно все это, никакой "защиты от дурака"
Последний раз редактировалось RaFaeL 13 Февраль 2020, 10:33, всего редактировалось 1 раз.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение RaFaeL »

Yufil писал(а): 13 Февраль 2020, 9:55 Брось взгляд на генератор отчётов combit List & Label.
У нас свой весьма навороченный редактор отчетов, вопрос только в записи в необходимый формат файла, сам редактор отчетов необходимо оставить свой
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение Игорь Столяров »

RaFaeL писал(а): 13 Февраль 2020, 10:23 но эмулировать "нажатия клавиш" это детский сад
"Нажатие клавиши" - это я Вам написал смысл действия Application.Selection.MoveRight(12), никаких клавиатурных команд там нет. :)
RaFaeL писал(а): 13 Февраль 2020, 10:23 Несерьезно все это, никакой "защиты от дурака"
Насколько я понимаю, есть 2 пути:
- создаётся общепринятый DOC/XLS на основании отчёта программы (как в 1С);
- пользователь (или настройщик) сам задаёт оформление и содержание отчёта в шаблоне, а программа его заполняет данными.

Во втором случае, конечно существуют некоторые правила создания шаблона для отчёта, расстановки полей, графики и т.д.
Если указанный Вами вопрос доминирует, то можно закрыть для пользователей редактирование шаблонов, у нас был
вариант, когда шаблоны отчетов хранились в BLOB и обновлялись вместе с версией программы.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение Игорь Столяров »

RaFaeL писал(а): 13 Февраль 2020, 10:27 У нас свой весьма навороченный редактор отчетов
Готов поспорить, что ни у кого нет редактора отчётов круче, чем обычный Microsoft Word (если в нём делать шаблоны отчётов). :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение RaFaeL »

finsoftrz писал(а): 13 Февраль 2020, 9:11 Вот бланк в rtf, сформированный FRB. Если открыть в блокноте, то можно достаточно легко разобраться, как формировать.
Спасибо, вот это подходящий под задачу вариант, мне очень понравилось. Еще бы примеров кода ((
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение RaFaeL »

Игорь Столяров писал(а): 13 Февраль 2020, 10:46 Насколько я понимаю, есть 2 пути:
- создаётся общепринятый DOC/XLS на основании отчёта программы (как в 1С);
- пользователь (или настройщик) сам задаёт оформление и содержание отчёта в шаблоне, а программа его заполняет данными.

Во втором случае, конечно существуют некоторые правила создания шаблона для отчёта, расстановки полей, графики и т.д.
Если указанный Вами вопрос доминирует, то можно закрыть для пользователей редактирование шаблонов, у нас был
вариант, когда шаблоны отчетов хранились в BLOB и обновлялись вместе с версией программы.
Здесь смотрите какая ситуация. У нас есть простенький модуль заполнения готовых вордовских файлов через поля (переменные). Он древний, написан лет 15 назад на скорую руку, не развиваем. И есть визуальный редактор форм с экспортом в разные форматы (сейчас поддерживается wmf, png, pdf, xls, xlsx), что-то типа как в 1С. Там нет никаких шаблонов файлов, все хранится в наших внутренних структурах. И вот в этот редактор надо прикрутить экспорт в Word (либо во что-то, что понимает Word).
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение Игорь Столяров »

RaFaeL писал(а): 13 Февраль 2020, 11:07 И вот в этот редактор надо прикрутить экспорт в Word
Всё - понял. Вам нужен конвертер готовых отчётных форм в файл, который можно открыть Microsoft Word. :)
Кстати, здесь можно рассмотреть варианты работы с OCR или PDF (есть библиотеки конвертации PDF в DOC).
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение RaFaeL »

Игорь Столяров писал(а): 13 Февраль 2020, 11:16 Всё - понял. Вам нужен конвертер готовых отчётных форм в файл, который можно открыть Microsoft Word.
Ну так я сразу так в заголовке и написал
есть библиотеки конвертации PDF в DOC.
Ищу, не могу найти, от 2500$
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение finsoftrz »

RaFaeL писал(а): 13 Февраль 2020, 10:54
finsoftrz писал(а): 13 Февраль 2020, 9:11 Вот бланк в rtf, сформированный FRB. Если открыть в блокноте, то можно достаточно легко разобраться, как формировать.
Спасибо, вот это подходящий под задачу вариант, мне очень понравилось. Еще бы примеров кода ((
Это все в составе навороченного класса дизайнера. Выдрал рутинку, которая выводит в rtf, может, поможет чем.

Код: Выделить всё

outRTF_r  routine   !вывод в rtf
   DATA
lor:date   long
lor:clock  long
lor:korX2  real
lor:korY2  real
lor:korL   real

lor:h      real

lor:queueFonts queue, pre()
lor:font  string(32)
  end

lor:queueColors queue, pre()
lor:color  long
  end

lor:j          long
lor:f          string(3)
lor:colorFont  string(32)
lor:colorBgr   string(32)
lor:colorLine  string(32)
lor:colorWhite string(32)
lor:colorTmp   long
lor:colorInb   byte,DIM(4),OVER(lor:colorTmp)

   CODE

   if SELF.FlagRTF=0
      loc:err=7
      exit
   end

   if SELF.FileNameRTF=''
      loc:err=7
      exit
   end 
   if sub(lower(SELF.FileNameRTF),len(clip(SELF.FileNameRTF))-3,4)<>'.rtf'
      SELF.FileNameRTF=clip(SELF.FileNameRTF) & '.rtf'
   end 

   if exists(SELF.FileNameRTF)
      remove(SELF.FileNameRTF)
   end

   ASCIIFile{PROP:NAME}=SELF.FileNameRTF
   create(ASCIIFile)
   open(ASCIIFile)
   if error()
      loc:err=8
      exit
   end

   lor:date=today()
   lor:clock=clock()
   SELF.SetKoeff(1)   !тест

   loop loc:i=1 to records(SELF.DrawButtonsRTF)
      get(SELF.DrawButtonsRTF,loc:i)
      if SELF.DrawButtonsRTF.ButtonFontName<>''
         lor:font=SELF.DrawButtonsRTF.ButtonFontName
         get(lor:queueFonts,lor:font)
         if error()
            add(lor:queueFonts,lor:font)
         end
      end
      if SELF.DrawButtonsRTF.ButtonFontColor>0
         clear(lor:queueColors)
         lor:color=SELF.DrawButtonsRTF.ButtonFontColor
         get(lor:queueColors,lor:color)
         if error()
            add(lor:queueColors,lor:color)
         end
      end
      if SELF.DrawButtonsRTF.ButtonBackGround>0 and SELF.DrawButtonsRTF.ButtonFlagBackGround=1
         clear(lor:queueColors)
         lor:color=SELF.DrawButtonsRTF.ButtonBackGround
         get(lor:queueColors,lor:color)
         if error()
            add(lor:queueColors,lor:color)
         end
      end
      if SELF.DrawButtonsRTF.ButtonBorderColor>0
         clear(lor:queueColors)
         lor:color=SELF.DrawButtonsRTF.ButtonBorderColor
         get(lor:queueColors,lor:color)
         if error()
            add(lor:queueColors,lor:color)
         end
      end
   end

   arf:rec='{{\rtf1\ansi\deff0'
   add(ASCIIFile)
   arf:rec='{{\fonttbl{{\f0\fcharset204 Arial;}'
   if records(lor:queueFonts)>0
      loop lor:j=1 to records(lor:queueFonts)
         get(lor:queueFonts,lor:j)
         arf:rec=clip(arf:rec) & '{{\f' & lor:j & '\fcharset204 ' & clip(lor:font) & ';}'
      end
   end
   arf:rec=clip(arf:rec) & '}'
   add(ASCIIFile)
   arf:rec='{{\colortbl \red0\green0\blue0;'
   if records(lor:queueColors)>0
      loop lor:j=1 to records(lor:queueColors)
         get(lor:queueColors,lor:j)
         lor:colorTmp=lor:color
         arf:rec=clip(arf:rec) & '\red' & lor:colorInb[1] & '\green' & lor:colorInb[2] & '\blue' & lor:colorInb[3] & ';'
      end
   end
   lor:colorTmp=COLOR:White
   arf:rec=clip(arf:rec) & '\red' & lor:colorInb[1] & '\green' & lor:colorInb[2] & '\blue' & lor:colorInb[3] & ';'
   lor:colorWhite='\brdrcf' & records(lor:queueColors)+1   !белые границы для скрытия рамки

   arf:rec=clip(arf:rec) & '}'
   add(ASCIIFile)
   arf:rec='{{\info{{\title ' & clip(SELF.ReportComment) & '}{{\author ФинСофт:Дизайнер бланков}' & |
           '{{\creatim\yr' & year(lor:date) & '\mo' & format(month(lor:date),@n02) & '\dy' & format(day(lor:date),@n02) & |
           '\hr' & sub(format(lor:clock,@t01),1,2) & '\min' & sub(format(lor:clock,@t01),4,2) & '}' & | 
           '{{\*\windowcaption ' & clip(SELF.ReportComment) & '}}'
   add(ASCIIFile)
   if SELF.ReportPaperNoStd=0
      if SELF.ReportFlagLand=0
         arf:rec='\paperw' & (round(8252*1445.4/1000,1)) & '\paperh' & (round(11688*1445.4/1000,1)) & '\margl' & round(SELF.ReportMargLeft*567/10,1) & '\margr' & round(SELF.ReportMargRight*567/10,1) & '\margt' & round(SELF.ReportMargTop*567/10,1) & '\margb' & round(SELF.ReportMargBottom*567/10,1) & '\sectd\psz256\viewkind1\viewscale100\viewzk0'
      else
         arf:rec='\paperw' & (round(11688*1445.4/1000,1)) & '\paperh' & (round(8252*1445.4/1000,1)) & '\margl' & round(SELF.ReportMargLeft*567/10,1) & '\margr' & round(SELF.ReportMargRight*567/10,1) & '\margt' & round(SELF.ReportMargTop*567/10,1) & '\margb' & round(SELF.ReportMargBottom*567/10,1) & '\sectd\psz256\viewkind1\viewscale100\viewzk0\landscape'
      end
   else
      if SELF.ReportFlagLand=0
         arf:rec='\paperw' & (round(8252/210*SELF.ReportPaperWidth*1445.4/1000,1)) & '\paperh' & (round(8252/210*SELF.ReportPaperHeight*1445.4/1000,1)) & '\margl' & round(SELF.ReportMargLeft*567/10,1) & '\margr' & round(SELF.ReportMargRight*567/10,1) & '\margt' & round(SELF.ReportMargTop*567/10,1) & '\margb' & round(SELF.ReportMargBottom*567/10,1) & '\sectd\psz256\viewkind1\viewscale100\viewzk0'
      else
         arf:rec='\paperw' & (round(8252/210*SELF.ReportPaperHeight*1445.4/1000,1)) & '\paperh' & (round(8252/210*SELF.ReportPaperWidth*1445.4/1000,1)) & '\margl' & round(SELF.ReportMargLeft*567/10,1) & '\margr' & round(SELF.ReportMargRight*567/10,1) & '\margt' & round(SELF.ReportMargTop*567/10,1) & '\margb' & round(SELF.ReportMargBottom*567/10,1) & '\sectd\psz256\viewkind1\viewscale100\viewzk0\landscape'
      end
   end
   add(ASCIIFile)

   loop loc:i=1 to records(SELF.DrawButtonsRTF)
      get(SELF.DrawButtonsRTF,loc:i)
      if SELF.DrawButtonsRTF.ButtonID=-1 and loc:i>1 
        arf:rec='\par\pard\plain'
        add(ASCIIFile)
        arf:rec='\par\page'
        add(ASCIIFile)
        cycle
      end 

      if SELF.DrawButtonsRTF.ButtonFontName=''
         lor:f='\f0'
      else
         lor:font=SELF.DrawButtonsRTF.ButtonFontName
         get(lor:queueFonts,lor:font)
         lor:f='\f' & pointer(lor:queueFonts)
      end

      lor:colorFont=''
      lor:colorBgr=''
      lor:colorLine=''
      if SELF.DrawButtonsRTF.ButtonBackGround>0 and SELF.DrawButtonsRTF.ButtonFlagBackGround=1
         clear(lor:queueColors)
         lor:color=SELF.DrawButtonsRTF.ButtonBackGround
         get(lor:queueColors,lor:color)
         lor:colorBgr='\cbpat' & pointer(lor:queueColors)
      end
      if SELF.DrawButtonsRTF.ButtonBorderColor>0
         clear(lor:queueColors)
         lor:color=SELF.DrawButtonsRTF.ButtonBorderColor
         get(lor:queueColors,lor:color)
         lor:colorLine='\brdrcf' & pointer(lor:queueColors)
      end
      if SELF.DrawButtonsRTF.ButtonFontColor>0
         clear(lor:queueColors)
         lor:color=SELF.DrawButtonsRTF.ButtonFontColor
         get(lor:queueColors,lor:color)
         lor:colorFont='\cf' & pointer(lor:queueColors)
      end

      if SELF.DrawButtonsRTF.ButtonType=0   !текст
         arf:rec='\par\pard\plain'
         if band(SELF.DrawButtonsRTF.ButtonFontStyle,FONT:bold)=700 
            arf:rec=clip(arf:rec) & '\b'
         end
         if band(SELF.DrawButtonsRTF.ButtonFontStyle,FONT:italic)>0 
            arf:rec=clip(arf:rec) & '\i'
         end
         if band(SELF.DrawButtonsRTF.ButtonFontStyle,FONT:underline)>0 
            arf:rec=clip(arf:rec) & '\ul'
         end
         if band(SELF.DrawButtonsRTF.ButtonFontStyle,FONT:strikeout)>0 
            arf:rec=clip(arf:rec) & '\strike'
         end
         arf:rec=clip(arf:rec) & lor:colorFont
         case SELF.DrawButtonsRTF.ButtonTextJust
            of 0   !влево
               arf:rec=clip(arf:rec) & '\ql'
            of 1   !вправо
               arf:rec=clip(arf:rec) & '\qr'
            of 2   !центр
               arf:rec=clip(arf:rec) & '\qc'
         end 
         if SELF.PrgViewRTF=0   !MCO
            SELF.DrawButtonsRTF.ButtonPadLeft=2   !делаем стандартные отступы, что избежать погрешностей????
            SELF.DrawButtonsRTF.ButtonPadRight=2
         end 
         if SELF.DrawButtonsRTF.ButtonLineW>1  !корректировка поля отступа для жирных линий
            lor:korL=10
         else
            lor:korL=0
         end
         if SELF.DrawButtonsRTF.ButtonLeft=1
            arf:rec=clip(arf:rec) & '\brdrl\brdrs\brdrw' & round(choose(SELF.DrawButtonsRTF.ButtonLineW=0,1,SELF.DrawButtonsRTF.ButtonLineW)*10,1) & clip(lor:colorLine) & '\brsp' & round(SELF.DrawButtonsRTF.ButtonPadLeft*SELF.ReportKoefX*10-lor:korL,1)
         else
            arf:rec=clip(arf:rec) & '\brdrl\brdrs\brdrw' & round(choose(SELF.DrawButtonsRTF.ButtonLineW=0,1,SELF.DrawButtonsRTF.ButtonLineW)*10,1) & clip(lor:colorWhite) & '\brsp' & round(SELF.DrawButtonsRTF.ButtonPadLeft*SELF.ReportKoefX*10,1)
         end
         if SELF.DrawButtonsRTF.ButtonRight=1
            arf:rec=clip(arf:rec) & '\brdrr\brdrs\brdrw' & round(choose(SELF.DrawButtonsRTF.ButtonLineW=0,1,SELF.DrawButtonsRTF.ButtonLineW)*10,1) & clip(lor:colorLine) & '\brsp' & round(SELF.DrawButtonsRTF.ButtonPadRight*SELF.ReportKoefX*10-lor:korL,1)
         else
            arf:rec=clip(arf:rec) & '\brdrr\brdrs\brdrw' & round(choose(SELF.DrawButtonsRTF.ButtonLineW=0,1,SELF.DrawButtonsRTF.ButtonLineW)*10,1) & clip(lor:colorWhite) & '\brsp' & round(SELF.DrawButtonsRTF.ButtonPadRight*SELF.ReportKoefX*10,1)
         end
         if SELF.DrawButtonsRTF.ButtonTop=1
            arf:rec=clip(arf:rec) & '\brdrt\brdrs\brdrw' & round(choose(SELF.DrawButtonsRTF.ButtonLineW=0,1,SELF.DrawButtonsRTF.ButtonLineW)*10+10,1) & clip(lor:colorLine) & '\brsp' & round(SELF.DrawButtonsRTF.ButtonPadTop*SELF.ReportKoefY-lor:korL,1)
         else
            arf:rec=clip(arf:rec) & '\brdrt\brdrs\brdrw' & round(choose(SELF.DrawButtonsRTF.ButtonLineW=0,1,SELF.DrawButtonsRTF.ButtonLineW)*10,1) & clip(lor:colorWhite) & '\brsp' & round(SELF.DrawButtonsRTF.ButtonPadTop*SELF.ReportKoefY,1)
         end
         if SELF.DrawButtonsRTF.ButtonBottom=1
            arf:rec=clip(arf:rec) & '\brdrb\brdrs\brdrw' & round(choose(SELF.DrawButtonsRTF.ButtonLineW=0,1,SELF.DrawButtonsRTF.ButtonLineW)*10+10,1) & clip(lor:colorLine) & '\brsp' & round(SELF.DrawButtonsRTF.ButtonPadBottom*SELF.ReportKoefY-lor:korL,1)
         else
            arf:rec=clip(arf:rec) & '\brdrb\brdrs\brdrw' & round(choose(SELF.DrawButtonsRTF.ButtonLineW=0,1,SELF.DrawButtonsRTF.ButtonLineW)*10,1) & clip(lor:colorWhite) & '\brsp' & round(SELF.DrawButtonsRTF.ButtonPadBottom*SELF.ReportKoefY,1) 
         end
         if SELF.PrgViewRTF=0   !MCO
             lor:korX2=(SELF.DrawButtonsRTF.ButtonPadLeft+SELF.DrawButtonsRTF.ButtonPadRight)*SELF.ReportKoefX*10+36            
             lor:korY2=-15.75 
             lor:h=round(SELF.DrawButtonsRTF.ButtonY2*SELF.ReportKoefY-lor:kory2,1)
         else                   !OO 
             lor:korX2=-2
             lor:kory2=-20
             lor:h=round(SELF.DrawButtonsRTF.ButtonY2*SELF.ReportKoefY-lor:kory2,1)
         end
         
         arf:rec=clip(arf:rec) & '\phmrg\pvmrg\posx' & round(SELF.DrawButtonsRTF.ButtonX1*SELF.ReportKoefX,1) & |
              '\posy' & round(SELF.DrawButtonsRTF.ButtonY1*SELF.ReportKoefY,1) & '\absw' & round(SELF.DrawButtonsRTF.ButtonX2*SELF.ReportKoefX-lor:korX2,1) & '\absh' & choose(SELF.DrawButtonsRTF.ButtonTextResize=0,'-','-') & lor:h & |
              '\overlay' & clip(lor:colorBgr) & clip(lor:f) & '\fs' & round(SELF.DrawButtonsRTF.ButtonFontSize*2,1) & '{{' & clip(SELF.StrReplace(SELF.DrawButtonsRTF.ButtonText,chr(13) & chr(10),'\line')) & '}'
         add(ASCIIFile)
      else    !картинка
         arf:rec='\par\pard\phmrg\pvmrg'
         arf:rec=clip(arf:rec) & '\posx' & round(SELF.DrawButtonsRTF.ButtonX1*SELF.ReportKoefX,1) & |
              '\posy' & round(SELF.DrawButtonsRTF.ButtonY1*SELF.ReportKoefY,1) & '\overlay' & clip(lor:colorBgr) & clip(lor:f) & '\fs' & round(SELF.DrawButtonsRTF.ButtonFontSize*2,1) & |
              '{{{{\pict\wmetafile8\picwgoal' & round(SELF.DrawButtonsRTF.ButtonX2*SELF.ReportKoefX,1) & '\pichgoal' & round(SELF.DrawButtonsRTF.ButtonY2*SELF.ReportKoefY,1) 
         add(ASCIIFile)
         loop loc:j=1 to records(SELF.DrawPictRTF)
            get(SELF.DrawPictRTF,loc:j)
            if SELF.DrawPictRTF.PictName=SELF.DrawButtonsRTF.ButtonText
               loop loc:j=SELF.DrawPictRTF.PictNumStart to SELF.DrawPictRTF.PictNumEnd
                  get(SELF.DrawPictDetRTF,loc:j)
                  arf:rec=SELF.DrawPictDetRTF.PictDetStr
                  add(ASCIIFile)
               end
               break 
            end
         end   
         arf:rec='}}'
         add(ASCIIFile)
     end
   end

   ! \par  - конец абзаца
   ! \pard - стандартная настройка абзаца
   ! \ql, \qr, \qc - выравнивание по левому, правому краю или центру
   ! \brdrt, \brdrb, \brdrl, \brdrr - рамки сверху, снизу, слева, справа
   ! \brspn - расстояние в twips между рамкой и объектом
   ! \brdrs - простая рамка
   ! \brdrwn - толщина границы
   ! \posxn, \posyn - расстояния слева и сверху для объекта в twips
   ! \pvmgr, \phmgr - позиция по вертикали и горизонтали относительно полей
   ! \ul - установка подчеркивания текста (параметр 0 для отмены)
   ! \plain - установить стандартные параметры форматирования
   ! \b - жирный шрифт
   ! \i - курсив
   ! \strike - зачеркнутый текст
   ! \page - переход на новую страницу
   ! \fs - размер шрифта
   ! \fn - номер фонта    
   ! \overlay - текст внутри фрейма
   ! \linN - отступ слева для параграфа 
   ! \piccroprN - добавляет отступ в twips вокруг картинки, если N<0
   ! \piccropbN - добавляет границу в twips вокруг картинки, если N<0

   !для теста ---
   !arf:rec='\par\pard\plain\b\ul\ql\lin33\phmrg\pvmrg\posx0\posy0\absw8352\absh-290\overlay\f0\fs28{{Список сотрудников}'
   !add(ASCIIFile)
   !arf:rec='\par\pard\plain\b\ql\lin31\phmrg\pvmrg\posx0\posy435\absw2523\absh-290\overlay\f0\fs20{{30/10/2013}'
   !add(ASCIIFile)
   !arf:rec='\par\pard\plain\b\qc\brdrt\brdrs\brdrw10\brsp0\brdrb\brdrs\brdrw10\brsp0\brdrl\brdrs\brdrw10\brsp0\brdrr\brdrs\brdrw10\brsp0\phmrg\pvmrg\posx35\posy836\absw974\absh-300\overlay\f0\fs20{{Код}'
   !add(ASCIIFile)
   !arf:rec='\par\pard\plain\b\ql\brdrt\brdrs\brdrw10\brsp0\brdrb\brdrs\brdrw10\brsp0\brdrl\brdrs\brdrw10\brsp0\brdrr\brdrs\brdrw10\brsp0\phmrg\pvmrg\posx1079\posy836\absw5788\absh-300\overlay\f0\fs20{{ФИО}'
   !add(ASCIIFile)
   !arf:rec='\par\pard\plain\b\ql\lin31\phmrg\pvmrg\posx0\posy1131\absw6931\absh-290\overlay\f0\fs20{{скл2}'
   !add(ASCIIFile)
   !arf:rec='\par\pard\plain\qc\brdrt\brdrs\brdrw10\brsp0\brdrb\brdrs\brdrw10\brsp0\brdrl\brdrs\brdrw10\brsp0\brdrr\brdrs\brdrw10\brsp0\phmrg\pvmrg\posx35\posy1416\absw974\absh-300\overlay\f0\fs20{{     7}'
   !add(ASCIIFile)
   !arf:rec='\par\pard\plain\ql\brdrt\brdrs\brdrw10\brsp0\brdrb\brdrs\brdrw10\brsp0\brdrl\brdrs\brdrw10\brsp0\brdrr\brdrs\brdrw10\brsp0\phmrg\pvmrg\posx1079\posy1416\absw5788\absh-300\overlay\f0\fs20{{Алексухин Константин Александрович}'
   !add(ASCIIFile)
   ! --


   arf:rec='\par }'
   add(ASCIIFile)
   close(ASCIIFile)

   free(lor:queueFonts)
   free(lor:queueColors)
C6/C11, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение kreator »

Я делаю как Игорь Столяров. Через OLE, на основе шаблонов. Время создания, конечно, фантастическое. Зато чистый Ворд.
Странно, что нет библиотек прямой записи, а-ля Excel. Принцип похож. Ну может только для меня :mrgreen: .
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение finsoftrz »

Игорь Столяров писал(а): 13 Февраль 2020, 10:51
RaFaeL писал(а): 13 Февраль 2020, 10:27 У нас свой весьма навороченный редактор отчетов
Готов поспорить, что ни у кого нет редактора отчётов круче, чем обычный Microsoft Word (если в нём делать шаблоны отчётов). :)
На самом деле, для конкретной ситуации выгоднее использовать тот или иной инструмент. У меня набор всяких дизайнеров. Из сторонних только FRB.
Общее деление по функционалу такое.
Основная масса отчетов в табличной форме. Используется либо вывод на экран в list с возможностью автоматического сохранения в в xls, либо дизайнер xls форм. Есть вариант вывода xls форм в report, но это редко используется, обычно xls в xls.
Для печатных форм первичных документов (счетов, накладных и т.п.) используется FRB или свой дизайнер с похожим функционалом. В обоих случаях есть возможность вывода в report или rtf.
Для печати договоров используется reportRTF.
Изредка бывает надо в текст или html, применяется текстовый дизайнер.
Вывод в xlsx на будущее, в боевых режимах не используется.

Базируется на технологии мастер-процедур, про которую я уже писал. Ole, com не применяются принципиально. У коллег из Энигмы, кстати, аналогичный подход. Я когда увидел, даже улыбнулся. Как за спиной друг у друга стояли. :-)
blancs.jpg
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение RaFaeL »

finsoftrz писал(а): 13 Февраль 2020, 11:23 Выдрал рутинку, которая выводит в rtf, может, поможет чем.
Спасибо!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?

Сообщение finsoftrz »

Кстати, если кому интересно, выкладывал некоторую информацию о технологиях подготовки разных бланков.

https://olegon.ru/showthread.php?t=18532
C6/C11, ШВС, tps/btrieve.
Ответить