Модераторы: MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> export from excel - delphi, export from excel to delphi 
:(
    Опции темы
Sed0Y
  Дата 25.2.2010, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 16.1.2009

Репутация: нет
Всего: нет



Добрый день.

У меня есть документ Ексель, в нем какие-то значения к примеру


Код

    А             В
1 ------пусто-------
2 Тарелки     20
3 кирьпичь    2000
4 цемент       5
5 ------пусто-------
6 ------пусто-------


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

Код

.....
TYPE
     XLApp: TExcelApplication;
.....
var
  WorkBk: _WorkBook;
  WorkSheet: _WorkSheet;
  K, R, X, Y: Integer;
  sec, min, hour: Integer;
  IIndex: OleVariant;
  RangeMatrix: Variant;
  NomFich: WideString;
begin
  NomFich := 'C:\123.xls';
  IIndex := 1;
  XLApp.Connect; 
  XLApp.WorkBooks.Open(NomFich, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
  EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0);
  WorkBk := XLApp.WorkBooks.Item[IIndex];
  WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
  WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
  X := XLApp.ActiveCell.Row;
  Y := XLApp.ActiveCell.Column;
  StringGrid.ColCount := Y;
  RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X,Y]].Value2;
  XLApp.Quit;
  K := 1;
  repeat
    for R := 1 to Y do
      StringGrid.Cells[(R - 1),(K - 1)] := RangeMatrix[K,R];
    Inc(K,1);
    StringGrid.RowCount := K + 1;
  until
    K > X;
  RangeMatrix := Unassigned;




xlapp.connect; // если в документе сделали изменение но не сохранили то на этом месте происходит ошибка - то как считать данные без сохранение, то есть если изменили данные на листе и не сохранили то все равно мы сумели считать эти изменения не сохраняя документ?

xlapp.quit; // в таком случае, если документ открыт, то он закрывается а если это убрать и документ будет закрыт, то после закрытия программы будет в процессах висеть процесс екселя

Короче говоря как считать с документа открытого другим пользователем на редактирование данные которые небыли сохранены (в документе)?
PM MAIL ICQ   Вверх
Данкинг
Дата 26.2.2010, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



Файл расшаренный и лежит на серваке, что ли? Тогда каким образом "xlapp.quit;" может закрывать документ, открытый на другом компе? smile  

Цитата(Sed0Y @  25.2.2010,  23:49 Найти цитируемый пост)
Короче говоря как считать с документа открытого другим пользователем на редактирование данные которые небыли сохранены (в документе)? 

Думаю, что никак. Если только каким-то образом сохранять копию файла и её уже считывать.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Sed0Y
  Дата 26.2.2010, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 16.1.2009

Репутация: нет
Всего: нет



значит не стал париться и заморачиваться с XLApp.WorkBooks переделал на получение данных с ексель листа через АДО и выгружаю в Грид

только вот столкнулся с проблемкой не могу решить
первая строка в екселе экспортируется в рид как название Титла, что сделать что бы содержимое Листа было в гриде а не в залазило и в шапку (см. рисунок)? 

user posted image

сделал экспорт так:
Код

procedure TFMain.ConnectToExcel;
var
  strConn: widestring;
begin
  strConn := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
          'Data Source=' + FilePatch + ';' +
          'Extended Properties=Excel 8.0;';
  AdoConnection1.Connected := False;
  AdoConnection1.ConnectionString := strConn;
  try
    AdoConnection1.Open;
  except
    ShowMessage('не могу соединиться с ексель книгой: ' + FilePatch + ' !');
  raise;
  end
end;

procedure TFMain.FetchData;
var
  i: Integer;
begin
  ConnectToExcel;
  AdoQuery1.Close;
  AdoQuery1.SQL.Text := Edit2.Text ; // SELECT * FROM [Лист1$]
  try
    AdoQuery1.Open;
  except
    ShowMessage( 'Не могу выполнить СКЛ запрос ' + Edit2.Text +'!');
  raise;
  end;

  for i := 0 to DBGridEh1.Columns.Count -1 do
    DBGridEh1.Columns.Items[i].Width := 100  
end;


procedure TFMain.Button1Click(Sender: TObject);
begin
  FetchData
end;





Это сообщение отредактировал(а) Sed0Y - 26.2.2010, 03:10

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Untitled_2.jpg 39,86 Kb
PM MAIL ICQ   Вверх
dimaximo
Дата 25.4.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.4.2010

Репутация: нет
Всего: нет



Здравствуйте! Может кто сталкивался с этим, помогите, пожалуйста, решить проблемку. Использовал ниже представленный код для экспорта данных из Excel. Проблема в том,что тип данных "время" и в stringGridе,после перемещения отображаются в вещественном типе. Как можно из вещест.типа сделать тип время? smile   
Код

.....
TYPE
     XLApp: TExcelApplication;
.....
var
  WorkBk: _WorkBook;
  WorkSheet: _WorkSheet;
  K, R, X, Y: Integer;
  sec, min, hour: Integer;
  IIndex: OleVariant;
  RangeMatrix: Variant;
  NomFich: WideString;
begin
  NomFich := 'C:\123.xls';
  IIndex := 1;
  XLApp.Connect; 
  XLApp.WorkBooks.Open(NomFich, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
  EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0);
  WorkBk := XLApp.WorkBooks.Item[IIndex];
  WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
  WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
  X := XLApp.ActiveCell.Row;
  Y := XLApp.ActiveCell.Column;
  StringGrid.ColCount := Y;
  RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X,Y]].Value2;
  XLApp.Quit;
  K := 1;
  repeat
    for R := 1 to Y do
      StringGrid.Cells[(R - 1),(K - 1)] := RangeMatrix[K,R];
    Inc(K,1);
    StringGrid.RowCount := K + 1;
  until
    K > X;
  RangeMatrix := Unassigned;


PM MAIL   Вверх
Albinos_x
Дата 25.4.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



проверяй форматирование ячейки в excel, если формат ячейки типа даты/время, значение перез занесением в форму приводи к нужному типу...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
dimaximo
Дата 25.4.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.4.2010

Репутация: нет
Всего: нет



Как можно поверить? Я в этом деле новичок, буду бесконечно благодарен за листинг smile ...
PM MAIL   Вверх
Albinos_x
Дата 26.4.2010, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



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

if (XLApp.Range['A1',EmptyParam].NumberFormat='dd/mm/yy h:mm;@') or
   (XLApp.Range['A1',EmptyParam].NumberFormat='h:mm;@') then
   ......

как это прикрутить или использовать применительно к твоему коду думаю тебе не составит труда. 
удачи


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
dimaximo
Дата 26.4.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.4.2010

Репутация: нет
Всего: нет



спс болшое smile Попробую сделать

PM MAIL   Вверх
dimaximo
Дата 27.4.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.4.2010

Репутация: нет
Всего: нет



Albinos_x, 
Подскажите, пожалуйста, для чего нужен символ '@' и как можно сохранить данные о времени в stringGrid в том виде в котором они находятся в Excel...
PM MAIL   Вверх
Albinos_x
Дата 27.4.2010, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(dimaximo @  27.4.2010,  15:23 Найти цитируемый пост)
Подскажите, пожалуйста, для чего нужен символ '@'

это лучше спросить у разработчиков excel - почему они выбрали именно этот символ для меток форматирования ячеек)

Цитата(dimaximo @  27.4.2010,  15:23 Найти цитируемый пост)
как можно сохранить данные о времени в stringGrid в том виде в котором они находятся в Excel.

в экселе много представлений даты/времени... какой именно интересует тебя?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
dimaximo
Дата 28.4.2010, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.4.2010

Репутация: нет
Всего: нет



Цитата

это лучше спросить у разработчиков excel - почему они выбрали именно этот символ для меток форматирования ячеек)

понятно smile ...
меня интересует форма представления времени "h:mm". Данные в формате "h:mm" считываются из Excel и заносятся в StringGrid уже в вещественном виде от 0...0,99. 
Код

RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X,Y]].Value2;
  K := 1;
  repeat
    for R := 1 to Y do
      StringGrid.Cells[(R - 1),(K - 1)] := RangeMatrix[K,R];
    Inc(K,1);
    StringGrid.RowCount := K + 1;
  until
    K > X;

То условие 
Код

if (XLApp.Range['A1',EmptyParam].NumberFormat='dd/mm/yy h:mm;@') or
   (XLApp.Range['A1',EmptyParam].NumberFormat='h:mm;@') then
   ......

что вы написали,я как понимаю,можно использовать для проверки ячейки в Excel на формат представления для её последующего форматирования. Может быть есть такое решение,которое преобразует "время" в вещественной форме обратно в "h:mm"
PM MAIL   Вверх
Albinos_x
Дата 28.4.2010, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(dimaximo @  28.4.2010,  14:16 Найти цитируемый пост)
 Данные в формате "h:mm" считываются из Excel и заносятся в StringGrid уже в вещественном виде от 0...0,99. 

для преобразования попробуй использовать команду:
Код

var t:String;
...
DateTimeToString( S, 'hh:mm', RangeMatrix[K,R]);


Добавлено через 2 минуты и 38 секунд
Цитата(dimaximo @  28.4.2010,  14:16 Найти цитируемый пост)
 для проверки ячейки в Excel на формат представления для её последующего форматирования

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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
dimaximo
Дата 29.4.2010, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.4.2010

Репутация: нет
Всего: нет



Спасибо большое за некоторые просветы...вобщем, получилось только так:
Код

...
repeat
   for R:=1 to Y do
    begin
     DateTimeToString(s,'t',FloatToDateTime(StrToFloat(RangeMatrix[K+1,R])));
     SG1.Cells[(R),(K)]:=s;
    end; 
    SG1.RowCount:=K+1;
    inc(K,1);
 until K>X;
...
 
PM MAIL   Вверх
Albinos_x
Дата 29.4.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(dimaximo @  29.4.2010,  09:42 Найти цитируемый пост)
FloatToDateTime(StrToFloat(RangeMatrix[K+1,R])));

транная конструкция, а что так не прокатило:
Код

TDateTime(RangeMatrix[K+1,R])




--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
dimaximo
Дата 29.4.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.4.2010

Репутация: нет
Всего: нет



попробывал...выдает ошибку Statement expected, but expression of type 'TDateTime' found

Добавлено через 31 секунду
параметр что ли какой-то упущен
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.