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

> ВНИМАНИЕ!

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

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

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


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

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

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


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


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


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


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

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

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


т.е. мне нужно найти и сверить сумму значений в столбце (это я выполнил) со значение в ячейки А65. Но не хотелось бы железно присваивать ячейку на случай её расширения.
unit Unit1;
var
Form1: TForm1;
// b:real;
implementation

{$R *.dfm}
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 := 5;
AGrid.FixedCols := 0;
AGrid.Cells[1, 0] := 'Станция'; //таблица в идеале
AGrid.Cells[0, 0] := 'Код станции';
AGrid.Cells[2, 0] := 'Нод';
AGrid.Cells[3, 0] := 'Дата';
AGrid.Cells[4, 0] := 'Дебед';
//AGrid.Cells[5, 0] := 'Дебед';

LockGrid(AGrid);

curr := Pred(AGrid.FixedRows);
for Row := 1 to Rows do
begin
Range := Sheet.Range['B' + IntToStr(Row), EmptyParam];
if not VarIsEmpty(Range) then
begin
s := Range.Value;
if (s <> '') and (Ord(s[1]) <> 250) then
begin
s := Trim(s);
//
Inc(curr);
SpacePos := LastDelimiter(Char(160), s);
//AGrid.Cells[0, curr] := IntToStr(Row);
//AGrid.Cells[1, curr] := Sheet.Range['A' + IntToStr(Row), EmptyParam].Value;
//AGrid.Cells[2, curr] := Sheet.Range['B' + IntToStr(Row), EmptyParam].Value;
AGrid.Cells[0, curr] := Copy(s, 1, 6); // Вот это как то работает
AGrid.Cells[1, curr] := Copy(s, 7, Length(s));
AGrid.Cells[2, curr] := Sheet.Range['C' + IntToStr(Row), EmptyParam].Value;
AGrid.Cells[3, curr] := Sheet.Range['D' + IntToStr(Row), EmptyParam].Value;
AGrid.Cells[4, curr] := Sheet.Range['E' + 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.Button2Click(Sender: TObject);
var
i,j,coma:integer;
deb:string;
st:string;
begin
// SocketConnection1.Connected:=true;
// SocketConnection1.AppServer.OpenBase('ora8','fs_master','fs_master');
for i := 2 to StringGrid1.RowCount - 1 do
begin
deb:=StringGrid1.Cells[4,i]; //избавляемся от минусов-тире
if (deb[1] = '-') then
deb:=copy(deb,2,length(deb)-1);

coma := pos(',',deb); // избавляемся от точки в ячейки
if coma<>0 then
deb[coma]:='.';
//end;
SocketConnection1.Connected:=true;
SocketConnection1.AppServer.openbase('ORA8','fs_master','fs'); //коннект к БД

// st:='begin delete from test where NOD=A03'+' Commit;' +' end;';;

st:='begin insert into TEST(station_code,station_name,debet,nod,data) values (' +
StringGrid1.Cells[0,i]+','+#39+StringGrid1.Cells[1,i]+#39+
',TO_NUMBER('+#39+deb+#39+'),'+#39+StringGrid1.Cells[2,i]+#39+
',to_date('+#39+StringGrid1.Cells[3,i]+#39+','+#39+'dd.MM.yyyy'+#39+'));'
+'Commit;' +'end;';

ClientDataSet1.DataRequest(st); //передаем запросик

//ClientDataSet1.Execute;

//ShowMessage('Загрузка выполнена');
end;
end;


///////////////////кнопка Выхода
procedure TForm1.Button3Click(Sender: TObject);
begin
Close; //тупо закрытие
end;

//////////////////////// не придумал название кнопки
procedure TForm1.Button4Click(Sender: TObject);
//var MyRange, V: OleVariant;
begin
// MyRange := ExcelWorksheetl.Range[‘В2', EmptyParam];
// просмотр содержимого ячейки В2
//V := MyRange.Value;
//ShowMessage(V);
// занесение в ячейку значения из окна Editl
//MyRange.Value := Editl.Text;

end;


///////////////////////////////////кнопка Выгрузки
procedure TForm1.Button1Click(Sender: TObject);
var a,b:real;
i:integer;

begin
if XL_GetInfo(StringGrid1, 'D:\КОАСУФР\ФО7ЛОКТ.xls') then //указание пути к файлику
begin
a:=0; //зануляем
b:=0; //зануляем
for i := 2 to StringGrid1.RowCount - 1 do // шагаем, дружно вниз
a:=a+StrToFloat(StringGrid1.Cells[4,i]); // продолжаем шагать по ячейкам уже
a:=a*(-1); //снова минус
Form1.Label4.caption:= FloatToStr(a); //выводим на форму
if a=b then //сравниваем
ShowMessage('Закачка данных завершена корректно');
if a<>b then
ShowMessage('Сумма итого расходиться с суммами по станциям, повторите закачку');
end;
// begin
// ShowMessage('Таблица "СводРазныхСборовПасс');
//end;
end;

end.


Сообщение отредактировано: volvo -


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

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


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

 





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