16 октября, среда 11:20
Bankir.Ru

Объявление

Свернуть
Пока нет объявлений.

Вывод в Excel сложного многосекционного отчета.

Свернуть
X
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Вывод в Excel сложного многосекционного отчета.

    Появились ли какие-то новые средства для удобного изготовления через среду Diasoft сложного многосекционного отчета в формате Excel?
    Мне известные следующие не слишком удобные способы:
    1) На жестком диске хранится шаблон отчета (.xlt или .dot), отчет вываливает данные с разделителями, потом поднимается Excel, загружает в массив или еще куда данные своим импортом, далее на VBA форматируем лист. Особо сложные отчеты таким образом не сделаешь - если в отчете несколько секций с разным количеством (и смыслом)столбцов в каждой, группами и пр, то схема получается весьма муторная
    2) Вываливаем все данные что есть с разделителями, поднимаем Excel, и обрабатываем стандарным VBA-ным Workbooks.OpenText.
    Соответственно, отчет в таком варианте сохраняет структуру tpr-ного, но размер ячеек и пр. при этом отуствтует (либо надо в VBA как-то этот результат дополнительно форматировать)
    3) Вывод в Ecel-ном XML - муторно и неудобно.
    4) Вывод текста в формате .csv - по сути, то же что и все вышеприведенное, только формат понимается Excel-ем и не надо делать импорт, но зато и не сохраняется форматирование - только данные.
    Принимаются мысли по борьбе с этой бедой.

  • #2
    Я пользуюсь XML-форматом. Приноровился. Ничего так. Можно зато любой сложности форму нарисовать и затем её заполнить

    Комментарий


    • #3
      Сообщение от Anatol Посмотреть сообщение
      Я пользуюсь XML-форматом. Приноровился. Ничего так. Можно зато любой сложности форму нарисовать и затем её заполнить
      А как конкретно делаете? - поделитесь опытом.
      Делаете макет отчета с тестовыми данными, сохраняете в XML, потом соотв. куски копируете в генератор, заменяя числа соотв. "собачьими" полями?
      Несколько мне известно, генератор клинит на некоторых XML-символах как с этим боретесь?

      Комментарий


      • #4
        Да, именно так.
        А с символами, используемыми генераторомЮ, поступаю просто:
        сначала в заготовке XML контекстной заменой меняю @, # и $ на поля @Dog@, @Sharp@, @USD@
        А в Fields эти поля у меня объявлены так:

        @Dog@ = Field{'@', @s1}
        @Sharp@ = Field{'#', @s1}
        @USD@ = Field{'$', @s1}

        Собственно, вся хитрость )
        При таком способе построения отчёта, действительно, достаточно трудно добавлять колонки и даже менять их ширину. Пока не приноровишься, с ума сойдёшь. Но вроде бы всё, устоялось уже. И у меня не вызывает особых трудностей

        Комментарий


        • #5
          Нужен какой-нибудь XML-отладчик.
          Вот как допустим с такой ошибкой (сгенеренной Exel-ем) бороться:
          C:\Documents and Settings\XXX\Local Settings\Temporary Internet Files
          Код:
          ОШИБКА РАЗБОРА XML:  Отсутствует пробел между атрибутами
            Ошибка на уровне этого стека элементов или ниже:
              (Стек пуст -- ошибка на уровне верхнего элемента или ниже.)
          Ошибка была из-за симола // - отчетник думает, что это коммент, и убирает то что после.
          Добавил еще одну "собаку":
          @DoubleSlash@ = Field{"//",@s2}.
          Но теперь другая засада текст должен быть в кодировке UTF-8, а отчетник может делать только в ASCII либо DOS. Как перекодировать?
          Последний раз редактировалось zbc; 02.12.2008, 17:35.

          Комментарий


          • #6
            Не встречал таких ошибок
            Просто я XML, сгенерённый при сохранении excel-файла, стараюсь всё-таки особенно не разрушать. Только поля вставляю. Иногда колонки двигаю и добавляю. А так, чтобы разрушить до состояния XML-ошибки - не было. Пока

            Комментарий


            • #7
              Anatol, как Вы решали проблему того, что файл должен быть в юникоде? Встроенная функция перекодирования есть только из дос в анси и обратно.

              Комментарий


              • #8
                Я генерирую отчётом код на WindowsScriptHost.
                Например такой:

                PHP код:
                #@Date@
                #@ORC@
                #@PF@
                %
                Dim objXL

                dim n
                dim m

                Set objXL 
                WScript.CreateObject("Excel.Application")
                objXL.Visible false

                  With objXL         
                 
                       
                .Workbooks.Open("C:\word\region_split.xls")
                       .
                Workbooks(1).SaveAs ("C:\word\Retail Region Split " trim("@DateStart@")& "-" trim("@DateEnd@") & ".xls")              
                       .
                cells(13) = trim("@DateStart@ - @DateEnd@")
                       

                $T
                $
                &
                #@SQL@
                $T

                .cells(2*@Years@, 3) = @Amount_MOS@
                .
                cells(2*@Years@, 4) = @Amount_SPB@
                .
                cells(2*@Years@, 5) = @Amount_URA@

                .
                cells(2*@Years@, 3) = @Count_MOS@
                .
                cells(2*@Years@, 4) = @Count_SPB@
                .
                cells(2*@Years@, 5) = @Count_URA@

                $
                &
                #@End@
                       
                .Workbooks(1).Save()
                End with

                objXL
                .Visible true 
                %> 
                В OnReportComplete пишу:
                PHP код:
                @ORC@ = OnReportComplete{WinExec("j:\diasoft\reports\ANTVBSC.BAT c:\wordrep\region_split.txt",,""), @s40t
                ANTVBSC.BAT прилагаю.

                Про txt-шные отчёты в нашем банке уже все забыли. И про поля слияния тоже.

                PS. С Word'ом всё то же самое, только объявляется "Word.Application".
                Вложения

                Комментарий


                • #9
                  igorekk, спасибо за пример, надо будет поразбираться.
                  Народ выкручивается кто как может...
                  Когда же у "Диасофта" совесть проснется и он предложит какие-то удобные средства под эти задачи.

                  Что касается Excel XMl и кодировки, то оказалось, что если прописать 1-й строчкой c указанием конкретной кодировки
                  Код:
                  ?xml version="1.0" encoding="windows-1251"?>
                  , то эксель такой файл открывается нормально и без перекодирования.

                  Комментарий


                  • #10
                    zbc, да вряд ли они что-то предложат. ЦБ же принимает отчёты текстовые, поэтому всегда будет отмазка

                    PS. Если будут какие-либо вопросы по данному методу - обращайтесь, помогу чем могу.

                    Комментарий


                    • #11
                      Мне кажется, можно генерировать HTML по технологии, которую обсуждали чуть раньше для ворда http://dom.bankir.ru/showthread.php?t=82538 .

                      Комментарий


                      • #12
                        loo, а какой смысл завязываться на html? WSH в разы мощнее и позволяет очень многое.

                        Комментарий


                        • #13
                          igorekk,
                          Не мог бы ты поподробнее рассказать про применяюмую технологию.
                          WSH, наскольку я понимаю, скриптовый язык, встроенный в винду.
                          Поднять Excel в принципе не проблема.
                          Вопрос в том, как и чем его грамотно отформатировать. Плюс к этому макет должен быстро и удобно меняться.
                          Попробовал сделать в XML - получается красиво, но всё равно неудобно.
                          После того, как отчет создан, менять форматы очень неудобно - приходится практически заново переделывать отчет.

                          Просьба ответить (для примера) вот на такой вопрос. Пусть результат отчета состоит из сгруппированных данных (1 группа), в некоторых группах имеется специфичная подтаблица(цы) (другой набор полей для вывода и дизайн "шапки"). Каким образом в Вашей методологии решается вопрос вывода таких данных?

                          Комментарий


                          • #14
                            Не совсем понял вопрос. Примерчик бы, если не очень сложно.

                            Комментарий


                            • #15
                              Сообщение от igorekk Посмотреть сообщение
                              Не совсем понял вопрос. Примерчик бы, если не очень сложно.
                              Допустим, надо вывести данные в показанном в верхней части картины виде.
                              Данные, возвращаемые секцией, показаны на картинке в нижней части.
                              (код, возвращащий тестовые данные, допустим такой)
                              Код:
                              @sql@=SQL{
                              select  Fio       = 'Иванов'
                                     ,Salary    = 60000
                                     ,Child     = 1
                                     ,Salary1   = 0
                                     ,Kategoty  = 'Мужчины'
                              union
                              select  Fio       = 'Петров'
                                     ,Salary    = 40000
                                     ,Child     = 2
                                     ,Salary1   = 0
                                     ,Kategoty  = 'Мужчины' 
                              union             
                              select  Fio       = 'Сидорова'
                                     ,Salary    = 20000
                                     ,Child     = 1
                                     ,Salary1   = 0
                                     ,Kategoty  = 'Женщины'       
                              union       
                              select  Fio       = 'Акимова'
                                     ,Salary    = 40000
                                     ,Child     = 3
                                     ,Salary1   = 0
                                     ,Kategoty  = 'Женщины'       
                              union       
                              select  Fio       = 'Козлова'
                                     ,Salary    = 0
                                     ,Child     = 0
                                     ,Salary1   = 2500
                                     ,Kategoty  = 'Бабки'  
                              union       
                              select  Fio       = 'Доходяга'
                                     ,Salary    = 0
                                     ,Child     = 0
                                     ,Salary1   = 1500
                                     ,Kategoty  = 'Дедки'            
                              
                              }
                              [FIELD]
                              @Fio@      = Field{Fio,@s8t}
                              @Salary@   = Field{Salary,@n-_9.2t}
                              @Child@    = Field{Child,@n-_9t}
                              @Salary1@  = Field{Salary1,@n-_9.2t}
                              @Kategoty@ = Field{Kategoty,@s7t}
                              Последний раз редактировалось zbc; 10.12.2008, 16:53.

                              Комментарий


                              • #16
                                Спасибо, завтра выложу код. Сегодня пока не до того.

                                Комментарий


                                • #17
                                  Сообщение от igorekk Посмотреть сообщение
                                  Спасибо, завтра выложу код. Сегодня пока не до того.
                                  Хорошо. Я, если будет завтра 15 мин свободных, выложу XML-ный вариант и поясню, чем он меня не устраивает.

                                  Комментарий


                                  • #18
                                    Код:
                                    #@SQL@
                                    #@ORC@
                                    %
                                    Dim objXL
                                    
                                    dim cid
                                    
                                    //счётчик для строк
                                    cid = 1
                                    
                                    Set objXL = WScript.CreateObject("Excel.Application")
                                    objXL.Visible = false
                                    
                                    With objXL
                                     
                                      .WorkBooks.Add                       
                                      .Sheets(1).Select
                                    $@Kategory@
                                    //категория.
                                      .Cells (cid,1).Value = "Категория: @Kategory@"
                                      .Range("A"&cid&":B"&cid).Select  
                                      With .Selection
                                        .MergeCells = True
                                        .Font.Bold = True    
                                      End with          
                                      
                                      cid = cid + 1
                                    //шапка для категории.
                                      .Cells (cid,1).Value = "Фамилия"    
                                      if ("@Kategory@"> "Бабки" and "@Kategory@"> "Дедки") then
                                        .Cells (cid,2).Value = "Зарплата"  
                                        .Cells (cid,3).Value = "Число детей"      
                                        .Range("A"&cid&":C"&cid).Select  
                                        With .Selection
                                    //установка цвета
                                          .Interior.ColorIndex = 40      
                                        End with                  
                                      else
                                        .Cells (cid,2).Value = "Пенсия"
                                        .Range("A"&cid&":B"&cid).Select  
                                        With .Selection
                                          .Interior.ColorIndex = 40
                                        End with                      
                                      end if
                                    
                                      cid = cid + 1
                                    $T
                                    //данные
                                      if ("@Kategory@"> "Бабки" and "@Kategory@"> "Дедки") then
                                        .Cells (cid,1).Value = "@Fio@"
                                        .Cells (cid,2).Value = @Salary@
                                        .Cells (cid,3).Value = @Child@
                                      else 
                                       .Cells (cid,1).Value = "@Fio@"
                                       .Cells (cid,2).Value = @Salary1@
                                      end if
                                      
                                      cid = cid + 1
                                    $
                                      cid = cid + 1
                                    $
                                    End with
                                    objXL.Visible = true 
                                    %>
                                    Категории идут по алфавиту. Если хочется свой порядок, то можно добавить какое-нибудь поле KategoryOrder и по нему уже группировать.
                                    Вместо IF-а на VBA можно использовать #IF из генератора отчётов, это позволит немного снизить нагрузку при генерации excel-файла.

                                    Комментарий


                                    • #19
                                      Изложив про Excel, хочу поделиться работой с Word. Поля слияния нас не устраивают, поскольку не позволяют, например, варьировать таблицами.

                                      Для вывода отчётов в Word мы используем ту же технологию, что и для Excel (см. пару постов вниз).
                                      В шаблоне размечаем нужные места через Bookmark'и(выделяем текст, в меню Insert->Bookmark, называем как хотим.

                                      Отчётом наигрываем таблицу с нужными значениями закладок в @BookmarkName@ - наименование закладки, @BookmarkValue@ - её значение.
                                      В самом простом случае шаблон для обработки выглядит следующим образом.
                                      Код:
                                      %
                                      Dim bName, bVal, fName
                                      
                                      Set objWord = CreateObject("Word.Application")
                                      objWord.Visible = False
                                      
                                      //имя для сохраняемого файла.
                                      fName = "c:\word\loan_" & trim("@FName@") & ".doc"
                                      Set objDoc = objWord.Documents.Open("c:\word\loan.doc")
                                      objDoc.SaveAs(fName)
                                      
                                      $T
                                      bName = trim("@Name@")
                                      bVal = trim("@Value@")
                                      
                                      //замена букмарка.
                                      if objDoc.Bookmarks.Exists(bName) = True Then
                                        objDoc.Bookmarks(bName).Range.Text = bVal  
                                      end if
                                      $
                                      objWord.Save()
                                      objWord.Visible = True
                                      %>

                                      Комментарий


                                      • #20
                                        igorekk, просьба выложить готовый .tpr, чтобы наглядно убедиться, что все работает.

                                        Комментарий


                                        • #21
                                          Готово

                                          Комментарий


                                          • #22
                                            Сообщение от igorekk Посмотреть сообщение
                                            Готово
                                            Большое спасибо, все работает.
                                            Интересный способ.
                                            Код гораздо короче, чем через XML.
                                            Надо будт где-нибудь документацию по WSH найти и попробовать в этой технологии что-нибудь изобразить.

                                            Мы в основном ранее использовали несколько другую модификацию примерно этого же метода. На OnReportComplete у нас стоит тоже запуск свойсвого exe-ника, который открывает Excel и запускает нужную процедуру в нем.
                                            Для сокращения объема кода код вываливается в заранее отформатированный шаблон .xlt
                                            Весь код форматирования Excel хранится в этих процедурах, но приходится вначале открывать текстовый файл, импортировать в него данные, а затем запихивать их в Excel. Причем выходит так, что код в Excel-е должен "знать" структуру файла перегрузки данных, и если в нем что-то изменится, надо менять и код форматирования.
                                            При генерации WSH отчетником такой проблемы нет.

                                            Комментарий


                                            • #23
                                              Сообщение от zbc Посмотреть сообщение
                                              Большое спасибо, все работает.
                                              Интересный способ.
                                              Код гораздо короче, чем через XML.
                                              Надо будт где-нибудь документацию по WSH найти и попробовать в этой технологии что-нибудь изобразить.
                                              В качестве документации хватит встроенной справки Excel\Word по VBA. За небольшими исключениями (типа объекта Selection) всё работает как надо

                                              Комментарий


                                              • #24
                                                Сообщение от igorekk Посмотреть сообщение
                                                В качестве документации хватит встроенной справки Excel\Word по VBA. За небольшими исключениями (типа объекта Selection) всё работает как надо
                                                А отладчик под него какой использовать? Редактор VBA встроенный в эксель подойдет?
                                                Попробовал сейчас - действительно VBA на .Range("A"&cid&":B"&cid).Select ругается.

                                                Комментарий


                                                • #25
                                                  zbc
                                                  Есть очень удобный инструмент - Monarch от Datawatch.
                                                  http://www.datawatch.com/_products/monarch_overview.php

                                                  И не только из txt конвертирует. Очень рекомендую.

                                                  Комментарий


                                                  • #26
                                                    Сообщение от zbc Посмотреть сообщение
                                                    А отладчик под него какой использовать? Редактор VBA встроенный в эксель подойдет?
                                                    Я без отладчика пишу

                                                    Комментарий


                                                    • #27
                                                      igorekk,
                                                      не подскажешь, как открыть готовый документ, заполнить данными из отчета и сохранить под другим именем?
                                                      Я пробовал, что-то получается, но есть проблемы...:
                                                      1. не понимает новое имя файла, взятое из запроса в отчете
                                                      2. не отображает документ Excel, ругается на objXL.Visible = true
                                                      3. в задачах остается висеть EXCEL.EXE

                                                      Буду очень признателен.
                                                      Спасибо!

                                                      Комментарий


                                                      • #28
                                                        Ну вот где-то так.
                                                        Код:
                                                        %
                                                        Dim objXL
                                                        
                                                        dim n
                                                        n = 5
                                                        
                                                        Set objXL = WScript.CreateObject("Excel.Application")
                                                        objXL.Visible = false
                                                        
                                                        With objXL
                                                        'открываем размеченный шаблон 
                                                            .Workbooks.Open("j:\diasoft_client\reports\templates\overdue_jur.xls")
                                                        'сохраняем документ под нужным нам именем
                                                            .Workbooks(1).SaveAs ("C:\wordrep\overdue_jur_@RepDate@.xls")                  
                                                            .Sheets(1).Select                     
                                                            .Cells(1, 2) = "@NaZa@ "
                                                            .Cells(1, 3) = "@RepDate@"
                                                            .Cells(2, 1) = "@Header@"                  
                                                            .Cells(3, 1) = "USD-"
                                                            .Cells(3, 2) = @USD@         
                                                            .Cells(3, 4) = "EUR"
                                                            .Cells(3, 5) = @EUR@
                                                        $T         
                                                            .cells(n, 1) = trim("@ClientNum.........@")
                                                            .cells(n, 2) = trim("@Client.......................................................................................................................................................................................................................................................@")    
                                                            .cells(n, 3) = "@BankProduct...............................................@"
                                                            .cells(n, 4) = "@DealNumber........@"    
                                                            n = n + 1
                                                        $
                                                            .Workbooks(1).Save()
                                                        End with
                                                        objXL.Visible = true 
                                                        %>

                                                        Комментарий


                                                        • #29
                                                          Igorekk,
                                                          спасибо большое! все получилось! все супер!

                                                          Комментарий


                                                          • #30
                                                            Господа, а может есть у кого инструкция для начинающих про выгрузку в Эксель? Спрашивал у приходящих к нам внедренцев, говорят, что учились у коллег. У меня таких коллег под боком не имеется. В родном хелпе report.chm тоже пусто.
                                                            Понял из объяснений внедренцев, что надо создать шапку в Экселе, потом сохранить как html, вставить этот код в tpr. Ну, естественно, еще переключатель добавить.
                                                            Однако все равно пока не знаю с какой стороны начать, а бэки уже хотят...

                                                            Комментарий

                                                            Пользователи, просматривающие эту тему

                                                            Свернуть

                                                            Присутствует 1. Участников: 0, гостей: 1.

                                                            Обработка...
                                                            X