Не открывает excel delphi

0 / 0 / 0

Регистрация: 24.02.2009

Сообщений: 6

1

02.10.2009, 01:14. Показов 37932. Ответов 7


Студворк — интернет-сервис помощи студентам

Подскажите пожалуйста как открыть файл Exel в Delphi.



0



13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

02.10.2009, 02:03

2

Без Ole-управления XLS читать (и записывать) можно с помощью EMS компонент. В сети можно найти ссылки на бесплатное скачивание. Ну или самому прогу писать. Но это проблемно — формат XLS сложный. Есть описания формата на англ. языке. На русском — не знаю…



0



Turbosega

40 / 40 / 10

Регистрация: 27.06.2008

Сообщений: 118

02.10.2009, 09:57

3

Лучший ответ Сообщение было отмечено как решение

Решение

Есть способ по проще — надо на форму поставить компонент ExcelApplication (закладка Servers палитры компонентов).
Дальше можно так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var
  ...
  WorkBk : _WorkBook;
  WorkSheet : _WorkSheet;
  FileName: String;
...
 
procedure TForm1.Button1Click(Sender: TObject);
 
begin
   
     FileName:='C:Book1.xls';
try
  ExcelApplication1.Connect;
      ExcelApplication1.Workbooks.Open(FileName,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
   WorkBk:=ExcelApplication1.WorkBooks.Item[ExcelApplication1.Workbooks.Count];
 
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
 
except
      MessageDlg('Cannot open MS Excel document!'#13'('+FileName+')',mtError,[mbOk],0); Exit;
 end;
 
 
end;



3



0 / 0 / 0

Регистрация: 24.02.2009

Сообщений: 6

02.10.2009, 12:47

 [ТС]

4

ОГромное спасибо!!!!!!!!!!!!!!!!! ВСе получилось!!!!!



0



13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

02.10.2009, 22:20

5

Цитата
Сообщение от Turbosega
Посмотреть сообщение

Есть способ по проще — надо на форму поставить компонент ExcelApplication

Так это и есть OLE-управление. Т. е. файл XLS открывает OLE-сервер (в данном случае — MS Excel). А программа на Делфи лишь управляет этим сервером и обменивается с ним данными. Т. е., такой код работает только, если MS Excel установлен на компе.



0



pivogol

21 / 21 / 8

Регистрация: 07.01.2009

Сообщений: 556

21.05.2015, 20:29

7

А как в указанном примере открытую книгу сделать видимой?
Я попробовал три варианта:

Delphi
1
2
3
  ExcelApplication1.visible:=true;
  WorkBk.visible:=true;
  WorkSheet.visible:=true;

Ни один вариант не работает.



0



Mawrat

13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

22.05.2015, 07:58

8

Как открыть рабочую книгу MS Excel и получить доступ к самой книге, к её листу и, например, записать в ячейку текст:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender : TObject);
var
  exApp, exBook, exSh : OleVariant;
  Od : TOpenDialog;
begin
  //Диалог выбора файла.
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  if Od.InitialDir = '' then //В качестве начальной выбираем папку, в которой лежит исполняемый файл программы.
    Od.InitialDir := ExtractFilePath(ParamStr(0));
  if not Od.Execute then //Диалог выбора файла.
    Exit;
  if not FileExists(Od.FileName) then //Проверка существования файла.
  begin
    MessageBox(Handle, 'Файл с заданным именем не найден! Действие отменено.',
      'Внимание!', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  //Запуск экземпляра Excel и получение ссылки на интерфейс корневого объекта (Excel.Application).
  exApp := CreateOleObject('Excel.Application');
  //Делаем видимым окно MS Excel. На время отладки или на постоянной основе.
  exApp.Visible := True;
  //Открываем раб. книгу и получаем ссылку на её интерфейс.
  exBook := exApp.Workbooks.Open(FileName:=Od.FileName);
  //Ссылка на интерфейс первого листа рабочей книги.
  exSh := exBook.Worksheets[1];
  
  //Запись текста в ячейку на третьей строке и втором столбце:
  exSh.Cells[3, 2].Value := 'Этот текст записан в ячейку с адресом: ' + exSh.Cells[3, 2].Address;
  
  //exBook.Close; //Закрываем рабочую книгу.
  //exApp.Quit;   //Закрываем MS Excel
end;

Цитата
Сообщение от pivogol
Посмотреть сообщение

А как в указанном примере открытую книгу сделать видимой?

Нужно сделать видимым окно приложения MS Excel:

Delphi
1
2
  //Делаем видимым окно MS Excel. На время отладки или на постоянной основе.
  exApp.Visible := True;

Если открыто несколько книг и нужно показать пользователю какую-то из них, для этого надо вызвать метод WorkBook.Activate. Такое свойство есть и у листа рабочей книги. Поэтому можно показать, также, нужный лист:

Delphi
1
2
  exBook.Activate; //Активация рабочей книги.
  exBook.Worksheets[1].Activate; //Активация первого листа рабочей книги.



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

22.05.2015, 07:58

Помогаю со студенческими работами здесь

Открыть файл Excel
Как сделать так, что бы по нажатию кнопки открывался Excelевский документ
Есть код, но он не…

Открыть файл Excel
Нужно сделать так, что бы при нажатие на кнопку открывался документ MS Excel 2010.

Подскажите…

Открыть файл в Excel
Ребят помогите пожалуйста не знаю что делать уже! Сделал так он открывает пустой файл!

Открыть файл из Delphi
я пробую код открытие на файл *cdw через просмоторщик компаса, viewer запускаеться, но потом выдает…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

8

I am having difficulty opening a EXCEL 2007 in Delphi 7 It works for Office 2003 and below but the wonderful people at microsoft have sent an update or something and the delphi app fell over just earlier this month.

  oE := GetActiveOleObject('Excel.Application');
  oE.Workbooks.Open(Filename:=sFilename, UpdateLinks:=false, ReadOnly:=true); //Error

I get the following error:

‘c:TempBook1.xls’ could not be
found. Check the spelling of the file
name, and verify that the file
location is correct.’#$A#$A’If you are
trying to open the file from your list
of most recently used files, make sure
that the file has not been renamed,
moved, or deleted’

Yet if I run the same command in VBA there is no problem.

RRUZ's user avatar

RRUZ

134k19 gold badges356 silver badges483 bronze badges

asked Jun 17, 2010 at 6:47

Traci's user avatar

2

I know this sounds stupid, but have you manually confirmed that the file exists at that location?

What exactly is the contents of sFileName, is it the full path or only the filename? When it is only the filename, maybe Excel can’t find it because its current working directory is something else. If you are only passing the filename, try the full path instead.

answered Jun 17, 2010 at 7:02

The_Fox's user avatar

The_FoxThe_Fox

6,9522 gold badges43 silver badges69 bronze badges

3

the full code for the lookers :

uses ComObj; ..

procdure startExcel; 
var   
  oE:Variant; 
begin
  try 
    oE := GetActiveOleObject('Excel.Application');
  except
    oE := CreateOleObject('Excel.Application'); 
  end; 
  oE.Workbooks.Open(filename, false, false);
  oE.Visible := True; 
end;

source

answered Mar 2, 2011 at 16:29

none's user avatar

nonenone

4,61814 gold badges59 silver badges100 bronze badges

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
Как ни крути, а время DOS и килобайтов оперативной памяти прошло. Вряд ли кто-то всерьез сейчас задумывается над тем куда это с винчестера пропал мегабайт? Да и использование в своих приложениях функциональности программ, которых ты не писал, но которые выполняют что-то лучше — это всё-таки больший прогресс, нежели корпеть год-два над программой, а потом узнать, что время-то прошло.

Введение

Итак, цель сегодняшней статьи — поделиться с Вами опытом работы с Microsoft Excel в приложениях, написанных на Delphi.
Вспомнился сейчас один случай. Когда я только начинал работать по своей специальности, пригласили меня написать программу-расчётник для экологов нашего нефтезавода. В принципе ничего серьёзного — программа считает выброс от нагревательной печи и выдает табличку результатов, которую необходимо распечатать и уложить в толстую папку с отчётами. Естественно, что в области разработки подобных приложения я далеко не пионер, поэтому дали взглянуть на аналог будущей программы, который работал ещё под DOS и печатались отчёты на дико скрипящем матричном принтере с 12-ю иголками. Ну посмотрел, элементарная таблица, расчёт немного запутан, но жить можно — начал по-тихоньку писать. И попалась мне тогда на глаза статейка про работу с Excel в Delphi. Вот я и решил попробовать выдавать отчёт не только на форму приложения, а ещё и скидывать весь ход расчёта с формулами и прочим делом в Excel…Надо сказать более сильно детской радости начальника отдела я не видел до сих пор :). Люди, всю жизнь проработавшие в DOS увидели как тот же самый расчёт может выглядеть в современных условиях. Вот теперь при определении технических заданий на каждую новую программу, обязательно присутствует пункт, гласящий, что программа должна передавать данные либо в MS Word либо в MS Excel.Соответственно и цена на разработку возрастает, иногда значительно.

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

Ну, а для того, чтобы каждый раз не утруждать себя выполнением однотипных операций, я разработал небольшой модуль для работы с Excel. Этот же модуль я в настоящее время дорабатываю под ещё одну задачу, но об этом после. Сегодня основы основ работы с Excel в Delphi.

Создаем новый модуль (unit) и подключаем в uses следующие модули:

uses ComObj, ActiveX, Variants, Windows, Messages, SysUtils, Classes;

теперь объявляем глобальную переменную:

Одну константу (для удобства):

const ExcelApp = 'Excel.Application';

И пишем простенькую функцию:

function CheckExcelInstall:boolean;
var
  ClassID: TCLSID;
  Rez : HRESULT;
begin
// Ищем CLSID OLE-объекта
  Rez := CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID);
  if Rez = S_OK then  // Объект найден
    Result := true
  else
    Result := false;
