Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2013.12.15;
Скачать: [xml.tar.bz2];

Вниз

Обработка Excel в Delphi   Найти похожие ветки 

 
den945 ©   (2011-01-09 00:48) [0]

Пытаюсь обработать документ Exel в Delphi при помощи технологии ADO. Но при запуске любого проекта с любым компонентом ADO возникает ошибка "Project Project1.exe raised exception class EOleException with message "Разрушительный сбой".Process stopped. Use Step or Run to continue.". Облазил кучу форумов, но ответа не нашел. Подскажите плиз!!!


 
Плохиш ©   (2011-01-09 01:21) [1]

У вас ошибка в 17й строке.


 
den945 ©   (2011-01-09 01:36) [2]

17-я строка у меня public declarations...(((


 
Германн ©   (2011-01-09 02:41) [3]


> возникает ошибка "Project Project1.exe raised exception
> class EOleException with message "Разрушительный сбой"

У меня выработалось четкое правило. Если я встречаю где-то сообщение не на аглицком языке сообщение об ошибке (и если я точно знаю, что не я его писал), то ну их нафиг все сторонние компоненты!
:)
В т.ч. и переводы от Polaris.
Примите и прочь!


 
Anatoly Podgoretsky ©   (2011-01-09 10:35) [4]

> den945  (09.01.2011 01:36:02)  [2]

Неправда, я посмотрел текст, там совсем другое.


 
Anatoly Podgoretsky ©   (2011-01-09 10:36) [5]

> Германн  (09.01.2011 02:41:03)  [3]

И Эксель с Офисом нафиг?


 
Плохиш ©   (2011-01-09 14:59) [6]


> den945 ©   (09.01.11 01:36) [2]

тогда вам нужно нанять программиста.


 
YurikGL ©   (2011-01-10 12:50) [7]


> Пытаюсь обработать документ Exel в Delphi при помощи технологии
> ADO.

Пытался вырывать зуб отверткой... неудобно... и пациент издает такие звуки. которые на форумах не описаны.

Рекомендую посмотреть ссылку http://code.progler.ru/view/363


 
Плохиш ©   (2011-01-10 14:01) [8]


> YurikGL ©   (10.01.11 12:50) [7]

Excel может выступать источником данных, как и любая база данных.


 
sniknik ©   (2011-01-10 16:17) [9]

> Рекомендую посмотреть ссылку
набор отверток...


 
Cobalt ©   (2011-01-12 10:34) [10]

den, вопросы про подземный стук здесь не понимают
Расскажи что ты делаешь конкретно, что используешь, как используешь, в какой ситуации/на какой строчке кода происходит ошибка.


 
YurikGL ©   (2011-01-12 19:34) [11]


> Excel может выступать источником данных, как и любая база
> данных.

Может... вопрос скорости и удобсто работы.


> sniknik ©   (10.01.11 16:17) [9]
А я и не спорю... причем очень старых. Но если автору так хочется...


 
sniknik ©   (2011-01-12 19:39) [12]

>> Excel может выступать источником данных, как и любая база данных.
> вопрос скорости и удобсто работы.
это самый быстрый, и удобный способ работы с данными (стандартный). во всяком случае ни один из методов по ссылке его "не догонит", да и код будет покороче.


 
YurikGL ©   (2011-01-12 20:07) [13]


> это самый быстрый, и удобный способ работы с данными (стандартный).
>  во всяком случае ни один из методов по ссылке его "не догонит",
>  да и код будет покороче.

По ссылке пройдите.. там этот метод тоже есть.


 
sniknik ©   (2011-01-12 21:19) [14]

> там этот метод тоже есть.
нет, там есть кучка дерьма (сорри), в котором утопили многое, в том числе и ADO. то что оно где то краешком выглядывает не делает это ADO методом

вот, что должно быть (убрал все лишнее)
begin
 ADOConnectionSource.Execute(
   "SELECT * INTO [Телефоны] IN ""+GetCurrentDir+"\1.xls" "Excel 8.0;" FROM QMain"
 );
 ShowMessage("Экспорт завершен");
 Shellexecute(Application.Handle, "open", PAnsiChar(GetCurrentDir+"\1.xls"), nil, nil, sw_ShowNormal);
end;


 
YurikGL ©   (2011-01-13 07:04) [15]


> вот, что должно быть (убрал все лишнее)
> begin
>  ADOConnectionSource.Execute(
>    "SELECT * INTO [Телефоны] IN ""+GetCurrentDir+"\1.xls"
> "Excel 8.0;" FROM QMain"
>  );
>  ShowMessage("Экспорт завершен");
>  Shellexecute(Application.Handle, "open", PAnsiChar(GetCurrentDir+"\1.
> xls"), nil, nil, sw_ShowNormal);
> end;
>

Время работы кода у меня получилось почти в 5 раз медленнее, чем при создании xml-ки.
Что делаю не так?


 
sniknik ©   (2011-01-13 07:54) [16]

> Что делаю не так?
врешь неуклюже.


 
sniknik ©   (2011-01-13 08:04) [17]

p.s. для тех кому неохота качать "примеры", сравнение идет вот с этим кодом, который якобы  в 5 раз быстрее ...

procedure TForm1.SourceDatasetInit;
Begin
ADODataSetSource.Close;
ADODataSetSource.CommandText:="SELECT [Main].[Tel], "+
                               "[Main].[name], "+
                               "[Ul].[NameUl], "+
                               "[Main].[House], "+
                               "[Korp].[NameKorp], "+
                               "[Flat].[NameFlat] "+
" FROM Main, Ul, Korp, Flat "+
" WHERE ([Main].[IdUl]=[Ul].[IdUl]) And ([Main].[IdKorp]=[Korp].[IdKorp]) And ([Main].[IdFlat]=[Flat].[IdFlat]) ";
ADODataSetSource.Open;
End;

procedure TForm1.BXMLWithOutShablonClick(Sender: TObject);
var
i:integer;
begin
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");
shellexecute(Application.Handle,"open",PAnsiChar(GetCurrentDir+"\1.xml"),nil,nil, sw_ShowNormal);
end;


 
YurikGL ©   (2011-01-13 12:16) [18]


> > Что делаю не так?
> врешь неуклюже.


Время выгрузки через ADO по твоему варианту 1563
Экспорт через OLE без шаблона 1015
Экспорт через XLM без шаблона 250

Время считается через GetTickCount

Кто врет?


 
sniknik ©   (2011-01-13 12:23) [19]

> Время выгрузки через ADO по твоему варианту 1563
а кнопку быстрее жать не пробовал?
... думаю догадался в чем "проблема". LoL
у меня 31, и время "считается через GetTickCount".

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


 
sniknik ©   (2011-01-13 12:26) [20]

> Экспорт через XLM без шаблона 250
поставь DisableControls ADODataSetSource-ру, сократишь до ~ 170 ти. но все одно "не догнать".


 
YurikGL ©   (2011-01-13 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 ©   (2011-01-13 12:38) [22]

GetTickCount в коде есть и там и там...


 
YurikGL ©   (2011-01-13 12:43) [23]


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

У ADO время сокращается, если xls-файл создан изначально...


 
sniknik ©   (2011-01-13 12:45) [24]

> ShowMessage("Экспорт завершен");
> Memo1.Lines.add("Экспорт через ADO "+IntToStr(GetTickCount-t));

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


 
YurikGL ©   (2011-01-13 12:58) [25]


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

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

Экспорт через ADO 265
Экспорт через CSV 250
:P


 
Anatoly Podgoretsky ©   (2011-01-13 16:21) [26]

> sniknik  (13.01.2011 08:04:17)  [17]

А результаты огласить?


 
Anatoly Podgoretsky ©   (2011-01-13 16:24) [27]

> sniknik  (13.01.2011 12:23:19)  [19]

Какой смысл считать в тиках, результаты будут сильно различаться от машине к
машине. Считать надо с помощью аппаратного, системного таймера RDTSc.
Результата тоже будут различаться но не значительно и не зависят от тактовой
частоты, а только от модели процессора


 
sniknik ©   (2011-01-13 16:33) [28]

> А результаты огласить?
~31 ("мой") vs ~256 ("его") +- конечно, т.е. вполне может и 78 vs 278 выдать.

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

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

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


 
YurikGL ©   (2011-01-13 20:16) [29]


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

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

измерять а серию insert-в



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2013.12.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.003 c
15-1372019403
Юрий
2013-06-24 00:30
2013.12.15
С днем рождения ! 24 июня 2013 понедельник


15-1372278603
Юрий
2013-06-27 00:30
2013.12.15
С днем рождения ! 27 июня 2013 четверг


15-1372493135
картман
2013-06-29 12:05
2013.12.15
забыл музыку


15-1371754611
Rouse_
2013-06-20 22:56
2013.12.15
Фотоотчет о 31 мая 2013


8-1230298787
Alex_r
2008-12-26 16:39
2013.12.15
Как в OpenGL выводить на нормальные координаты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский