powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывод в excel отфильтрованного VirtualStringTree
8 сообщений из 8, страница 1 из 1
Вывод в excel отфильтрованного VirtualStringTree
    #39753541
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, подскажите решение, а то голова уже пухнет
Есть вот такая вот процедура фильтрации 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
Вывод в excel отфильтрованного VirtualStringTree
    #39753559
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт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
Вывод в excel отфильтрованного VirtualStringTree
    #39753594
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фэйтл Эра, код большей частью не мой. Завтра на работе проверю, спасибо большое!
...
Рейтинг: 0 / 0
Вывод в excel отфильтрованного VirtualStringTree
    #39753641
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IsFilrered скрывает узлы ? у меня версия старенькая, IsFilrered нет.
тогда может GetNextVisible вместо GetNext ?
...
Рейтинг: 0 / 0
Вывод в excel отфильтрованного VirtualStringTree
    #39753645
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ghost Writer,

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

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


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