end;

Или ещё короче:

function CheckExcelInstall: boolean;
var
  ClassID: TCLSID;
begin
  Result:=CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID) = S_OK;
end;

Если функция CLSIDFromProgID находит CLSID OLE-объекта, то, соответственно — Excel установлен.

Но проверка на наличие установленного Excel — это только часть необходимых операций перед началом работы. Другой немаловажной проверкой является проверка на наличие уже запущенного экземпляра Excel. Если этого не делать, то может случиться такая нехорошая ситуация, когда в системе будет зарегистрировано …дцать процессов Excel и все оперативная память волшебным образом утекает «в трубу» — за такое могут и по ушам надавать. Но мы-то свои уши бережем. Пишем вторую функцию проверки.

2. Определяем запущен ли Excel

function CheckExcelRun: boolean;
begin
  try
    MyExcel:=GetActiveOleObject(ExcelApp);
    Result:=True;
  except
    Result:=false;
  end;
end;

Думаю тут лишних объяснений не потребуется? Всё предельно просто — если есть активный процесс Excel, то мы просто получаем на него ссылку и можем использовать Excel для своих корыстных целей. Главное — не забыть проверить — может кто-то этот самый Excel забыл закрыть, но это другой момент. Будем считать, что Excel в нашем полном распоряжении.

