Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с офисом 2000 [D7, XP]


Страницы:   1 2

nickmas ©   (2006-04-08 02:53:00) 

Уважаемые мастера! Помогите разобраться в следующей проблеме:

Используя позднее связывание, создаю график в Excel-e:

...
Excel.Charts.Add;
Excel.Charts[1].ChartType:=xlXYScatterSmooth;

Добавляю данные в график:

Excel.Charts[1].SeriesCollection.NewSeries;
Excel.Charts[1].SeriesCollection[1].XValues:=VarArrayOf([xsr1,xsr2,xsr3]);
Excel.Charts[1].SeriesCollection[1].Values:=VarArrayOf([ysr1,ysr2,ysr3]);

И теперь привязываю данный график к листу с названием "Результат":

Excel.ActiveChart.Location(xlLocationAsObject,'Результат');

Так вот проблема в том, что у меня стоит 2003 офис и все нормально работает. Но..., как выяснилось позже, не работает на 2000 офисе. А именно: не хочет привязывать график к данному листу.

Может кто укажет, в чем тут моя ошибка?

Заранее благодарен!!!


nickmas   (2006-04-26 04:43:00) [1]

В общем я так и не понял почему оно не работает, но зато нашел другой выход, который меня устраивает.

Вместо следующих строчек кода

...
Excel.Charts.Add;
...
Excel.ActiveChart.Location(xlLocationAsObject, 'График');
Excel.Sheets[2].ChartObjects[1].Height:=165;
Excel.Sheets[2].ChartObjects[1].Width:=288;
Excel.Sheets[2].ChartObjects[1].Left:=48;
Excel.Sheets[2].ChartObjects[1].Top:=14;
...


я использовал следующее:

...
Excel.Sheets[2].ChartObjects.Add(48,14,288,165);
Excel.Sheets[2].ChartObjects[1].Activate;
...


И все теперь работает, как в 2003, так и в 2000 офисе.

В общем проблема решена.

Отдельное спасибо sniknik!!!


sniknik   (2006-04-16 19:30:00) [2]

> Хорошо, но почему, когда я ставлю первы лист
> ...
> он находит этот объект?
у меня нет 2000го (и ставить не собираюсь ;), предположить можно (в очередной раз ;), к примеру самой страницы нет... ну ты же не указываеш книге сколько страниц должно быть перед созданием, значит берет из дефаултных настроек. вполне может быть одна.
или в 2000м графики только на первой странице возможны ... (бред), либо еще чего.

> Но не хочет понимать эту команду
> CoApplication.Create
> Почему? Или может пример я взял для изучения неудачный?
старый возможно, посмотри в получившемся excel_TLB (это тоже что ранее упроминавшиеся Excel2000/ExcelXP) там скорее всего определена Co ExcelApplication, ее и надо/можно использовать. а можно из нее CreateComObject вынести, то же самое будет.


nickmas   (2006-04-16 18:18:00) [3]


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


Хорошо, но почему, когда я ставлю первы лист
Excel.Sheets[1].ChartObjects[1].Height:=165;
Excel.Sheets[1].ChartObjects[1].Width:=288;
Excel.Sheets[1].ChartObjects[1].Left:=48;
Excel.Sheets[1].ChartObjects[1].Top:=14;

он находит этот объект?

И еще, если не трудно, подскажи пожалуйста, какие модули надо подключить для использования раннего связывания или еще чего там надо сделать (для того, чтобы после точки выскакивало меню с методами). А то я первы раз пытаюсь попробовать поработать с ранним связыванием, и... не получается. За основу взял пример

...
uses
 windows, sysutils, excel_tlb;
...
procedure CreateSpreadsheet(filename: string);
var
 xla: _Application;
 xlw: _Workbook;
 LCID: integer;
begin
 xla := CoApplication.Create;
 LCID := GetUserDefaultLCID;
 try
   xla.Visible[LCID] := true;
   // пустая книга
   //xlw := xla.Workbooks.Add(xlWBATWorksheet, LCID);
   // новая книга на основе шаблона
   xlw := xla.Workbooks.Add(
     'c:\delphi\excel\sample\demo.xlt',
     LCID);
   xla.Range['A1', 'A1'].Value := 'Date';
   xla.Cells[1, 2].Value := FormatDateTime('dd-mmm-yyyy', Now);
   xla.Cells[3, 1].Value := 'Numbers';
   xla.Range['B3', 'E3'].Value := VarArrayOf([1, 10, 100, 1000]);
   xla.Range['F3', 'F3'].Formula := '=Sum(B3:E3)';
   OLEVariant(xla).Run(
     'Demo',
     FormatDateTime('dd-mmm-yyyy', Now)
     );
   xlw.SaveAs(
     filename,
     xlWorkbookNormal,
     '', '', False, False,
     xlNoChange,
     xlLocalSessionChanges,
     true, 0, 0, LCID);
 finally
   xla.Quit;
 end;
