Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывод в excel отфильтрованного VirtualStringTree / 8 сообщений из 8, страница 1 из 1
26.12.2018, 17:24
    #39753541
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод в excel отфильтрованного VirtualStringTree
Господа, подскажите решение, а то голова уже пухнет
Есть вот такая вот процедура фильтрации VST по нажатию на кнопку

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
procedure TfrmASNAOstatokTovara.AvtozakazClick(Sender: TObject);
var i: integer;
  PNode: PVirtualNode;
begin
  if Avtozakaz.Caption = 'Показать только фиктивные' then
   begin
    try
      vt.beginupdate;
       for i := 0 to vt.TotalCount - 1 do
    begin
      if I <> 0 then
        PNode := VT.GetNext(PNode)
      else
        PNode := VT.GetFirst;
      T := VT.GetNodeData(PNode);
      if (t.Bg <> clSkyBlue) then Vt.IsFiltered[PNode] := true;
    end;
    finally
      vt.EndUpdate;
    end;
    Avtozakaz.Caption := 'Показать все';
  end
  else
  begin
     try
      vt.beginupdate;
       for i := 0 to vt.TotalCount - 1 do
    begin
      if I <> 0 then
        PNode := VT.GetNext(PNode)
      else
        PNode := VT.GetFirst;
       Vt.IsFiltered[PNode] := false;
    end;
    finally
      vt.EndUpdate;
    end;
    Avtozakaz.Caption := 'Показать только выбранные';
  end;
end;




