Конференция "Corba" » Способы увеличения скорости выдачи отчета. [Delphi, Windows]
 
  • Andy BitOff © (15.04.10 11:07) [0]
    Выкидываю в таблицу Ворда данные. Одна строка таблицы подготовлена в виде шаблона, следующие строки просто добавляются по количеству данных. На 5-10 страницах скорость вывода данных еще по божески, но когда страниц выходит 50, 100 то данные добавляются все медлене и медленнее, т.е. чем больше данных добавляешь, тем медленнее происходит добавление.
    Какие вы видите способы решения данной проблемы?
    Я обдумывал вариант после создания определенного количества страниц или добавления определенного количества данных, закрывать текущий файл и начинать новый. После окончания склеить все полученные файлы в один. Но пока только обдумывал...  Боюсь, что не даст увеличения и время будет потрачено зря. Думаю, что понадобится много времени на склейку файлом, хоть это всего одна строка кода.

    Работа с вордом происходит через ОЛЕ:
    WordApp := CreateOleObject('Word.Application');
  • YurikGL © (18.04.10 19:54) [1]
  • Andy BitOff © (18.04.10 22:32) [2]
    > YurikGL ©   (18.04.10 19:54) [1]

    И что там? Как работать с Вордом? Дык, вопрос-то не в этом.
  • YurikGL © (19.04.10 08:43) [3]

    > И что там? Как работать с Вордом? Дык, вопрос-то не в этом.

    Там быстрый способ создания таблиц.

    В твоем случае можно в памяти сформировать большой TStringList с нужными разделителями, один раз вставить его в word и потом преобразовать в таблицу с помощью converttotable
  • Andy BitOff © (19.04.10 09:54) [4]
    Хорошо. Спасибо, попробую.
  • Andy BitOff © (20.04.10 10:09) [5]
    Вроде не подходит =(
    Я в середине добавляемых данных в зависимости от некоторых опций могу выполнить:

    WT.Rows.Add;
    myRange := WordApp.ActiveDocument.Range(WT.Cell(WordCurrLine, 1).Range.Start,
                 (IDispatch(WT.Cell(WordCurrLine, WT.Columns.Count).Range) as RangeDisp).End_);
    myRange.Cells.Merge;



    Это может даже через строку вставляться.
    Мне кажется, что сделать такое с помощью ConvertToTable не представляется возможным, или я ошибаюсь?
  • YurikGL © (21.04.10 18:27) [6]
    Выделю основную суть из статьи


    procedure TForm1.TableExport(DataSet:TDataSet; Title, FlagText:string);

    ...

    if dataset.RecordCount>0 then begin
     Repeat
       Application.ProcessMessages;
       if (dataset.fields[DataSet.Fields.Count-1].AsString=FlagText) or (FlagText='')
         then begin
           for i:=0 to DataSet.FieldCount-1 do
              if DataSet.Fields[i].Visible then
                  st:=st+DataSet.Fields[i].AsString+#9; //через табуляцию выводим все видимые поля
           SetLength(st,length(st)-1);                  //убираем последний символ табуляции
           st:=st+#13;                                  //перенос строки
           f:=false;
              end;
       dataset.Next;
     until dataset.Eof;
     w1.Selection.EndKey(vr1,EmptyParam);//уходим в конец текста
     W1.Selection.InsertAfter(convertstring(st));       //вставляем данные таблицы
     vr1:=TableBeg2;                     //начало данных таблицы
     vr2:=W1.Selection.End_;             //конец таблицы

    ...
      W1.ActiveDocument.Range(vr1,vr2).Select;//выбираем этот диапазон
    //и преобразуем его в таблицу
      W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyPar am,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam);


    Там используется string. Хотя можно и TStringList

    Алгоритм такой
    Формируем строчку вида

    знач11 табуляция знач12 табуляция знач13...
    знач21 табуляция знач22 табуляция знач23
    ....
    Потом можно открыть ворд, запомнить положение курсора.
    Потом всю эту строку один раз вставляем в ворд.
    Еще раз запоминаем положение курсора
    Выделяем текст между положениями
    Говорим selection.convertToTable

    При этом мы ни разу никогда не обращаемся ни к каким rows или cols...

    Есть минус - вставляемый текст не должен содержать табуляции.
  • Andy BitOff © (21.04.10 19:54) [7]
    Код я прекрасно понял ;)


    > Есть минус - вставляемый текст не должен содержать табуляции.

    У ConvertToTable первый параметр задает разделитель ;)


    > знач11 табуляция знач12 табуляция знач13...
    > знач21 табуляция знач22 табуляция знач23

    У меня может получится так:
    знач11 табуляция знач12 табуляция знач13...
    знач2
    знач21 табуляция знач22 табуляция знач23
    знач3
    знач31 табуляция знач32 табуляция знач33

    В этом случае знач2 и знач3 есть строка в таблице, где все ячейки объединены, т.е.
    ----------------------------
    | знач11 | знач12 | знач13 |
    ----------------------------
    |          знач2           |
    ----------------------------
    | знач21 | знач22 | знач23 |
    ----------------------------
    |          знач3           |
    ----------------------------
    | знач31 | знач32 | знач33 |
    ----------------------------
    | знач41 | знач42 | знач43 |
    ----------------------------
    | знач51 | знач52 | знач53 |
    ----------------------------
    |          знач6           |
    ----------------------------
    | знач61 | знач62 | знач63 |
    ----------------------------
    | знач61 | знач62 | знач63 |
    ----------------------------



    Прокатит?
  • YurikGL © (22.04.10 11:09) [8]

    > Прокатит?

    Нет
    Но можешь сделать пустые ячейки

    ----------------------------
    | знач11 | знач12 | знач13 |
    ----------------------------
    | пусто  |  знач2 | пусто  |
    ----------------------------
    | знач21 | знач22 | знач23 |
    ----------------------------
    | пусто  |  знач3 | пусто  |
    ----------------------------
    | знач31 | знач32 | знач33 |
    ----------------------------
    | знач41 | знач42 | знач43 |
    ----------------------------
    | знач51 | знач52 | знач53 |
    ----------------------------
    | пусто  |  знач6 | пусто  |
    ----------------------------
    | знач61 | знач62 | знач63 |
    ----------------------------
    | знач61 | знач62 | знач63 |
    ----------------------------



    А потом можно попробовать выбрать соответсвующие строки (при формировании их можно запомнить) и сделать объединение ячеек.
  • YurikGL © (22.04.10 11:11) [9]

    > А потом можно попробовать выбрать соответсвующие строки
    > (при формировании их можно запомнить) и сделать объединение
    > ячеек.

    Хотя, если такого кода много, то на этом может тормозить
  • Andy BitOff © (22.04.10 11:25) [10]
    Лады. Попробую заморочиться.
 
Конференция "Corba" » Способы увеличения скорости выдачи отчета. [Delphi, Windows]
Есть новые Нет новых   [134427   +34][b:0][p:0.003]