![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с офисом 2000 [D7, XP]
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,'Результат');
Не знаю как решить эту проблему. Вот и спрашиваю вас всех.