Конференция "Базы" » Обработка Excel в Delphi [D7, Excel]
 
  • sniknik © (13.01.11 12:26) [20]
    > Экспорт через XLM без шаблона 250
    поставь DisableControls ADODataSetSource-ру, сократишь до ~ 170 ти. но все одно "не догнать".
  • YurikGL © (13.01.11 12:37) [21]

    > > Кто врет?
    > ты конечно, т.к. утверждаешь это голословно, без показа
    > "как считается", и "что GetTickCount" (где GetTickCount-
    > ы поставил).
    >

    Офис 2003

    Кнопка 1 результат Экспорт через ADO 1187
    procedure TForm1.BADOClick(Sender: TObject);
    var
    i:integer;
    t:Integer;
    begin
    t:=GetTickCount;

    //вариант 2

    ADOConnectionSource.Execute(
      'SELECT * INTO [Телефоны] IN \"'+GetCurrentDir+'\2.xls\" \"Excel 8.0;\" FROM QMain'
    );
    ShowMessage('Экспорт завершен');
    Memo1.Lines.add('Экспорт через ADO '+IntToStr(GetTickCount-t));
    Shellexecute(Application.Handle, 'open', PAnsiChar(GetCurrentDir+'\2.xls'), nil, nil, sw_ShowNormal);

    end;



    Кнопка 2 Экспорт через XLM без шаблона 188

    procedure TForm1.BXMLWithOutShablonClick(Sender: TObject);
    var
    i,t:integer;
    begin
    t:=GetTickCount;
    SourceDatasetInit;
    //Создаем пустой документ
    XMLDocument1.Active:=false;
    XMLDocument1.XML.Clear;
    XMLDocument1.xml.Add('<?xml version=\"1.0\"?>');
    XMLDocument1.xml.Add('<?mso-application progid=\"Excel.Sheet\"?>');
    XMLDocument1.xml.Add('<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"');
    XMLDocument1.xml.Add(' xmlns:o=\"urn:schemas-microsoft-com:office:office\"');
    XMLDocument1.xml.Add(' xmlns:x=\"urn:schemas-microsoft-com:office:excel\"');
    XMLDocument1.xml.Add(' xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"');
    XMLDocument1.xml.Add(' xmlns:html=\"http://www.w3.org/TR/REC-html40\">');
    XMLDocument1.xml.Add('</Workbook>');
    XMLDocument1.Active:=true;
    //создаем лист Лист1
    XMLDocument1.ChildNodes.Nodes['Workbook'].ChildNodes.Nodes['Worksheet'].Attribut es['ss:Name']:='Лист1';
    with XMLDocument1.ChildNodes.Nodes['Workbook'].ChildNodes.Nodes['Worksheet'].ChildNod es.Nodes['Table'] do begin
    //Выставляем размер будующей таблицы
     Attributes['ss:ExpandedColumnCount']:=IntToStr(ADODataSetSource.FieldCount);
     Attributes['ss:ExpandedRowCount']:=IntToStr(ADODataSetSource.RecordCount+1);
     Attributes['x:FullColumns']:=1;
     Attributes['x:FullRows']:=1;
    //установим ширину колонок
     AddChild('Column');
     ChildNodes.Last.Attributes['ss:Index']:=2;     //номер колонки
     ChildNodes.Last.Attributes['ss:Width']:=240;   //ширина колонки
     AddChild('Column');
     ChildNodes.Last.Attributes['ss:Index']:=3;
     ChildNodes.Last.Attributes['ss:Width']:=100;   //Если нужно нецелое, то разделитель - '.' а не ','
     AddChild('Row');
    //Создаем заголовки таблицы
     ChildNodes.Last.AddChild('Cell');
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].Attributes['ss:Type']:='Strin g';
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].NodeValue:='Телефон';
     ChildNodes.Last.AddChild('Cell');
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].Attributes['ss:Type']:='Strin g';
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].NodeValue:='Имя';
     ChildNodes.Last.AddChild('Cell');
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].Attributes['ss:Type']:='Strin g';
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].NodeValue:='Улица';
     ChildNodes.Last.AddChild('Cell');
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].Attributes['ss:Type']:='Strin g';
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].NodeValue:='Дом';
     ChildNodes.Last.AddChild('Cell');
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].Attributes['ss:Type']:='Strin g';
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].NodeValue:='Корпус';
     ChildNodes.Last.AddChild('Cell');
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].Attributes['ss:Type']:='Strin g';
     ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].NodeValue:='Квартира';
    //Собственно экспорт таблицы
     ADODataSetSource.First;
     repeat
       AddChild('Row');
       for i:=0 to ADODataSetSource.FieldCount-1 do begin;
         ChildNodes.Last.AddChild('Cell');
         ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].Attributes['ss:Type']:='Strin g';
         ChildNodes.Last.ChildNodes.Last.ChildNodes['Data'].NodeValue:=ADODataSetSource.F ields[i].AsString;
                                                    end;
       ADODataSetSource.Next;
     until ADODataSetSource.Eof;

    end;
    XMLDocument1.SaveToFile(GetCurrentDir+'\1.xml');
    Memo1.Lines.add('Экспорт через XLM без шаблона '+IntToStr(GetTickCount-t));
    shellexecute(Application.Handle,'open',PAnsiChar(GetCurrentDir+'\1.xml'),nil,nil, sw_ShowNormal);
    end;

  • YurikGL © (13.01.11 12:38) [22]
    GetTickCount в коде есть и там и там...
  • YurikGL © (13.01.11 12:43) [23]

    > sniknik ©   (13.01.11 12:26) [20]

    У ADO время сокращается, если xls-файл создан изначально...
  • sniknik © (13.01.11 12:45) [24]
    > ShowMessage('Экспорт завершен');
    > Memo1.Lines.add('Экспорт через ADO '+IntToStr(GetTickCount-t));

    ну я прям так и знал... измеряешь свое  время реакции? два раза LoL
  • YurikGL © (13.01.11 12:58) [25]

    > ну я прям так и знал... измеряешь свое  время реакции? два
    > раза LoL

    ой.. ё...
    Ну все равно

    Экспорт через ADO 265
    Экспорт через CSV 250
    :P
  • Anatoly Podgoretsky © (13.01.11 16:21) [26]
    > sniknik  (13.01.2011 08:04:17)  [17]

    А результаты огласить?
  • Anatoly Podgoretsky © (13.01.11 16:24) [27]
    > sniknik  (13.01.2011 12:23:19)  [19]

    Какой смысл считать в тиках, результаты будут сильно различаться от машине к
    машине. Считать надо с помощью аппаратного, системного таймера RDTSc.
    Результата тоже будут различаться но не значительно и не зависят от тактовой
    частоты, а только от модели процессора
  • sniknik © (13.01.11 16:33) [28]
    > А результаты огласить?
    ~31 ("мой") vs ~256 ("его") +- конечно, т.е. вполне может и 78 vs 278 выдать.

    сам можешь проверить скачав примеры из [7] (+ скопипастить туда код из [14])

    > Какой смысл считать в тиках
    так, ради общего представления. не более.

    > Считать надо с помощью
    вообще, тут бы нормально тысяч 20-100 записей, но есть только 135. не очень очевидный тест.
  • YurikGL © (13.01.11 20:16) [29]

    > вообще, тут бы нормально тысяч 20-100 записей, но есть только
    > 135. не очень очевидный тест.
    >

    Я бы сказал что "пакетный" ввод тоже мало показателен...Если данные формируется динамически (для простоты, из файла читаем) то все таки надо не
    ADOConnectionSource.Execute(
     'SELECT * INTO [Телефоны] IN \"'+GetCurrentDir+'\2.xls\" \"Excel 8.0;\" FROM QMain'
    );


    измерять а серию insert-в
 
Конференция "Базы" » Обработка Excel в Delphi [D7, Excel]
Есть новые Нет новых   [134431   +15][b:0][p:0.003]