Не открывается файл 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

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

Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
Как ни крути, а время 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
голоса

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

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

Здравствуйте! Вижу вопрос уже канул в лету, а проблема то осталась. Немного переформулирую.

Возникла небольшая проблема и я никак не могу понять, в чём тут может быть дело. Есть код:

...
 odOpenF.FileName:='';
 if odOpenF.Execute then
  begin
   try
    //При выполнении следующего оператора возникает исключительная ситуация
    EXL:=CreateOleObject('Excel.Application');
    EXL.Visible:=false;
    EXL.Workbooks.Open(odOpenF.FileName);
    ...

Причём возникает только в том случае, если я в появляющемся dialog открытия файла, дважды щёлкаю по выбираемому файлу, а не выбираю, а затем нажимаю «Открыть» (в этом случае всё проходит нормально).

Без try.. except.. end возникают следующие ошибки:

alt text

А иногда:

alt text

Ещё пару раз выдавал что-то там «недостаточно ресурсов», но я тогда не отскриншотил, а сообщение больше не появлялось.

Причём видимых причин для всего этого нет.

Ещё проводил один любопытный тест, в коде (на том месте где комментарий) писал MessageDlg(odOpenF.FileName, mtInformation, [mbOk], 0) (ну мало ли, а вдруг как-то полевому заполняется FileName). После этого ошибка снова переставала возникать.

В общем резюмируя скажу: что-то глючит. Однозначно где-то я ступил в коде, где именно — без понятия. Может быть вы подскажите?

Дополнение. Сегодня тестил на других компьютерах — ошибок не было. Похоже программа глючит только с ОСью х64

624

06 декабря 2002 года

HollyBlood

44 / / 20.06.2000

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

ExcelApplication.Connect;
except
MessageDlg(‘Microsoft Excel Not Installed’, mtError, [mbOk], 0);
exit;
end;
st := IniFile.ReadString(‘TemplatesFr’,GetTemplateForm.ListBox.Items.Strings[GetTemplateForm.Result],»);
ExcelApplication.Workbooks.Open(<полный путь к файлу>,0,true,1,»,»,true,xlWindows,’,’,true,true,0,false,0);
ExcelWorkbook.ConnectTo(ExcelApplication.Workbooks.Item[1]);
ExcelWorkbook.Activate;
ExcelApplication.Visible[0] := true;

А дальше работаем с ВоркБуком.
Вроде всё.

Для этого, в раздел 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:
  • Не открывается файл excel xlsb
  • Не открывается файл excel 365
  • Не открывается только один файл excel
  • Не открывается несколько документов word одновременно
  • Не открывается текст в excel