end;


импортировал EXCEL9.OLB, как там было рекомендовано. После чего подключил excel_TLB - нормально. Но не хочет понимать эту команду
CoApplication.Create
Почему? Или может пример я взял для изучения неудачный?


sniknik   (2006-04-16 08:39:00) [4]

> Невозможно получить свойство ChartObjects класса Worksheet
это как раз то о чем я тебе "твердил"... нет обьекта/метода/... в старой версии (возможно есть аналог, но он не от листа идет а например обший от книги... ну там варианты возможны) т.е. то что я говорил предположительно то в ошибке указано явно (и не нужны долгие разговоры об этом, привел сообщение и все ясно).

> что значит on E: Exception?
> и #10#13#10#13+E.Message?
значит "при получении любого исключения после пустой строки показать оригинальный месайдж этого исключения"

> Не удается найти указанный файл,
д, это я не учел. когда убрал проверку if FileExists(FileName) then как раз подумал нафиг не нужна т.к. нет там ексептов, потом добавил уже в свой код возбуждение исключения но не вернул проверку, забыл.
правильнее так
{$WARN SYMBOL_PLATFORM OFF}
if FileExists(FileName) then Win32Check(DeleteFile(FileName));
{$WARN SYMBOL_PLATFORM ON}
и правильность не в только в этой конструкции а и в том что она внутри try except  см. [25]
нужна если по какойто причине старый файл не удается удалить... значит и ексель его переписать не сможет возможно (ну открыт уже ексклюзивно и т.д.) тогда причина будет в том же общем сообщении "Не могу сохранить ..." (т.е. неважно по какой причине не удалось, обработчик ексепта один на все получится)

> Задолбался я бегать - поставил себе вторую ОС и на нее офис 2000.
см. [8], с этого начал.  но ты посчитал тогда установку такогоже офиса как у препода слишком сложным (?) и искал обходные пути... теперь понял что на самом деле сложно? ;о))


nickmas   (2006-04-16 03:11:00) [5]

To sniknik:

Спасибо за совет, но там выдало следующее

Невозможно получить свойство ChartObjects класса Worksheet

т.е. то, о чем я и раньше твердил: не может найти график на втором листе, т.к. его ко второму листу не привязал.

Когда меняю второй лист на превый

Excel.Sheets[1].ChartObjects[1].Height:=165;
Excel.Sheets[1].ChartObjects[1].Width:=288;
Excel.Sheets[1].ChartObjects[1].Left:=48;
Excel.Sheets[1].ChartObjects[1].Top:=14;


то работает все нормально. Это говорит о том, что график не привязывается ко второму листу, а "ложится" по умолчанию на превый лист.

Кстати, об этом
Невозможно получить свойство ChartObjects класса Worksheet
пишет и в Делфи, когда запускаешь проект на выполнение в самом Делфи.