3. Как запустить Excel?

Одно дело, когда мы получаем в распоряжение уже запущенный Excel, другое — когда Excel требуется запустить из Delphi. Напишем функцию запуска Excel:

function RunExcel(DisableAlerts:boolean=true; Visible: boolean=false): boolean;
begin
  try
{проверяем установлен ли Excel}
    if CheckExcelInstall then
      begin
        MyExcel:=CreateOleObject(ExcelApp);
//показывать/не показывать системные сообщения Excel (лучше не показывать)
        MyExcel.Application.EnableEvents:=DisableAlerts;
        MyExcel.Visible:=Visible;
        Result:=true;
      end
    else
      begin
        MessageBox(0,'Приложение MS Excel не установлено на этом компьютере','Ошибка',MB_OK+MB_ICONERROR);
        Result:=false;
      end;
  except
    Result:=false;
  end;
end;

Здесь мы в начале проверяем, установлен ли Excel в принципе и, если он все же установлен, запускам. При этом мы можем сразу показать окно Excel пользователю — для этого необходимо выставить параметр Visible в значение True.

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

Переходим к следующему этапу работы — созданию рабочей книги.

4. Создаем пустую рабочую книгу Excel

Для создания пустой рабочей книги я обычно использую вот такую функцию:

function AddWorkBook(AutoRun:boolean=true):boolean;
begin
  if CheckExcelRun then
    begin
      MyExcel.WorkBooks.Add;
      Result:=true;
    end
  else
   if AutoRun then
     begin
       RunExcel;
       MyExcel.WorkBooks.Add;
       Result:=true;
     end
   else
     Result:=false;
