mozgobol
Участник
Offline
|
|
« : 26-02-2006 20:12 » |
|
мне надо подключить лист excel к программе, чтоб оттуда данные считывались, но чтобы он был отдельным файлом даже после компиляции, чтоб данные можно было изменить простым excel или еще чем нибудь, помогите плиииз
|
|
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #1 : 27-02-2006 02:45 » |
|
Самое простое сделать это через TExcelApplication (Вкладка Servers). Как с ним работать поищи через поисковик, в инете много всего про работу с Excel-ем написано.
|
|
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
newmen_
Гость
|
|
« Ответ #2 : 27-02-2006 04:03 » |
|
мы недавно лабу делали и мне понравился вариант работы через OLE. для чтения из ячеек в простейшем случае будет что-то похожее на этот код: uses comobj;
var hxls:olevariant; i:integer; begin try hxls:=GetActiveOleObject('Excel.Application'); //если excel уже запущен, то используем его (необязательно) except try hxls:=createoleobject('Excel.Application'); //иначе создаем новый экземпляр except raise exception.Create('Ошибка создания OLE-automation');//иначе - облом, вызываем исключение, exit; //выходим из процедуры по-хорошему end; end; hxls.workbooks.open(ExtractFilePath(paramstr(0))+'templ.xls');//открываем необходимый файл excel hxls.worksheets[1]; //выбираем нужный лист for i:=1 to 10 do memo.add( hxls.cells(i,1).text ); //cells(i,1) - это и есть указание ячейки с порядковыми номерами //1-параметр - строка, 2 - столбец
hxls.visible:=checkbox.Checked;//решаем, показывать таблицу или нет hxls:=null; //уничтожаем переменную, чтобы после закрытия приложения не оставался висеть процесс excel end;
|
|
« Последнее редактирование: 19-12-2007 19:29 от Алексей1153++ »
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #3 : 27-02-2006 04:42 » |
|
TExcelApplication тоже самое только организованное в виде класса и освобождает от понимания тонкостей ole, а посему проще для новечков newmen_, хотя конечно если хочешь понять ole твой вариант самое то.
|
|
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
mozgobol
Участник
Offline
|
|
« Ответ #4 : 27-02-2006 08:50 » |
|
а можно пояснения как для дауна? куда писать и что, как к ячейкам обращаться, лучше оле, чтоб сразу знать, мы легкие пути не ищем
|
|
|
Записан
|
|
|
|
newmen_
Гость
|
|
« Ответ #5 : 28-02-2006 09:59 » |
|
RomCom, ну дык я и сам-то не профи, но почему-то мне этот способ кажется более удобным mozgobol, в вышеприведенный код включены комментарии, по вашей просьбе
|
|
|
Записан
|
|
|
|
mozgobol
Участник
Offline
|
|
« Ответ #6 : 28-02-2006 19:56 » |
|
не пойму куда все это вставлять, ошибку выдает оно у меня, на try говорит что что то не так
|
|
|
Записан
|
|
|
|
newmen_
Гость
|
|
« Ответ #7 : 01-03-2006 03:20 » |
|
mozgobol, попробуйте выложить свой код, или файлы проекта, но сначала проверьте, возможно у вас не прописана библиотека в разделе (uses), простите, забыл указать: uses comobj;
а вставлять можно - куда пожелаете, т.е. в любую область описания кода
|
|
« Последнее редактирование: 01-03-2006 03:22 от newmen_ »
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #8 : 01-03-2006 03:30 » |
|
попробуй так. var i:integer; Exl, WorkBook, Sheet: Variant; begin try Exl:=GetActiveOleObject('Excel.Application'); except try Exl:=createoleobject('Excel.Application'); except raise exception.Create(''Ошибка создания OLE-automation'); exit; end; end; try Exl.WorkBooks.Open(FileName); WorkBook := Exl.WorkBooks.Item[1]; Sheet:=Exl.Application.Worksheets.Item[1]; for i:=1 to 10 do memo.Lines.add(Sheet.Cells[i,1]); finally Exl.Application.Quit; end; end; А вообще Яндекс выдает кучу примеров http://www.yandex.ru/yandsearch?text=createoleobject+Excel.Application&stype=www Посмотри, почитай. если что не получтся то обращайся
|
|
« Последнее редактирование: 19-12-2007 19:31 от Алексей1153++ »
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
mozgobol
Участник
Offline
|
|
« Ответ #9 : 01-03-2006 20:47 » |
|
ниче не получается , ошибки на каждой строчке!!!
|
|
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #10 : 02-03-2006 02:09 » |
|
А какие ошибки? Текст в студию
|
|
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
mozgobol
Участник
Offline
|
|
« Ответ #11 : 02-03-2006 10:09 » |
|
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, XPMan, ExtCtrls, jpeg;
type TForm1 = class(TForm) GroupBox1: TGroupBox; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; XPManifest1: TXPManifest; GroupBox2: TGroupBox; Image1: TImage; Image2: TImage; Image3: TImage; GroupBox3: TGroupBox; ComboBox1: TComboBox; ComboBox2: TComboBox; ComboBox3: TComboBox; Label1: TLabel; Edit1: TEdit; Label2: TLabel; Label3: TLabel; Edit2: TEdit; Edit3: TEdit; Label4: TLabel; ComboBox4: TComboBox; Label5: TLabel; ComboBox5: TComboBox; Label6: TLabel; ComboBox6: TComboBox; ComboBox10: TComboBox; Label11: TLabel; Edit4: TEdit; Label7: TLabel; Edit5: TEdit; GroupBox4: TGroupBox; Label8: TLabel; Label12: TLabel; ComboBox7: TComboBox; Label13: TLabel; ComboBox8: TComboBox; Label9: TLabel; ComboBox9: TComboBox; ComboBox11: TComboBox; Label14: TLabel; Button6: TButton; CheckBox1: TCheckBox; Label10: TLabel; Button7: TButton; Button8: TButton; procedure Button6Click(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure ComboBox2Change(Sender: TObject); procedure ComboBox3Change(Sender: TObject); procedure Button8Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; a,b,c,tip,p:integer; e,f,j,h:string; i,k,l,stoimotk:real; Exl, WorkBook, Sheet: Variant;
implementation
{$R *.dfm}
procedure TForm1.Button6Click(Sender: TObject); begin if combobox10.ItemIndex=1 then begin b:=strtoint(edit1.Text); c:=strtoint(edit5.Text); k:=(b+c+c+0.14)*17; label14.Caption:=floattostr(k); end else begin b:=strtoint(edit1.Text); c:=strtoint(edit5.Text); k:=(b+c+c*0.14)*21; label14.Caption:=floattostr(k); end; end;
procedure TForm1.CheckBox1Click(Sender: TObject); begin if checkbox1.Checked=true then begin combobox10.Visible:=true; end else begin combobox10.Visible:=false; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin tip:=1; end;
procedure TForm1.Button2Click(Sender: TObject); begin tip:=2; end;
procedure TForm1.Button3Click(Sender: TObject); begin tip:=3; end;
procedure TForm1.Button4Click(Sender: TObject); begin tip:=4; end;
procedure TForm1.Button5Click(Sender: TObject); begin tip:=5; end;
procedure TForm1.Button7Click(Sender: TObject); begin b:=strtoint(edit1.Text); c:=strtoint(edit5.Text); stoimotk:=(b+c+c+400)/1000; if combobox10.ItemIndex=0 then begin stoimotk:=stoimotk*17;
end; if combobox10.ItemIndex=1 then begin stoimotk:=stoimotk*18;
end; if combobox10.ItemIndex=2 then begin stoimotk:=stoimotk*21;
end; if combobox10.ItemIndex=3 then begin stoimotk:=stoimotk*24;
end; if combobox10.ItemIndex=4 then begin stoimotk:=stoimotk*27;
end; if combobox10.ItemIndex=5 then begin stoimotk:=stoimotk*28;
end; if combobox10.ItemIndex=6 then begin stoimotk:=stoimotk*32;
end; label10.Caption:=floattostr(stoimotk); if combobox10.ItemIndex=7 then begin label10.Caption:='aiaiai?iay'; end; end;
procedure TForm1.ComboBox1Change(Sender: TObject); begin if combobox1.ItemIndex=0 then begin image1.Picture.LoadFromFile('C:\Documents and Settings\iaen\Iie aieoiaiou\i?ia?aiia\pusto.bmp'); end; if combobox1.ItemIndex=1 then begin image1.Picture.LoadFromFile('C:\Documents and Settings\iaen\Iie aieoiaiou\i?ia?aiia\povorot.bmp'); end; if combobox1.ItemIndex=2 then begin image1.Picture.LoadFromFile('C:\Documents and Settings\iaen\Iie aieoiaiou\i?ia?aiia\pov-otk.bmp'); end; end;
procedure TForm1.ComboBox2Change(Sender: TObject); begin if combobox2.ItemIndex=0 then begin image2.Picture.LoadFromFile('C:\Documents and Settings\iaen\Iie aieoiaiou\i?ia?aiia\pusto.bmp'); end; if combobox2.ItemIndex=1 then begin image2.Picture.LoadFromFile('C:\Documents and Settings\iaen\Iie aieoiaiou\i?ia?aiia\povorot.bmp'); end; if combobox2.ItemIndex=2 then begin image2.Picture.LoadFromFile('C:\Documents and Settings\iaen\Iie aieoiaiou\i?ia?aiia\pov-otk.bmp'); end; end;
procedure TForm1.ComboBox3Change(Sender: TObject); begin if combobox3.ItemIndex=0 then begin image3.Picture.LoadFromFile('C:\Documents and Settings\iaen\Iie aieoiaiou\i?ia?aiia\pusto.bmp'); end; if combobox3.ItemIndex=1 then begin image3.Picture.LoadFromFile('C:\Documents and Settings\iaen\Iie aieoiaiou\i?ia?aiia\povorot.bmp'); end; if combobox3.ItemIndex=2 then begin image3.Picture.LoadFromFile('C:\Documents and Settings\iaen\Iie aieoiaiou\i?ia?aiia\pov-otk.bmp'); end; end;
procedure TForm1.Button8Click(Sender: TObject); begin try Exl:=GetActiveOleObject('Excel.Application'); except try Exl:=createoleobject('Excel.Application'); except raise exception.Create(''Ioeaea nicaaiey OLE-automation'); exit; end; end; try Exl.WorkBooks.Open(FileName); WorkBook := Exl.WorkBooks.Item[1]; Sheet:=Exl.Application.Worksheets.Item[1]; for p:=1 to 10 do memo.Lines.add(Sheet.Cells[p,1]); finally Exl.Application.Quit; end; end;
end.
|
|
« Последнее редактирование: 19-12-2007 19:32 от Алексей1153++ »
|
Записан
|
|
|
|
mozgobol
Участник
Offline
|
|
« Ответ #12 : 02-03-2006 10:11 » |
|
отправил весь но че то не че не делает, ошибки выдает и все
|
|
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #13 : 03-03-2006 01:49 » |
|
Две ошибки видно невооруженным глазом 1) неподключен юнит comobj 2) в строке Exl.WorkBooks.Open(FileName); у тебя не указан открываемый файл, сделай через переменную или укажи явно Exl.WorkBooks.Open('c:\test.xls'); Файл test.xls должен существовать. Исправь эти ошибки. Если после этого не получится будем разбираться дальше.
|
|
« Последнее редактирование: 19-12-2007 19:33 от Алексей1153++ »
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
mozgobol
Участник
Offline
|
|
« Ответ #14 : 03-03-2006 05:18 » |
|
raise exception.Create(''Ioeaea nicaaiey OLE-automation'); в этой строчке где то ошибка, он ее подчеркивает
|
|
« Последнее редактирование: 19-12-2007 19:34 от Алексей1153++ »
|
Записан
|
|
|
|
mozgobol
Участник
Offline
|
|
« Ответ #15 : 03-03-2006 05:19 » |
|
там было 2 апострофа, я исправил, а теперь в этой ошибка memo.Lines.add(Sheet.Cells[p,1]);
|
|
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #16 : 03-03-2006 07:47 » |
|
Строка memo.Lines.add(Sheet.Cells[p,1]); добавляет строку с содержимым ячейки [p,1], из Листа (номер один - Exl.Application.Worksheets.Item[1]; ) открытого файла, в компонент TMemo. Но у тебя нет на форме такого компонента. Добавь TMemo или выводи данные кудато в другое место.
|
|
« Последнее редактирование: 03-03-2006 08:37 от RomCom »
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
Fatal_Error
|
|
« Ответ #17 : 06-03-2006 01:32 » |
|
Не буду вдаватся в подробности но вот исходник самого примитивного экспорта в EXCEL список подключённых модулей: --------------------------------------------------- uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleServer, ExcelXP, StdCtrls,ComObj, Grids; --------------------------------------------------- ну и сама процедура
--------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var ExcelApplication:variant;
begin ExcelApplication := CreateOleObject ('Excel.Application');//подключаемся ExcelApplication.Visible:=true; //активируем ExcelApplication.WorkBooks.Add;//добовляем новую книгу ExcelApplication.Cells[1{строка},1{столбец}].value:='Экспорт удался Ура!'; //зписываем в первую строку первого столбца это значение ExcelApplication.ActiveWorkbook.SaveAs('c:\test.xls'); //сохраняемся ExcelApplication.Quit; //и уходим
end;
|
|
« Последнее редактирование: 19-12-2007 19:34 от Алексей1153++ »
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #18 : 06-03-2006 02:29 » |
|
Юнит ExcelXP необязателно подключать. Он в этом примере не испоьзуется.
|
|
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
nikedeforest
|
|
« Ответ #19 : 08-03-2006 16:13 » |
|
Хотел спросить у вас, а откуда вы брали информацию о том, что надо подключать (имена серверов и файлов, имена методов) для того, чтобы работать с Excel? По сути это просьба поделится статьями, книгами, ссылками и т.п. (т.е. всем ).
|
|
« Последнее редактирование: 08-03-2006 16:16 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
mozgobol
Участник
Offline
|
|
« Ответ #20 : 08-03-2006 17:39 » |
|
уточни, че то я не догнал
|
|
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #21 : 09-03-2006 00:18 » |
|
Какие юнеты подключать для конкретной процедуры есть в хелпе: С методами COM-объектов посложнее, стандартный источник - всезнающий MSDN. Лично я все фунции для Excel и Word узнаю через VBA. Там и хелп кстати не плохой, с примерами.
|
|
« Последнее редактирование: 09-03-2006 00:26 от RomCom »
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
Fatal_Error
|
|
« Ответ #22 : 09-03-2006 01:53 » |
|
nikedeforest
Лично я различную инфу выкачивал по мере надобности. Столкнулся с проблемой бегом в яндекс и на форумы любимые. Если есть конкретная проблема искать решение проще, чем разбиратся в куче неопределённой и может даже совсем нигоной информации. P\s. VB просто создан для работы с EXCEL, ведь в самом EXCEL есть встроенные VB..так что если хочешь узнать побольше функции которые можно применить в делфе для работы с excel, то они теже самые что и в VB. Т.е берёшь хелпу, ну а тут как говорится и дебагер тебе в руки=))))
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #23 : 09-03-2006 12:21 » |
|
Одна беда, не знаю я visual basic, но это ладно. А какой хелп вы смотрите, прямо в Excel'e который?
|
|
« Последнее редактирование: 19-12-2007 19:36 от Алексей1153++ »
|
Записан
|
ещё один вопрос ...
|
|
|
Fatal_Error
|
|
« Ответ #24 : 10-03-2006 02:00 » |
|
nikedeforest ----------------- Да хелп который например есть в excel 2003 вполне подойдёт. Запустишь хелп по огловлениям, там есть пункт "microsoft excel visual basic reference", там дальше сам разберёшся. Принцип такой подключаешь модули вот эти:
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleServer, ExcelXP, StdCtrls,ComObj, Grids; ------------------------------ в самой процедуре объявляешь переменную: var ExcelApplication:variant; --------------------------
вот а дальше работаешь с этой переменной так:
ExcelApplication.{процедура или функция которую найдёшь в хелпе, ну естественно ту которая тебе нужна}; ---------------------- минус правдо что хелп на английском..но это не беда:) главное там кусочки программного кода есть...что в общем облегчает понимание..и назначение той или иной функции, а если есть хоть какие нибудь первоначальные знания технического английского языка..то разобратся несоставит труда..главное чтоб желание было=)) имхо
|
|
« Последнее редактирование: 10-03-2006 02:03 от Fatal_Error »
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #25 : 10-03-2006 09:07 » |
|
Хм, а обязательно что ли ExcelApplication? Я вообще-то на Visual C++ пишу на чистом АПИ. ExcelApplication - это какая-то фича для тех кто пишит на Дельфе? Я просто подумывал, что ваш код можно и на Вижуале применить.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Fatal_Error
|
|
« Ответ #26 : 10-03-2006 09:47 » |
|
ExcelApplication - это какая-то фича для тех кто пишит на Дельфе?
=)) здесь хоть так напиши fuckoff:variant;-это нестоль существенно. и опять же обращайся к функциям слудующим образом: fuckoff.{процедура или функция которую найдёшь в хелпе, ну естественно ту которая тебе нужна}; ----------------------------------- просто в палитре делфи есть такой компанент на закладке servers...так что для тех кому лень написать вот это: -------------------------------- var {любое название переменной лижбе синтаксис языка позволял}:variant; -------------------------------- просто кидаю этот компанент на форму, а делфи автоматом в исходном коде прописывает.. нужные строки и подключает библиотеки..получается так ..что впринципе одно и тоже..только на первый взгляд выгледит более замудрёний, ну плюс в том что в USES атоматом соответствующие модули прописываются...вот так: ------------------------- ExcelApplication1: TExcelApplication; {но это уже особенности программиования в делфи} ------------------------------ а для обращения уже пишешь например: ExcelApplication1.WorkBooks.Add;//но этот вариант менее универсален, так как по характеру чисто приблуда делфи=)))
|
|
|
Записан
|
|
|
|
Fatal_Error
|
|
« Ответ #27 : 10-03-2006 09:56 » |
|
а насчёт Сишняка..я брал некоторые коды исходников адаптировал под делфи(учитывая особенности синтаксиса языка программирования)..и всё нормуль похало....здесь главное идея реализации самой проблемы которую ты хочешь решить...а языки программировани все между собой похожи немного=))
|
|
|
Записан
|
|
|
|
mozgobol
Участник
Offline
|
|
« Ответ #28 : 10-03-2006 16:17 » |
|
ну это само сабой разумеется, просто некоторые языки программирования не так хорошо функциональны как другие и все
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #29 : 10-03-2006 17:04 » |
|
Я не правильно выразился (да к тому же Паскаль подзабыл). Меня тип данных смутил (variant получается). Такого на С нету. Вот меня и интересует, то ли этот тип будет, когда я буду юзать библиотеки для ОЛЕ или этот типа фича Дельфевская.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
|