Но вот это тоже прикольно
on E: Exception do
Application.MessageBox(PChar('Не могу сохранить экспериментальные данные в Excel!'#10#13+'По причине ошибки :'#10#13#10#13+E.Message),'Ошибка!', MB_OK or MB_ICONERROR);

я просто не знал как это делается, да и до сих пор не совсем понял, как оно так работает:

что значит on E: Exception?
и #10#13#10#13+E.Message?

И вот этот случай
{$WARN SYMBOL_PLATFORM OFF}
Win32Check(DeleteFile(FileName));
{$WARN SYMBOL_PLATFORM ON}

"ругается"
Не удается найти указанный файл,
когда файла "Data.xls" не существует.
Чем это решение в данном случае плохое
if FileExists(FileName) then
  DeleteFile(FileName);
?


> иди снова проверять на машину с 2000м офисом

Задолбался я бегать - поставил себе вторую ОС и на нее офис 2000.

А вобще, спасибо за помощь!!!


sniknik   (2006-04-15 15:54:00) [6]

тат подумал... первые две строки тоже бы надо внести внутрь try, особенно удаление, с небольшой добавкой, т.к. посмотрел оно делает только вызов виндовой процедуры, ексепта не выдает... поэтому

...
    try
      FileName:= ExtractFilePath(Application.ExeName)+'Data.xls';
      {$WARN SYMBOL_PLATFORM OFF}
      Win32Check(DeleteFile(FileName));
      {$WARN SYMBOL_PLATFORM ON}

      Excel.WorkBooks.Add;
...


sniknik   (2006-04-15 15:15:00) [7]

понятно. вот и нашлась самая главная ошибка - писать так чтобы прятать ошибки, т.е. информацию в них, о том, что произошло...

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

переписывай этот кусок вот так, и иди снова проверять на машину с 2000м офисом, то что там выдаст, к этому надо будет прислушатся...  
procedure TForm1.Button1Click(Sender: TObject);
var
 FileName: string;
 Excel: OleVariant;
begin
 FileName:= ExtractFilePath(Application.ExeName)+'Data.xls';
 DeleteFile(FileName);
 Excel:= CreateOleObject('Excel.Application');
 try
   try
     Excel.WorkBooks.Add;
     Excel.Sheets[2].Activate;
     Excel.Sheets[2].Name:= 'График';
     Excel.Charts.Add;
     Excel.Charts[1].ChartType:= xlXYScatterSmooth;
     Excel.Charts[1].SeriesCollection.NewSeries;
     Excel.Charts[1].SeriesCollection[1].XValues:= VarArrayOf([1,2,3]);
     Excel.Charts[1].SeriesCollection[1].Values:= VarArrayOf([2,1,3]);
     Excel.ActiveChart.Location(xlLocationAsObject, 'График');
     Excel.Sheets[2].ChartObjects[1].Height:=165;
     Excel.Sheets[2].ChartObjects[1].Width:=288;
     Excel.Sheets[2].ChartObjects[1].Left:=48;
     Excel.Sheets[2].ChartObjects[1].Top:=14;
     Excel.ActiveWorkbook.Close(SaveChanges:=True, Filename:= FileName);
     Excel.Quit;
   except
      on E: Exception do
       Application.MessageBox(PChar('Не могу сохранить экспериментальные данные в Excel!'#10#13+
                                    'По причине ошибки :'#10#13#10#13+ E.Message),'Ошибка!', MB_OK or MB_ICONERROR);

   end;
 finally
   Excel:= NULL;
 end;
end;


nickmas   (2006-04-15 13:37:00) [8]

Вот код маленькой программки "Тест", которая не работает с офисом 2000 имено из-за этой проблемы. Может так будет проще вам разобраться, в чем тут "бок".

...

uses ComObj, OleServer, Excel2000, ...;

...

procedure TForm1.Button1Click(Sender: TObject);
var
 Path, PathTemp: string;
 Excel: Variant;
begin
 Path:=Application.ExeName;
 PathTemp:='';
 While (Pos('\',Path)>0) do
   begin
     PathTemp:=PathTemp+Copy(Path,1,Pos('\',Path));
     Delete(Path,1,Pos('\',Path));
   end;
 Path:=PathTemp+'Data.xls';
 if FileExists(Path) then
   DeleteFile(Path);
 try
   Excel:=CreateOleObject('Excel.Application');
   Excel.WorkBooks.Add;
   Excel.Sheets[2].Activate;
   Excel.Sheets[2].Name:='График';
   Excel.Charts.Add;
   Excel.Charts[1].ChartType:=xlXYScatterSmooth;
   Excel.Charts[1].SeriesCollection.NewSeries;
   Excel.Charts[1].SeriesCollection[1].XValues:=VarArrayOf([1,2,3]);
   Excel.Charts[1].SeriesCollection[1].Values:=VarArrayOf([2,1,3]);
   Excel.ActiveChart.Location(xlLocationAsObject,'График');
   Excel.Sheets[2].ChartObjects[1].Height:=165;
   Excel.Sheets[2].ChartObjects[1].Width:=288;
   Excel.Sheets[2].ChartObjects[1].Left:=48;
   Excel.Sheets[2].ChartObjects[1].Top:=14;
   Excel.ActiveWorkbook.Close(SaveChanges:=True, Filename:=Path);
   Excel.Quit;
 except
   Excel.ActiveWorkbook.Close(SaveChanges:=False);
   Excel.Quit;
   MessageBox(Handle,'Не могу сохранить экспериментальные данные в Excel!','Информация',48);
 end;
end;


nickmas   (2006-04-12 11:48:00) [9]

Не знал, что при простановки точки будет выскакивать меню с доступными методами и свойствами при раннем связывании. Спасибо за совет. Надо попробовать...


sniknik   (2006-04-10 20:20:00) [10]

> Например, какие методы?
а я знаю? смотри что ты там используеш, проверяй...
например
> Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets('Результат'));
Excel - я, может не быть обьекта ActiveChart, у ActiveChart функции Location, Location может иметь не 2 параметра, не в том порядке и т.д.

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


nickmas   (2006-04-10 19:13:00) [11]

To sniknik

Например, какие методы?


sniknik   (2006-04-10 17:39:00) [12]

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


nickmas   (2006-04-10 17:31:00) [13]


> хотябы проверить то что у тебя не идет, методов может не
> быть.


Согласен, но это приведет к тому (если при раннем связывании найду решение), что опять таки придется переделывать все на раннее связывание. А по этому поводу я уже высказывал свою ситуацию.

А делать прогу смешанную, т.е. с ранним и поздним связыванием одновременно, - я вообще не представляю что из этого получится. Думаю из этого ничего хорошего не выйдет.


> зачем вообще править? не проще ли показывать на установленной
> 2003 версии офиса, и все.


Дело в том, что у препода дома на компе стоит 2000-й офис, и естественно у него возник вопрос: "Почему программа не работает?". А это для него важно, чтобы дома работала, т.к. сейчас все стараются давать темы дипломных с корысными целями, чтобы он в данном случае мог пользоваться этой программой и в дальнешем. И еще немаловажный факт - попробуй докажи пожилому человеку, да еще и проофессору-математику, что у него софт, включая офис, древний. Естественно он скажет, что это программа плохо написана, что не работает у него на компьютере. В общем бесполезно и пытаться его заставить переустановить у себя офис.


nickmas   (2006-04-10 16:53:00) [14]


> Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets('Результат'));
>   или что-то в этом духе. Вобщем надо лист указать, а не
> его имя


Пробовал я по разному при офисе 2000: и так

Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets('Результат'));

и так

Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets[2]);

не идет.


sniknik   (2006-04-10 15:02:00) [15]

> эта программа - дипломная, и она уже готова, вопрос только в этом. Как найду решение, исправлю и все, готово.
зачем вообще править? не проще ли показывать на установленной 2003 версии офиса, и все.


sniknik   (2006-04-10 14:59:00) [16]

> Так ты мне предлагаешь полностью перейти с позднего связывания на раннее?
хотябы проверить то что у тебя не идет, методов может не быть.

и то только после того как ты фактически проигнорировал "правильную мысль... " ([8]) писать и отлаживать с установленной минимальной версией того, что хочеш поддерживать.

> В общем, меня интересует решение данной проблемы при позднем связывании.
используя один продукт искать проблемы другого... это на сайт ясновидящих надо.


EvS   (2006-04-10 14:31:00) [17]

>Excel.ActiveChart.Location(xlLocationAsObject,'Результат');
 
Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets('Результат'));
 или что-то в этом духе. Вобщем надо лист указать, а не его имя


nickmas   (2006-04-10 14:02:00) [18]

Так ты мне предлагаешь полностью перейти с позднего связывания на раннее? Во-первых там достаточно много переделывать, а во-вторых - я с ранним связыванием так толком и не разобрался, хотя знаю, что оно предпочтительнее. Да и времени не так уж много, чтобы разбираться и все переделывать - эта программа - дипломная, и она уже готова, вопрос только в этом. Как найду решение, исправлю и все, готово.

А для себя, конечно, надо разобраться будет с ранним связыванием, но это уже будет позже, по крайней мере не для этой программы.

В общем, меня интересует решение данной проблемы при позднем связывании. Есть еще какие мысли по этому поводу?


sniknik   (2006-04-10 09:02:00) [19]

> Excel2000 у меня подключен
просто подключить мало, надо им пользоваться (обьявить Excel: _Workbook; создавать Excel:= CoExcelWorkbook; ...)  тогда тебе будут доступны только его методы уже на этапе компиляции, лишнего не добавиш...
остальные (ExcelXP и Excel97) лишние, к тому же у тебя все одно только переменные(описания) из него используются.

> Excel у меня Variant
а вот у варианта проверка только на выполнении идет.


nickmas   (2006-04-10 08:55:00) [20]

Отлаживал, работал на другой машине правда, от туда и узнал, что глюк здесь

Excel.ActiveChart.Location(xlLocationAsObject,'Результат');

Не знаю как решить эту проблему. Вот и спрашиваю вас всех.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо