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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi и Excel, Извлечение данных из определенных ячеек 
:(
    Опции темы
Pellegrino
Дата 20.12.2009, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 13.3.2007
Где: Russian Federatio n

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



Добрый День! 
Файл эксель я не могу сам лично править, его генерирует, как отчет информационная система. В грид я решил выводить для наглядности пользователю, а так мне нужно забрать данные из столбцов и прописать в базу ораклиную. Причем надо прописывать билеты и грозобагаж в отдельные базы, остальные выписки не нужны. Строки нужны только с Датой, названием и кодом станции, НОДА ( ну там 3 или 7) и дебет. Остальное нафиг не нужно, все там итого и так далее. Трабл в том, что данные не подряд идут, а с разрывами и тем более разнородные, выходит проверку делать на содержание определенного участка. Т.е. находим строки «Билеты» и отправляем в БД содержимое из блока билеты, но только дату, код и название станции, и дебет с НОД. Так же и с грузобагажом. Файлик екселя приложил. Но и в гриде тож  косяк, не знаю как прописать фильтр по данным...
Код

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;





Это сообщение отредактировал(а) Pellegrino - 20.12.2009, 22:25

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  _______10.rar 12,27 Kb
PM MAIL WWW   Вверх
Pellegrino
Дата 21.12.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 13.3.2007
Где: Russian Federatio n

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



Короче никто не знает...
PM MAIL WWW   Вверх
volvo877
Дата 21.12.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



Цитата(Pellegrino @  21.12.2009,  20:28 Найти цитируемый пост)
Короче никто не знает... 
Это ты сам решил? А не забыл, так, на всякий случай, копирайты проставить? За свое выдаешь? Хоть бы имя файла изменил... Принципиально помощь не буду оказывать... Ignored...
PM MAIL   Вверх
Akella
Дата 22.12.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Pellegrino, слишком обширный вопрос. Опиши более конкретно, что не получается.
PM MAIL   Вверх
Pellegrino
Дата 23.12.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 13.3.2007
Где: Russian Federatio n

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



Ща, упростил табличку макросом. Теперь она выглядит так... Надо просуммировать ячейки столбце дебед, только еще от минуса избавиться. Вывожу табличку, надо еще избавиться от названий столбцов в таблице.  и После как бы мне передать эти данные из таблички на запись в БД под орклом. Использовал компонент из АДО, но вот как запрос будет выглядеть? 
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, ComCtrls, Grids,ComObj, ADODB, DB, DBClient;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    StringGrid3: TStringGrid;
    StringGrid4: TStringGrid;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ClientDataSet1: TClientDataSet;
    ADOCommand1: TADOCommand;
    procedure N5Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
   
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

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] := 'Станция';                    //nтаблица в идеале
    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]) <> 160) 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.Button1Click(Sender: TObject);
begin
if XL_GetInfo(StringGrid3, 'D:\КОАСУФР\ФО7ЛОКТ.xls') then
  begin
    ShowMessage('Таблица "СводРазныхСборовПасс');
  end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ADOCommand1.Execute;
end;
procedure TForm1.N5Click(Sender: TObject);
begin
Close;
end;
end.



2 volvo877, ну ты же мне дал код в использование, вот я и использую, и ничего себе я не присваивал. Хочу выразить благодарность за предоставленный код volvo877. )))

Это сообщение отредактировал(а) Pellegrino - 23.12.2009, 19:35

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  __7____.rar 7,00 Kb
PM MAIL WWW   Вверх
Pellegrino
Дата 12.1.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 13.3.2007
Где: Russian Federatio n

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



Уважаемые, а не подскажите как найти в экселе ячейку с нужным содержим и узнать её адрес? Мне нужно вытащить её значение для дальнейшей работы. 
Код

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.

PM MAIL WWW   Вверх
Akella
Дата 14.1.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Pellegrino, ты наверное не знал, что 
1. Есть специальный раздел ->>>> http://forum.vingrad.ru/forum/delphi-activ...-corba-ole.html
2. Одна тема = один вопрос
??????

Добавлено через 3 минуты и 22 секунды
Цитата(Pellegrino @  12.1.2010,  20:59 Найти цитируемый пост)
Уважаемые, а не подскажите как найти в экселе ячейку с нужным содержим и узнать её адрес? 

И нафиг нам вообще ВЕСЬ твой код О_о
Дай код, который не работает лучше.
И вообще, в том разделе и в ДРКБ есть функция поиска текста в ячейке, которая возвращает координаты ячейки.
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.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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