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 |
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
Как ни крути, а время 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
голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Здравствуйте! Вижу вопрос уже канул в лету, а проблема то осталась. Немного переформулирую.
Возникла небольшая проблема и я никак не могу понять, в чём тут может быть дело. Есть код:
...
odOpenF.FileName:='';
if odOpenF.Execute then
begin
try
//При выполнении следующего оператора возникает исключительная ситуация
EXL:=CreateOleObject('Excel.Application');
EXL.Visible:=false;
EXL.Workbooks.Open(odOpenF.FileName);
...
Причём возникает только в том случае, если я в появляющемся dialog открытия файла, дважды щёлкаю по выбираемому файлу, а не выбираю, а затем нажимаю «Открыть» (в этом случае всё проходит нормально).
Без try.. except.. end
возникают следующие ошибки:
А иногда:
Ещё пару раз выдавал что-то там «недостаточно ресурсов», но я тогда не отскриншотил, а сообщение больше не появлялось.
Причём видимых причин для всего этого нет.
Ещё проводил один любопытный тест, в коде (на том месте где комментарий) писал 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; |