Далее есть вот такой вот обработчик кнопки на отправку VST в Excel


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
if FileExists(ExtractFileDir(application.ExeName)+'\Shablon\ASNAOstatokTovara.xlt') then
  begin
   frmMessage.lblMessage.Caption := 'Формирование отчета. Ждите...';
   frmMessage.Show();
   application.ProcessMessages;
   try
      if LoadExcelReportType(mainForm.sIniFile, frmASNAOstatokTovara.Name) = 1 then
      SaveToExcelArray(
         SaveToExcelArray(VT, ExtractFileDir(application.ExeName)+'\Shablon\ASNAOstatokTovara.xlt', P)
      else
         SaveToExcel(VT, ExtractFileDir(application.ExeName)+'\Shablon\ASNAOstatokTovara.xlt', P);
   finally
    frmMessage.Close;
   end;

  end
  else Showmessage('Нет файла шаблона '+ExtractFileDir(application.ExeName)+'\Shablon\ASNAOstatokTovara.xlt');




И собственно сама функция


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
function SaveToExcelArray(VT: TVirtualStringTree; AFileName: string; AParams: TRepParameters):boolean;
var
  iRow, iCol: Integer;
  RowCount, ColCount: Integer;
  BeginRow, BeginCol: integer;
  Str: string;
  XLApp, sheet, range : oleVariant;
  ArrayData , Cell1, Cell2 : Variant;
  nstr,  j, i: Integer;
  LastNode: PVirtualNode;
  D: Double;
begin
  // Create Excel-OLE Object
  Result:=false;
  nstr:=0;
  i:=0;
  BeginCol := 1;
  BeginRow := 1;


  XLApp := CreateOleObject('Excel.Application');
  try



    // Hide Excel
    XLApp.Visible := False;
    // Add new Workbook
    XLApp.Workbooks.Add(AFileName);
    Sheet := XLApp;//.Workbooks[1];//.WorkSheets[1];

  // Чтобы знать размер листа (WorkSheet), т.е. количество строк и количество
  // столбцов, мы активируем его последнюю непустую ячейку



         Sheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
  // Получаем значение последней строки
         iRow := XLApp.ActiveCell.Row;
  // Получаем значение последней колонки
         iCol := XLApp.ActiveCell.Column;

//         range:= XLApp.Range['A1:'+xlRCtoA1(iRow, iCol)].select;

  // Левая верхняя ячейка области, в которую будем выводить данные
  Cell1 := Sheet.Cells[BeginRow, BeginCol];
  // Правая нижняя ячейка области, в которую будем выводить данные
  Cell2 := Sheet.Cells[iRow, iCol];


  // Область, в которую будем выводить данные
  Range := Sheet.Range[Cell1, Cell2];



    FindAndReplace(XLApp,Unassigned, '&nomerdoc',AParams.NomerDoc);
    FindAndReplace(XLApp,Unassigned,'&ldatedoc',AParams.lDateDoc);
    FindAndReplace(XLApp,Unassigned,'&ldatedoc',AParams.lDateDoc);
    FindAndReplace(XLApp,Unassigned,'&sdatedoc',AParams.sDateDoc);
    FindAndReplace(XLApp,Unassigned,'&begindate',AParams.BeginDate);
    FindAndReplace(XLApp,Unassigned,'&enddate',AParams.enddate);
    FindAndReplace(XLApp,Unassigned,'&strpar1',AParams.strpar1);
    FindAndReplace(XLApp,Unassigned,'&strpar2',AParams.strpar2);
    FindAndReplace(XLApp,Unassigned,'&strpar3',AParams.strpar3);

   // подвал
   FindAndReplace(XLApp,Unassigned, '&itog_n',AParams.itog_n);
   FindAndReplace(XLApp,Unassigned, '&itog_s',AParams.itog_s);
   FindAndReplace(XLApp,Unassigned, '&itog_k',AParams.itog_k);
   FindAndReplace(XLApp,Unassigned, '&kolstr_s',AParams.itog_kolstr_s);


    // табличная часть


    // табличная часть
    range:=XLApp.Range['A1:'+xlRCtoA1(iRow, iCol)].Find('&column') ;
//    range:=XLApp.Range['A1:Z200'].Find('&column');
    BeginCol := range.column;
    BeginRow := range.row;

    if not VarIsClear(Range) then
     begin
      // есть табличная часть
      // Fill up the sheet
      LastNode := VT.GetFirst;


  // Размеры выводимого массива данных
  for J := 0 to High(AParams.numColumn) do
        begin
          range:=XLApp.Range['A1:'+xlRCtoA1(iRow, iCol)].Find('&column'+inttostr(j)) ;
         // range:=XLApp.Range['A1:Z200'].Find('&column'+inttostr(j));
          if not VarIsClear(Range) then
          begin
             AParams.numColumn[j] := true;
          //if AParams.numColumn[j] then
          i:=i+1;
          end;

        end;

  RowCount := VT.TotalCount;
  ColCount := i;
// Создаем Вариантный Массив, который заполним выходными данными
  ArrayData := VarArrayCreate([1, RowCount+1, 1, ColCount+1], varVariant);

      //range:=XLApp.Range['A1:Z200'].Find('&column');
      range:=XLApp.Range['A1:'+xlRCtoA1(iRow, iCol)].Find('&column') ;


      while LastNode <> nil do
      begin
       nstr:=nstr+1;
       if nstr > 1 then
       begin

       Range.EntireRow.Copy(EmptyParam);
       range.EntireRow.Insert(xlUp,EmptyParam);
       Range.PasteSpecial(xlPasteFormats,xlNone,False,False);


       end;
       Application.ProcessMessages;
      i:=0;
      for j := 0 to High(AParams.numColumn) do
         if AParams.numColumn[j] then
         begin
          if (Pos('E', VT.Text[LastNode, J]) = 0) and
             (Pos('e', VT.Text[LastNode, J]) = 0) and  TryStrToFloat(VT.Text[LastNode, J], D) then
            ArrayData[nstr, i+1] := D
          else
          begin
            ArrayData[nstr, i+1] := VT.Text[LastNode, J];
          end;
            inc(i);
         end;


       LastNode := VT.GetNext(LastNode);
     end;
     end;


  // Левая верхняя ячейка области, в которую будем выводить данные
  Cell1 := Sheet.Cells[BeginRow, BeginCol];
  // Правая нижняя ячейка области, в которую будем выводить данные
  Cell2 := Sheet.Cells[BeginRow  + RowCount - 1, BeginCol + ColCount - 1];


  // Область, в которую будем выводить данные
  Range := Sheet.Range[Cell1, Cell2];
  Range.Value := ArrayData;

  FindAndReplace(XLApp,Unassigned, '&itog_n',AParams.itog_n);
  FindAndReplace(XLApp,Unassigned, '&itog_s',AParams.itog_s);



  // встаем на первую ячейку
  //Sheet.Cells[1,1].Select;
XLApp.Range['a1','a1'].Select;


    XLApp.Visible:=True;
    PostKeyEx32(VK_ESCAPE , [], false);
  except
   // Quit Excel
    if not VarIsEmpty(XLApp) then
    begin
      Range := Unassigned;
      Sheet := Unassigned;
      XLAPP := Unassigned;
    end;
  end;

   // Quit Excel
    if not VarIsEmpty(XLApp) then
    begin
      Range := Unassigned;
      Sheet := Unassigned;
      XLAPP := Unassigned;
    end;

    Result:=true;

end;




Так вот, когда юзер фильтрует VST нажатием на первую кнопку и хочет его отправить нажатием на вторую, оно выгружается целиком, а не фильтрованное. Как можно сделать, что выгружались только отфильтрованные записи. Подозреваю что решение простое но не могу докопаться
...
Рейтинг: 0 / 0
26.12.2018, 17:44
    #39753559
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод в excel отфильтрованного VirtualStringTree
арт2010,

п....ц код у тебя... Почему ты размер выходного массива определяешь икселем, а не количеством ввходных данных в дереве?
...
Ну, ладно.
Вот тут:

Код: pascal
1.
 LastNode := VT.GetNext(LastNode); 


Зацикли эту операцию:

Код: pascal
1.
2.
3.
4.
 

while Assigned(LastNode) and not VT.IsFilrered[LastNode] do
  LastNode := VT.GetNext(LastNode); 
...
Рейтинг: 0 / 0
26.12.2018, 18:37
    #39753594
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод в excel отфильтрованного VirtualStringTree
Фэйтл Эра, код большей частью не мой. Завтра на работе проверю, спасибо большое!
...
Рейтинг: 0 / 0
26.12.2018, 20:20
    #39753641
Ghost Writer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод в excel отфильтрованного VirtualStringTree
IsFilrered скрывает узлы ? у меня версия старенькая, IsFilrered нет.
тогда может GetNextVisible вместо GetNext ?
...
Рейтинг: 0 / 0
26.12.2018, 20:25
    #39753645
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод в excel отфильтрованного VirtualStringTree
Ghost Writer,

не ограничено ли будет выбока видимой областью окна или развернутых узлов? Надо проверить.
...
Рейтинг: 0 / 0
26.12.2018, 21:59
    #39753669
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод в excel отфильтрованного VirtualStringTree
чисто для побрюзжать
фильтровать лучше исходные данные а не их отображение на экране
тогда и проблем с выводом в Excel нет
...
Рейтинг: 0 / 0
26.12.2018, 22:28
    #39753684
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод в excel отфильтрованного VirtualStringTree
krapotkin,

хз что там за исходные данные. Может, их физически отдельно нигде и нет, "исходных", все изначально в дереве.
...
Рейтинг: 0 / 0
27.12.2018, 14:32
    #39753922
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод в excel отфильтрованного VirtualStringTree
Так ты в цикле и перебираешь ВСЕ узлы (LastNode := VT.GetNext(LastNode);)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывод в excel отфильтрованного VirtualStringTree / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]