end;

Второй вариант (более лаконичный):

function AddWorkBook(AutoRun: boolean = true): boolean;
begin
  Result := CheckExcelRun;
  if (not Result) and (AutoRun) then
  begin
    RunExcel;
    Result := CheckExcelRun;
  end;
  if Result then
    MyExcel.WorkBooks.Add;
end;

То есть сразу проверяю запущен ли Excel и, если он не запущен, то либо запускаю и добавляю книгу, либо просто выхожу — всё зависит от ситуации.

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

function GetAllWorkBooks:TStringList;
var i:integer;
begin
  try
    Result:=TStringList.Create;
    for i:=1 to MyExcel.WorkBooks.Count do
      Result.Add(MyExcel.WorkBooks.Item[i].FullName)
  except
    MessageBox(0,'Ошибка перечисления открытых книг','Ошибка',MB_OK+MB_ICONERROR);
  end;
end;

Функция возвращает список TStringList всех рабочих книг Excel открытых в данный момент. Обратите внимание, что в отличие от Delphi Excel присваивает первой книге индекс 1, а не 0 как это обычно делается в Delphi при работе, например, с теми же индексами в ComboBox’ах.

Ну, и наконец, после того, как поработали с книгами — их требуется закрыть. Точнее сохранить, а потом уж закрыть.

5. Сохраняем рабочую книгу и закрываем Excel

Для того, чтобы сохранить рабочую книгу, я использовал такую функцию:

function SaveWorkBook(FileName:TFileName; WBIndex:integer):boolean;
begin
  try
    MyExcel.WorkBooks.Item[WBIndex].SaveAs(FileName);
    if MyExcel.WorkBooks.Item[WBIndex].Saved then
      Result:=true
    else
      Result:=false;
  except
    Result:=false;
  end;
end;

Если у Вас открыто 10 книг — просто вызываете функцию 10 раз, меняя значение параметра WBIndex и имени файла и дело в шляпе.

А закрывается Excel вот так:

function StopExcel:boolean;
begin
  try
    if MyExcel.Visible then MyExcel.Visible:=false;
    MyExcel.Quit;
    MyExcel:=Unassigned;
    Result:=True;
  except
    Result:=false;
  end;
end;

Вот набор тех основных функций с которых начинается вся интеграция Excel в приложения написанные на Delphi. В следующий раз займемся работой с конкретной книгой — научимся записывать и читать данные из книг.

Книжная полка

Название:Разработка приложений Microsoft Office 2007 в Delphi

Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.

купить книгу delphi на ЛитРес

5
3
голоса

Рейтинг статьи

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

The problem was that the previous version of Excel was uninstalled incorrectly on the machine. To fix it, I used the following instructions from Microsoft:

  1. Open the regedit editor.
  2. Open HKEY_CLASSES_ROOT >> TypeLib >> {00020813-0000-0000-C000-000000000046}

(The Excel PIA key is {00020813-0000-0000-C000-000000000046})
3. Delete the last version folder (Excel 2013 is 1.8, Excel 2016 is 1.9)

A similar fix can be applied to other Office products:

Excel
HKEY_CLASSES_ROOTTypeLib{00020813-0000-0000-C000-000000000046}

  • 1.7 is for Office 2010
  • 1.8 is for Office 2013
  • 1.9 is for Office 2016

