Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2010, 10:09   #1
prw07
 
Регистрация: 02.08.2010
Сообщений: 9
По умолчанию Как считать данные из EXCELевской таблицы

Есть файл .xls мне нужно считать его (поместить в DBGrid или что-то в этом роде) и обработать.
Нашел 2 способа , но не один меня полностью не устраивает:
1. через функцию CreateOleObject('Excel.Application' ), но это меня не устраивает, т.к. данная функция работает только с Microsoft Excel, а мне нужно OpenOffice

Вопрос: можно ли CreateOleObject... использовать с OpenOffice ?

2. Через ADOConnection и ADOQuery (привожу ссылку, т.к. много описания для понимания): http://delphiexpert.ru/view_lesson.php?id=52
Но возникли некоторые проблемы:
1. В DBGrid выводит данные из .xls файла только со второй строки (первую не выводит).
Изображения
Тип файла: jpg 1.JPG (30.0 Кб, 117 просмотров)
prw07 вне форума Ответить с цитированием
Старый 02.08.2010, 10:27   #2
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Приведите код загрузки данных из Excel в DataSet, на который настроен DBGrid.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 02.08.2010, 11:04   #3
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Вот часть кода для OpenOffice из моих наработок, надеюсь разберетесь
Цитата:
procedure ShowStrahKart(SotrID: LongInt; Data: TDateTime);
var
Office, Desktop, Document, Columns, Range, ooParams, ooFrame: Variant;
V, Cel, Sheet: Variant;
Year, Month, Day, Row, Col: Integer;
begin
//Запускаем SCalc
Office := CreateOleObject('com.sun.star.ServiceManager');
if VarIsNull(Office) or VarIsEmpty(Office) then RaiseException('Не удалось создать офис');
Desktop:= Office.CreateInstance('com.sun.star.frame.Desktop'); //Создаем рабочий стол офиса
V := Office.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
V.Name := 'Hidden';
V.Value := True;
ooParams := VarArrayCreate([0, 0], varVariant);
ooParams[0] := V;
//Загружаем документ или шаблон, можно и таблицу Excel.
Document:= Desktop.LoadComponentFromURL('private:factory/scalc', 'Путь_к_вашему_документу', 0, ooParams);
ooFrame:= Document.getCurrentController.getFr ame;

//Чтобы скрыть OpenOffice, к примеру если пользователь не хочет лицезреть процесс построения отчета
//ooFrame.GetContainerWindow.SetVisib le(False);
//Чтобы отобразить OpenOffice
//ooFrame.GetContainerWindow.SetVisib le(True);

//Получаем первый лист

Sheet := Document.getSheets.getByIndex(0);
//получаем ячейку в позиции Col, Row
Cel := Sheet.getCellByPosition(Col, Row);
Cel.Value := DMR.STRAHINFO.FN('BASE_M_ZP').AsFloat;
Cel := Sheet.getCellByPosition(Col, 18);
Cel.Value := DMR.STRAHINFO.FN('BASE_ZP').AsFloat;
Cel := Sheet.getCellByPosition(Col, 19);
//Если в ячейку нужно записать строку то
Cel.string := 'sdfs';....
//Если в ячейку нужно записать формулу, то
Cel.Formula := '...';....
Читать данные из ячеек аналогичным образом...

Первый запуск OO происходит довольно долго, все последующие в разы быстрее.
Используйте OpenOffice 3.2.1 - работает несравнимо быстрее чем предыдущие версии.

Последний раз редактировалось Rik; 02.08.2010 в 11:30.
Rik вне форума Ответить с цитированием
Старый 05.08.2010, 09:43   #4
prw07
 
Регистрация: 02.08.2010
Сообщений: 9
По умолчанию

Спасибо за ответы.
Цитата:
Приведите код загрузки данных из Excel в DataSet, на который настроен DBGrid.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var strConn: widestring;
begin
strConn:='Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source=' +Edit1.Text+ ';' + 'Extended Properties=Excel 8.0;';
AdoConnection1.Connected:=False;
AdoConnection1.ConnectionString:=strConn;
AdoConnection1.Open;
AdoQuery1.Close;
AdoQuery1.SQL.Text:='SELECT * FROM [Лист1$]';
AdoQuery1.Open;
end;

Rik Большое спасибо. Очень помогло. Но вот как считать данные из ячейки не "догнал". Немогли бы меня "носом ткнуть"?

Последний раз редактировалось Stilet; 05.08.2010 в 11:06.
prw07 вне форума Ответить с цитированием
Старый 05.08.2010, 11:10   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
носом ткнуть
Тык:
Код:
with AdoQuery1 do
while not eof do begin
 for i:=0 to Fields.Count-1 do
  <Кудато>:=Fields[i].AsString;
end;
т.е. просто проходишся по строкам как по записям, и получаешь данные из колонок аки из полей, при каждом проходе в некую переменную.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.08.2010, 12:35   #6
prw07
 
Регистрация: 02.08.2010
Сообщений: 9
По умолчанию

Спасибо.
Это код для моего примера (через ADOQuery).
"Ткните носом" в примере, который дал Rik
prw07 вне форума Ответить с цитированием
Старый 05.08.2010, 13:29   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Cel := Sheet.getCellByPosition(Col, Row); - даст некую ячейки
твояпеременнаятипастрока:=Cel.strin g;

увидел?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.08.2010, 17:10   #8
prw07
 
Регистрация: 02.08.2010
Сообщений: 9
По умолчанию

ок.
попробую.
prw07 вне форума Ответить с цитированием
Старый 06.08.2010, 10:50   #9
prw07
 
Регистрация: 02.08.2010
Сообщений: 9
По умолчанию

Получилось. Работает. Спасибо.

Только есть очередная проблемка. В примере от Rik есть строка для открытия существующего .xls файла:
Цитата:
//Загружаем документ или шаблон, можно и таблицу Excel.
Document:= Desktop.LoadComponentFromURL('priva te:factory/scalc', 'C:\1.xls', 0, ooParams);
Не работает. Не открывает файл c:\1.xls, а создает новый.
Что не так?
prw07 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как оперативно считать данные из txt файла Rustik2 Общие вопросы C/C++ 8 10.10.2009 12:40
Как записать данные в MySQL бузу а потом считать их SeRhy PHP 1 12.06.2009 22:15
Как считать данные с БД в WebBrowser? tsergey Общие вопросы Delphi 14 13.04.2009 03:56
Как считать данные из Edit? Svop Компоненты Delphi 11 20.11.2006 16:45
как считать данные с Txt файла? Alar Общие вопросы Delphi 0 29.10.2006 20:12