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 палитры компонентов).
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 |
Есть способ по проще — надо на форму поставить компонент ExcelApplication Так это и есть OLE-управление. Т. е. файл XLS открывает OLE-сервер (в данном случае — MS Excel). А программа на Делфи лишь управляет этим сервером и обменивается с ним данными. Т. е., такой код работает только, если MS Excel установлен на компе.
0 |
pivogol 21 / 21 / 8 Регистрация: 07.01.2009 Сообщений: 556 |
||||
21.05.2015, 20:29 |
7 |
|||
А как в указанном примере открытую книгу сделать видимой?
Ни один вариант не работает.
0 |
Mawrat 13094 / 5875 / 1706 Регистрация: 19.09.2009 Сообщений: 8,808 |
||||||||||||
22.05.2015, 07:58 |
8 |
|||||||||||
Как открыть рабочую книгу MS Excel и получить доступ к самой книге, к её листу и, например, записать в ячейку текст:
А как в указанном примере открытую книгу сделать видимой? Нужно сделать видимым окно приложения MS Excel:
Если открыто несколько книг и нужно показать пользователю какую-то из них, для этого надо вызвать метод WorkBook.Activate. Такое свойство есть и у листа рабочей книги. Поэтому можно показать, также, нужный лист:
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
22.05.2015, 07:58 |
Помогаю со студенческими работами здесь Открыть файл Excel Открыть файл Excel Подскажите… Открыть файл в Excel … Открыть файл из Delphi Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 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
134k19 gold badges356 silver badges483 bronze badges
asked Jun 17, 2010 at 6:47
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_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
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. |
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:
- Open the regedit editor.
- 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; |