Word HKEY_CLASSES_ROOTTypeLib{00020905-0000-0000-C000-000000000046}

  • 8.5 is for Office 2010
  • 8.6 is for Office 2013
  • 8.7 is for Office 2016

PowerPoint HKEY_CLASSES_ROOTTypeLib{91493440-5A91-11CF-8700-00AA0060263B}

  • 2.a is for Office 2010
  • 2.b is for Office 2013
  • 2.c is for Office 2016

Outlook HKEY_CLASSES_ROOTTypeLib{00062FFF-0000-0000-C000-000000000046}

  • 9.4 is for Office 2010
  • 9.5 is for Office 2013
  • 9.6 is for Office 2016

Here’s a sample regedit file to fix the Registry for Office 2016:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOTTypeLib{00020813-0000-0000-C000-000000000046}1.9]
"PrimaryInteropAssemblyName"="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C"
@="Microsoft Graph 16.0 Object Library"

[HKEY_CLASSES_ROOTTypeLib{00020813-0000-0000-C000-000000000046}1.9]

[HKEY_CLASSES_ROOTTypeLib{00020813-0000-0000-C000-000000000046}1.9win64]
@="C:\Program Files\Microsoft Office\Office16\EXCEL.EXE"

[HKEY_CLASSES_ROOTTypeLib{00020813-0000-0000-C000-000000000046}1.9FLAGS]
@="0"

[HKEY_CLASSES_ROOTTypeLib{00020813-0000-0000-C000-000000000046}1.9HELPDIR]
@="C:\Program Files\Microsoft Office\Office16\"

[HKEY_CLASSES_ROOTTypeLib{00020905-0000-0000-C000-000000000046}8.7]
"PrimaryInteropAssemblyName"="Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C"
@="Microsoft Graph 16.0 Object Library"

[HKEY_CLASSES_ROOTTypeLib{00020905-0000-0000-C000-000000000046}8.7]

[HKEY_CLASSES_ROOTTypeLib{00020905-0000-0000-C000-000000000046}8.7win64]
@="C:\Program Files\Microsoft Office\Office16\MSWORD.OLB"

[HKEY_CLASSES_ROOTTypeLib{00020905-0000-0000-C000-000000000046}8.7FLAGS]
@="0"

[HKEY_CLASSES_ROOTTypeLib{00020905-0000-0000-C000-000000000046}8.7HELPDIR]
@="C:\Program Files\Microsoft Office\Office16\"

Для этого, в раздел Uses программы, необходимо включить модуль ComObj.

Далее поместим на форму компонент TButton и в обработчике событий OnClick запишем следующий код:

procedure TForm1.Button1Click(Sender: TObject);

var

XL: Variant;

begin

XL := CreateOLEObject(‘Excel.Application’); // Создание OLE объекта

XL.WorkBooks.add; // Создание новой рабочей книги

XL.visible := true;

end;

Результатом выполнения станет запуск программы Microsoft Excel и открытие нового листа.

Для открытия уже существующего документа Excel следует воспользоваться методом Open:

XL.WorkBooks.Open(‘c:example.xls’);

Если необходимо открыть документ Excel только для чтения, пишем следующее:

XL.Workbooks.Open[‘c:example.xls’, 0, True];

Для закрытия документа Excel:

Если Вам необходимо при открытии файла использовать не абсолютный, а относительный путь, то необходимо предварительно воспользоваться функцией GetDir, рассмотрим пример ниже:

procedure TForm1.Button1Click(Sender: TObject);

var

   XL: Variant;

   AppLocation:string;

begin

   try

XL := CreateOLEObject(‘Excel.Application’); // Создание OLE объекта

   except

     ShowMessage(‘Cannot start MS Excel.’);

   end;

GetDir(0,AppLocation); // Возвращает текущий каталог диска

XL.WorkBooks.Open(AppLocation +‘filename.xlsx’);

XL.visible := true;

end;


Like this post? Please share to your friends:
  • Не открываемый word скачать
  • Не отвечает документ word как сохранить файл
  • Не отвечает word при печати
  • Не отвечает word на mac
  • Не отвечает word 2007