Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ПАМАГИТЕ!!! как лист excel подключить к программе  (Прочитано 29549 раз)
0 Пользователей и 1 Гость смотрят эту тему.
mozgobol
Участник

ru
Offline Offline

« : 26-02-2006 20:12 » 

мне надо подключить лист excel к программе, чтоб оттуда данные считывались, но чтобы он был отдельным файлом даже после компиляции, чтоб данные можно было изменить простым excel или еще чем нибудь, помогите плиииз
Записан
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 27-02-2006 04:42 » new

TExcelApplication тоже самое только организованное в виде класса и освобождает от понимания тонкостей ole, а посему проще для новечков Улыбаюсь
newmen_, хотя конечно если хочешь понять ole твой вариант самое то.
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
mozgobol
Участник

ru
Offline Offline

« Ответ #4 : 27-02-2006 08:50 » 

а можно пояснения как для дауна? куда писать и что, как к ячейкам обращаться, лучше оле, чтоб сразу знать, мы легкие пути не ищем
Записан
newmen_
Гость
« Ответ #5 : 28-02-2006 09:59 » 

RomCom,
ну дык я и сам-то не профи, но почему-то мне этот способ кажется более удобным
mozgobol,
в вышеприведенный код включены комментарии, по вашей просьбе
Записан
mozgobol
Участник

ru
Offline 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
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Участник

ru
Offline Offline

« Ответ #9 : 01-03-2006 20:47 » 

ниче не получается , ошибки на каждой строчке!!!
Записан
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 02-03-2006 02:09 » 

А какие ошибки?
Текст в студию Улыбаюсь
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
mozgobol
Участник

ru
Offline 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
Участник

ru
Offline Offline

« Ответ #12 : 02-03-2006 10:11 » 

отправил весь но че то не че не делает, ошибки выдает и все
Записан
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Участник

ru
Offline Offline

« Ответ #14 : 03-03-2006 05:18 » 

raise exception.Create(''Ioeaea nicaaiey OLE-automation'); в этой строчке где то ошибка, он ее подчеркивает
« Последнее редактирование: 19-12-2007 19:34 от Алексей1153++ » Записан
mozgobol
Участник

ru
Offline Offline

« Ответ #15 : 03-03-2006 05:19 » 

там было 2 апострофа, я исправил, а теперь в этой ошибка  memo.Lines.add(Sheet.Cells[p,1]);
Записан
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #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
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 06-03-2006 02:29 » 

Юнит ExcelXP необязателно подключать. Он в этом примере не испоьзуется.
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 08-03-2006 16:13 » 

Хотел спросить у вас, а откуда вы брали информацию о том, что надо подключать (имена серверов и файлов, имена методов) для того, чтобы работать с Excel?
По сути это просьба поделится статьями, книгами, ссылками и т.п. (т.е. всем Улыбаюсь ).
« Последнее редактирование: 08-03-2006 16:16 от nikedeforest » Записан

ещё один вопрос ...
mozgobol
Участник

ru
Offline Offline

« Ответ #20 : 08-03-2006 17:39 » 

уточни, че то я не догнал
Записан
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 09-03-2006 00:18 » 

Какие юнеты подключать для конкретной процедуры есть в хелпе:

С методами COM-объектов посложнее, стандартный источник - всезнающий MSDN. Лично я все фунции для Excel и Word узнаю через VBA. Там и хелп кстати не плохой, с примерами.

* Untitled-1.png (1.4 Кб - загружено 2394 раз.)
« Последнее редактирование: 09-03-2006 00:26 от RomCom » Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
Fatal_Error
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 09-03-2006 01:53 » 

nikedeforest

Лично я различную инфу выкачивал по мере надобности. Столкнулся с проблемой бегом в яндекс и на форумы любимые. Если есть конкретная проблема искать решение проще, чем разбиратся в куче неопределённой и может даже совсем нигоной информации. P\s. VB просто создан для работы с EXCEL, ведь в самом EXCEL есть встроенные VB..так что если хочешь узнать побольше функции которые можно применить в делфе для работы с excel, то они теже самые что и в VB. Т.е берёшь хелпу, ну а тут  как говорится и дебагер тебе в руки=))))
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 09-03-2006 12:21 » 

Одна беда, не знаю я visual basic, но это ладно. А какой хелп вы смотрите, прямо в Excel'e который?
« Последнее редактирование: 19-12-2007 19:36 от Алексей1153++ » Записан

ещё один вопрос ...
Fatal_Error
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 10-03-2006 09:07 » 

Хм, а обязательно что ли ExcelApplication? Я вообще-то на Visual C++ пишу на чистом АПИ. ExcelApplication - это какая-то фича для тех кто пишит на Дельфе? Я просто подумывал, что ваш код можно и на Вижуале применить.
Записан

ещё один вопрос ...
Fatal_Error
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 10-03-2006 09:47 » 

ExcelApplication - это какая-то фича для тех кто пишит на Дельфе?
=)) здесь хоть так напиши fuckoff:variant;-это нестоль существенно.
и опять же обращайся к функциям
слудующим образом:
fuckoff.{процедура или функция которую найдёшь в хелпе, ну естественно ту которая тебе нужна};
-----------------------------------

просто в палитре делфи есть такой компанент на закладке servers...так что для тех кому лень написать вот это:
--------------------------------
var
{любое название переменной лижбе синтаксис языка позволял}:variant;
--------------------------------


просто кидаю этот компанент на форму, а делфи автоматом в исходном коде прописывает.. нужные строки и подключает библиотеки..получается так ..что впринципе одно и тоже..только на первый взгляд выгледит более замудрёний, ну плюс в том что в USES атоматом соответствующие модули прописываются...вот так:
-------------------------

ExcelApplication1: TExcelApplication; {но это уже особенности программиования в делфи}
------------------------------
а для обращения уже пишешь например:

ExcelApplication1.WorkBooks.Add;//но этот вариант менее универсален, так как по характеру чисто приблуда делфи=)))
Записан
Fatal_Error
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 10-03-2006 09:56 » 

а насчёт Сишняка..я брал некоторые коды исходников адаптировал под делфи(учитывая особенности синтаксиса языка программирования)..и всё нормуль похало....здесь главное идея реализации самой проблемы которую ты хочешь решить...а языки программировани все между собой похожи немного=))
Записан
mozgobol
Участник

ru
Offline Offline

« Ответ #28 : 10-03-2006 16:17 » 

ну это само сабой разумеется, просто некоторые языки программирования не так хорошо функциональны как другие и все
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 10-03-2006 17:04 » 

Я не правильно выразился (да к тому же Паскаль подзабыл). Меня тип данных смутил (variant получается). Такого на С нету. Вот меня и интересует, то ли этот тип будет, когда я буду юзать библиотеки для ОЛЕ или этот типа фича Дельфевская.
Записан

ещё один вопрос ...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines