IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Delphi и Excel, Извлечение данных из определенных ячеек
сообщение
Сообщение #1


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Впервые в жизни столкнулся с такой задачкой, посмотрел на подобе вроде нету. Мне нужно выдернуть данные из ексельного файла со сложной структурой данные, которые могут быть не нормированы, т.е. не ограниченны по длине. Запись произвести в стринггрид или дбгрид. Нужны следующие поля А 5 или 10, т.е. те в которых есть надпись НОД 3, все D с названиями, причем коды нужно писать отдельно, все H соответствующие D, и все B с датами месяца и года в разные ячейки. Пробовал фильтрами, но это только отсеивает, а не прописывает. Надо прописать, что бы после можно было портировать данные эти в ораклинную базу. Меня еще останавливает, то что нельзя задать ячейки железно, на тот случай, если таблица пополнится новыми позициями


Прикрепленные файлы
Прикрепленный файл  пример.xls ( 49 килобайт ) Кол-во скачиваний: 339


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
А можно пример как вести проверку? Да и программку хотелось бы все глянуть, интересно.
Ну, глянь:
procedure LockGrid(Grid: TStringGrid);
var i: Integer;
begin
for i := 0 to Pred(Grid.ColCount) do
Grid.Cols[i].BeginUpdate;
end;

procedure UnLockGrid(Grid: TStringGrid);
var i: Integer;
begin
for i := 0 to Pred(Grid.ColCount) do
Grid.Cols[i].EndUpdate;
end;

function XL_GetInfo(AGrid: TStringGrid; AXLSFile: string): boolean;
const
xlCellTypeLastCell = $0000000B;
var
XLApp, Sheet, Range: OleVariant;
Row, Rows: Integer;
curr, SpacePos: Integer;
s: string;
begin
XLApp := CreateOleObject('Excel.Application');
XLApp.Visible := False;
try
XLApp.Workbooks.Open(AXLSFile);
Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];

Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
Rows := XLApp.ActiveCell.Row;
AGrid.RowCount := Rows + 1;
AGrid.FixedRows := 1;

AGrid.ColCount := 6;
AGrid.FixedCols := 1;

AGrid.Cells[2, 0] := 'B';
AGrid.Cells[3, 0] := 'D название';
AGrid.Cells[4, 0] := 'D код';
AGrid.Cells[5, 0] := 'H';

LockGrid(AGrid);

curr := Pred(AGrid.FixedRows);
for Row := 1 to Rows do
begin
Range := Sheet.Range['D' + IntToStr(Row), EmptyParam];
if not VarIsEmpty(Range) then
begin
s := Range.Value;
if (s <> '') and (Ord(s[1]) <> 160) then
begin
s := Trim(s);
//
Inc(curr);
SpacePos := LastDelimiter(Char(160), s);
AGrid.Cells[0, curr] := IntToStr(Row);
AGrid.Cells[2, curr] := Sheet.Range['B' + IntToStr(Row), EmptyParam].Value;
AGrid.Cells[3, curr] := Copy(s, 1, SpacePos - 1);
AGrid.Cells[4, curr] := Copy(s, SpacePos + 1, Length(s));
AGrid.Cells[5, curr] := Sheet.Range['H' + IntToStr(Row), EmptyParam].Value;
end;
end;
end;

UnLockGrid(AGrid);
AGrid.RowCount := curr + 1;
Result := True;
finally
if not VarIsEmpty(XLApp) then
begin
// XLApp.DisplayAlerts := False;
XLApp.Quit;
XLAPP := Unassigned;
Sheet := Unassigned;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if XL_GetInfo(StringGrid1, 'F:\Programs\Delphi\XL\example.xls') then
begin
ShowMessage('Таблица была загружена!');
end;
end;
Тут можно еще поубирать лишние действия, вроде многократных преобразований IntToStr одного и того же числа, можно забросить обращения к Cells под один With, будет выглядеть гораздо красивее. Но код и так работает достаточно быстро за счет того, что Грид залочен, и постоянного обновления, съедающего основное время, не происходит...
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 16.06.2024 18:19
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name