Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в Excel выделить строку(столбец) 
:(
    Опции темы
alexe
Дата 18.5.2004, 08:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте!
Использую подсоединение к Excel:

procedure TForm1.Button1Click(Sender: TObject);
var
ibook:Excel97.ExcelWorkbook;
isheet:Excel97.ExcelWorkSheet;
begin
xl.Connect;
xl.Visible[0]:=True;
xl.ScreenUpdating[0]:=True;
ibook:=xl.Workbooks.Add(null,0);
isheet:=ibook.Worksheets.Item['Лист1'] as Excel97.ExcelWorkSheet;
end;

Пробовал использовать isheet.Columns.Column[1] .... , но выдается ошибка. Пытался использовать данные макроса VB из Exel, но так и не смог адаптировать его для Delphi. Максимум чего добился - выделил все столбцы (isheet.Columns.Select;).
Заранее благодарен!
  Вверх
Cashey
Дата 18.5.2004, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

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



Выделение строки (диапазона строк)
Код
XLApp := <object>.application
............................................................
XLApp.rows("02:42").select


Выделение столбца
Код
XLApp.columns(2).select


alexe
Существует, специально созданный для таких вопрос подфорум, зачем надо было помещать этот топик здесь?

Это сообщение отредактировал(а) Cashey - 18.5.2004, 10:41


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Guest
Дата 18.5.2004, 12:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











To Cashey
Подфорум я просмотрел, но основной упор там на программировании в VB, а мне нужно на Delphi, поэтому и посчитал, что вопрос нужно поместить в этот раздел.
Что касается Вашего ответа, то на попытку использовать
xl.columns(2).select (xl: TExcelApplication;)
при компиляции выдается ошибка:
[Error] Unit1.pas(38): Missing operator or semicolon
Я так думаю, что здесь неправильный формат свойства Columns, а вот где узнать правильный - я не знаю (метод перебора возможных написаний не помог).

  Вверх
Akella
Дата 18.5.2004, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Ex1 - компоненте сос траницы Servers
Если, что не понятно, обращайся.
Код
procedure TfmImpExcel.ImportExcel(filename:string);
Var
r:Byte;
iProd,iPrice,iNameRow, iInd,iBook,RowsToCopy,iLastRow,x,i,e:Integer;
sFileName, sProdCol, sNameCol,sPriceCol:String;
bNaydeno, bNaydeno1, bNaydeno2, bNaydeno3:Bool;
iStop:Byte;//если кол-во пустых строк подряд больше 4, то останавливаемся
WorkBk : _WorkBook; //  определяем WorkBook
WorkSheet : _WorkSheet; //  определяем WorkSheet
Range:OleVariant;
sss:WideString;
tOneRecordTime,tMemTime,tBeg,tEnd:TTime;//время
iRowCount:Integer;//для времени
bGoTime:Boolean;//для вычисления времени импорта одной записи
k,l,m:Integer;
begin
{ if (cbAptName.Text='') or (Length(cbAptName.Text)<3) then begin
  beep;
  ShowMessage('Не выбран поставщик');
  cbAptName.SetFocus;
  exit;
end;
}
try
  fmMain.vAbort:=True;//обнуляем переменную для прерывания
 //отменяем полностью все прайсы
 if filename = 'cancel' then fmMain.vAbort:=False;
 if fmMain.vAbort=False then begin//прерываем операцию
   fmMain.vAbort:=True;//обнуляем переменную для прерывания
   fmMain.actButtons.Execute;
   lbWait.Visible:=False;
   lbFileName.Visible:=lbWait.Visible;
   sb3.Panels[0].Text:='Прервано пользователем...';
   memoErrors.Lines.Add(TimeToStr(Time)+' Прервано пользователем');
   memoErrors.Lines.Add(TimeToStr(Time)+' _____________СТОП__________________');
   try
     sb3.Panels[0].Text:='Закрытие Excel...';
     Ex1.Workbooks.Close(0{LOCALE_USER_DEFAULT});
     Ex1.Disconnect;
     Ex1.Quit;
   except
   end;//try-except
    screen.Cursor:=crDefault;
    cbAptName.ItemIndex:=-1;
    application.ProcessMessages;
    Exit;
 end;//if fmMain.vAbort=False then begin

  memoErrors.Lines.Add(TimeToStr(Time)+' Этап 1: "'+fmMain.tAptAName.AsString+'"');
  bNaydeno:=False;
  bNaydeno1:=False;
  bNaydeno2:=False;
  bNaydeno3:=False;
  bGoTime:=True;
  RowsToCopy:=0;
  iLastRow:=0;
  tbImportExcel.Enabled:=False;
  tbToPrep.Enabled:=False;
  lbWait.Visible:=True;
  lbFileName.Visible:=lbWait.Visible;
  //очищаем StringGrid sg1
  sg1.RowCount:=1;
  sg1.Rows[0].Clear;
  sb3.Panels[0].Text:='Открытие Excel...';
  application.ProcessMessages;
  try//попытка открытия файла
    Ex1.Connect;
    Ex1.Workbooks.Open(FileName,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
      EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,
      EmptyParam,EmptyParam,EmptyParam, 0{LOCALE_USER_DEFAULT});
    lbFileName.Caption:='Импорт из '+FileName;
  except;//в случае ошибки все отменяем и обнуляем
    screen.Cursor:=crDefault;
    if cbSound.Checked then
      windows.Beep(2000,1000);
    fmMain.vAbort:=True;//обнуляем переменную для прерывания
    bNaydeno:=False;
    bNaydeno1:=False;
    bNaydeno2:=False;
    RowsToCopy:=0;
    fmMain.actButtons.Execute;//включаем или откл. кнопки
    lbWait.Visible:=True;
    lbFileName.Visible:=lbWait.Visible;
    //очищаем StringGrid sg1
    sg1.RowCount:=1;
    sg1.Rows[0].Clear;
    ShowMessage('Не возможно открыть файл "'+FileName+'"');
    cbAptName.ItemIndex:=-1;
    pb1.Visible:=False;
    exit;
  end;//try-except Ex1.Connect
  screen.Cursor:=crHourGlass;
  pb1.Position:=0;
  pb1.Visible:=True;
  sb3.Panels[0].Text:='Поиск рабочей книги и листа...';
  application.ProcessMessages;
  //ищем нужную книгу
  sFileName:=ExtractFileName(FileName);
  For iInd:=1 to ex1.Workbooks.Count do begin
    if ex1.Workbooks.Item[iInd].Name=sFileName then break;
  end;//For iInd:=1 to ex1.Workbooks.Count do begin
  // Выбираем WorkBook
  WorkBk := ex1.WorkBooks.Item[iInd];
  // Определяем WorkSheet
  if WorkBk.Worksheets.Count>1 then begin//если кол-во листов больше 1
    For x:=0 to memoSheets.Lines.Count-1 do begin
     For iBook:=1 to WorkBk.Worksheets.Count do begin
       WorkSheet:=WorkBk.WorkSheets.Get_Item(iBook) as _WorkSheet;
       if WorkSheet.Name = memoSheets.Lines[x] then begin
         bNaydeno3:=True;//нашли лист
         WorkSheet.Activate(0{LOCALE_USER_DEFAULT});//активираем лист
       end;//if WorkSheet.Name = memoSheets.Lines[x] then begin
       if bNaydeno3 then break;
     end;//For iBook:=1 to WorkBk.Worksheets.Count do begin
     if bNaydeno3 then break;
    end;//For x:=0 to memoSheets.Lines.Count-1 do begin
    //если не находим лист из списка ключевых слов, выдаем сообщение
    if bNaydeno3=false then begin
      beep;
      if cbDontShowErrors.Checked = false then
        ShowMessage('<Не найден лист с данными>'+#13+#13+
        '1.Откройте прайс, посмотрите название листа с препаратами, добавьте в'+#13+
        'ключевые слова название листа с препаратами и повторите импорт'+#13+
        '___________________________________________________________________________________'+#13+
        '2.Откройте прайс, выберите лист с препаратами, затем выберите меню "Файл->Сохранить"');
        memoErrors.Lines.Add(TimeToStr(Time)+' Не найден лист с препаратами.');
        memoErrors.Lines.Add(TimeToStr(Time)+' Импорт завершен неудачно');
        memoErrors.Lines.Add('___________________________________________');
      cbAptName.ItemIndex:=-1;
      exit;
    end;//if bNaydeno3=false then begin
  end else//if
    WorkSheet:=WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;;

  sb3.Panels[0].Text:='Поиск последней строки...';
  application.ProcessMessages;
  if Find('99999',iNameRow,sNameCol, WorkSheet) then begin
   iLastRow:=iNameRow-1;//в столбце с наименованием ищем "99999"-конец импорта
  end else begin     //и запоминаем в iRows
   try//если не находим 99999 то ищем последнюю заполненную ячейку
     WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
     // Получаем значение последней строки
     iLastRow:=(ex1.ActiveCell.Row)-1;
    except
      try
        WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Select;
        // Получаем значение последней строки
        iLastRow:=(ex1.ActiveCell.Row);
      except
        iLastRow:=0;
      end;//try-except
    end;//try-except
  end;
  if iLastRow=0 then begin
     memoErrors.Lines.Add(TimeToStr(Time)+' Не найден признак окончания, импортируем 6000 строк');
     iLastRow:=6000;
  end;//if iRows=0 then begin
  //ищем наименование препаратов
  For r:=0 to memoNames.Lines.Count-1 do begin
    bNaydeno:=False;
    if Find(memoNames.Lines[r],iNameRow,sNameCol,WorkSheet) then begin
     bNaydeno:=True;
     //количество строк для копирования
     RowsToCopy:=iLastRow-iNameRow;
     break;
    end;//if Find(memoNames.Lines[r],iNameRow,sNameCol) then begin
  end;//For r:=0 to memoNames.Lines.Count-1 do begin
  //показываем кол-во строк для копирования
  memoErrors.Lines.Add(TimeToStr(Time)+' Записей для импорта '+IntToStr(RowsToCopy));
  if bNaydeno=false then begin
    beep;
    if cbDontShowErrors.Checked = false then
      ShowMessage('<Не найден столбец с наименованием препаратов>'+#13+#13+
      '1.Откройте прайс, посмотрите название столбца с наименованиями препаратов, добавьте в'+#13+
      'ключевые слова название столбца с наименованием и повторите импорт'+#13+
      '___________________________________________________________________________________'+#13+
      '2.Откройте прайс, выберите лист с препаратами, затем выберите меню "Файл->Сохранить"');
      memoErrors.Lines.Add(TimeToStr(Time)+' Не найден столбец с наименованием препаратов.');
      memoErrors.Lines.Add(TimeToStr(Time)+' Импорт завершен неудачно');
      memoErrors.Lines.Add('___________________________________________');
    cbAptName.ItemIndex:=-1;
    exit;
  end;//if bNaydeno=false then begin
  //ищем цену препаратов

  For r:=0 to memoPrices.lines.Count-1 do begin
    bNaydeno1:=False;
    if Find(memoPrices.lines[r],iPrice,sPriceCol,WorkSheet) then begin
     bNaydeno1:=True;
     break;
    end;//if Find(memoPrices.lines[r],iPriceRow,sPriceCol) then begin
  end;//For r:=0 to memoPrices.lines.Count-1 do begin
  if bNaydeno1=false then begin
    beep;
    if cbDontShowErrors.Checked = false then
      ShowMessage('<Не найден столбец с ценами препаратов>'+#13+#13+
      '1.Откройте прайс, посмотрите название столбца с ценами препаратов, добавьте в'+#13+
      'ключевые слова название этого столбца и повторите импорт.'+#13+
      '___________________________________________________________________________________'+#13+
      '2.Откройте прайс, выберите лист с препаратами, затем выберите меню "Файл->Сохранить"');
      memoErrors.Lines.Add(TimeToStr(Time)+' Не найден столбец с ценами препаратов.');
      memoErrors.Lines.Add(TimeToStr(Time)+' Импорт завершен неудачно');
      memoErrors.Lines.Add('___________________________________________');
    cbAptName.ItemIndex:=-1;
    exit;
  end;//if bNaydeno1=false then begin
  //ищем производителя препаратов
  For r:=0 to memoProd.Lines.Count-1 do begin
    bNaydeno2:=False;
    if Find(memoProd.Lines[r],iProd,sProdCol,WorkSheet) then begin
     bNaydeno2:=True;
     break;
    end;//if Find(memoProd.Lines[r],iProdRow,sProdCol) then begin
  end;//For r:=0 to memoProd.Lines.Count-1 do begin
  if bNaydeno2=False then begin
    beep;
    if cbDontShowErrors.Checked = false then
      ShowMessage('<Не найден столбец с производителем препаратов>'+#13+#13+
      '1.Откройте прайс, посмотрите название столбца с производителями препаратов,'+#13+
      'добавьте в ключевые слова название этого столбца и повторите импорт'+#13+
      '-----------------------------------------------------------------------------'+#13+
      '2.Откройте прайс, выберите лист с препаратами, затем выберите меню "Файл->Сохранить"');
      memoErrors.Lines.Add(TimeToStr(Time)+' Не найден столбец с производителем препаратов.');
      memoErrors.Lines.Add(TimeToStr(Time)+' Импорт завершен неудачно');
      memoErrors.Lines.Add('___________________________________________');
    cbAptName.ItemIndex:=-1;
    exit;
  end;//if bNaydeno2=False then begin
   //если все найдено выполняем импорт
   pb1.Max:=RowsToCopy;
   sb3.Panels[0].Text:='Импорт начат...';
   application.ProcessMessages;
   iStop:=0;
//начинаем импорт со строки iNameRow
   iRowCount:=RowsToCopy;//для определения времени
   k:=GetTickCount;
   if bGoTime then tBeg:=GetTickCount;
   For e:=0 to RowsToCopy do begin
   Dec(iRowCount);
     if (WorkSheet.Cells.Item[iNameRow,sNameCol].Value='') or
      (WorkSheet.Cells.Item[iNameRow,sNameCol].Value=' ') then
      Inc(iStop)//если пустая строка, то увеличиваем на 1
     else
      iStop:=0;//если следующая не пустая то обнуляем и продолжаем импорт
     //если начались пустые строки то прекращаем импорт
     if iStop>4 then break;
     //наименование препарата
     sg1.Cells[1,e]:=WorkSheet.Cells.Item[iNameRow,sNameCol].Value;
//      sb3.Panels[0].Text:='Импорт ячейки ['+sNameCol+IntToStr(iNameRow)+'] - препарат';
//      application.ProcessMessages;
     //цена
     sg1.Cells[2,e]:=WorkSheet.Cells.Item[iNameRow,sPriceCol].Value;
     sg1.Cells[2,e]:=DelProb(sg1.Cells[2,e]);//удаляем пробелы
//      sb3.Panels[0].Text:='Импорт ячейки ['+sPriceCol+IntToStr(iNameRow)+'] - цена';
//      application.ProcessMessages;
     //производитель
     sg1.Cells[3,e]:=WorkSheet.Cells.Item[iNameRow,sProdCol].Value;
//      sb3.Panels[0].Text:='Импорт ячейки ['+sProdCol+IntToStr(iNameRow)+'] - производитель';
//      application.ProcessMessages;
     Inc(iNameRow);
     if sg1.RowCount=e then sg1.RowCount:=sg1.RowCount+1;
     pb1.Position:=e;
     //прерываем по желанию пользователя
     if fmMain.vAbort=False then begin//прерываем операцию
       fmMain.vAbort:=True;//обнуляем переменную для прерывания
       fmMain.actButtons.Execute;
       lbWait.Visible:=False;
       lbFileName.Visible:=lbWait.Visible;
       sb3.Panels[0].Text:='Прервано пользователем...';
       memoErrors.Lines.Add(TimeToStr(Time)+' Прервано пользователем');
       memoErrors.Lines.Add('___________________________________________');
       try
        Ex1.Workbooks.Close(0{LOCALE_USER_DEFAULT});
        Ex1.Disconnect;
        Ex1.Quit;
       except
       end;//try-except
//        screen.Cursor:=crDefault;
       application.ProcessMessages;
       cbAptName.ItemIndex:=-1;
       Exit;
      end;//if fmMain.vAbort=False then begin

      if bGoTime then tEnd:=GetTickCount;
      if bGoTime then l:=GetTickCount;;
      if bGoTime then begin//первый раз вычисляем время импорта одной записи
        tOneRecordTime:=(tEnd-tBeg);
        m:=(l-k);
        bGoTime:=False;
      end;
      tMemTime:=((RowsToCopy - iNameRow) / m) / 1000;
//       ShowMessage(TimeToStr(tMemTime));
//       tMemTime:=iRowCount * tOneRecordTime;//вычисляем время
      sb3.Panels[2].Text:='Осталось: '+TimeToStr(tMemTime);
      application.ProcessMessages;
   end;//For e:=0 to RowsToCopy do begin
   memoErrors.Lines.Add(TimeToStr(Time)+' Этап 2: копирование данных во временную таблицу');
   fmMain.actXlsToTemp.Execute;//копирование во временную таблицу
   fmMain.tTemp.FlushBuffers;
   memoErrors.Lines.Add(TimeToStr(Time)+' Импорт завершен');
   memoErrors.Lines.Add('___________________________________________');
   if cbSound.Checked then  windows.Beep(1200,2000);
finally
 try
  sb3.Panels[0].Text:='Закрытие Excel...';
  application.ProcessMessages;
  Ex1.Quit;
  Ex1.Disconnect;
 except
  sb3.Panels[0].Text:='Ошибка закрытия Excel';
  application.ProcessMessages;
 end;//try-закрытие excel
 //включаем кнопки
 fmMain.actButtons.Execute;
 //прячем процессбар
 pb1.Visible:=false;
 sg1.RowCount:=1;
 sg1.Rows[0].Clear;
 lbWait.Visible:=False;
 lbFileName.Visible:=lbWait.Visible;
 screen.Cursor:=crDefault;
 cbAptName.ItemIndex:=-1;
 VarClear(Range);
 sb3.Panels[0].Text:='Импорт завершен.';
end;//try-finally
end;//procedure

Function TfmImpExcel.Find(sText:String;Var iRow:Integer;Var sCol:String;WorkSheetF:_WorkSheet):Bool;
Var
UsedRange, Range: OLEVariant;
t,y:Integer;//вспомогат для импорта
FirstAddress: string;
begin //поиск
 Result:=False;
 UsedRange := WorkSheetF.Range['A1','Z5000'];
 Range := UsedRange.Find(What:=sText, LookIn := xlValues, LookAt := xlWhole,SearchDirection := xlNext);
//  if not VarIsEmpty(Range)then begin
 if not VarIsClear(Range) then begin
   try
     FirstAddress := Range.Address;
     //вычисляем номер строки из полученного адреса(абсолютные координаты)
     //он начинается после второго значка доллара
     t:=PosEx('$',FirstAddress,2);
     iRow:=StrToInt(Copy(FirstAddress,t+1,length(FirstAddress)-t));
     //вычисляем номер столбца из полученного адреса(абсолютные координаты)
     //буква нач. со второго символа
     y:=PosEx('$',FirstAddress,2);
     sCol:=Copy(FirstAddress,2,y-2);
     Result:=true;
     VarClear(Range);
     VarClear(UsedRange);
   except
     Result:=False;
   end;//try-except
 end;//if
end;

PM MAIL   Вверх
Guest
Дата 18.5.2004, 14:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











To dsergey
Спасибо за код, нашел кое-что интересное, обязательно попробую, НО так и не нашел, как же выделить ВСЮ колонку (может проглядел!?), а не отдельную ячейку или диапазон. Может быть плохо объясняю, что нужно...
Мне нужно скрывать определенные столбцы в результате выполнения программы. Если я правильно понимаю, перед скрытием нужно этот самые столбцы выделить. А во всех примерах, которые я нашел, оперируют с отдельными ячейками (диапазоном) и нигде не видел, чтобы работали со всем столбцом (строкой). Хотел вытащить нужную функцию из макроса, но так и не смог его извернуть для Delphi, все время получал ошибки.
  Вверх
Akella
Дата 19.5.2004, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Для удаления я использую удаление не колонки а диапазона.
Range.Delete

тебе этот код о чем-нибудь говорит попробуй перевести на Delphi, я тоже попробую, посмотрим, что получится
Columns("C:C").Select
Selection.Delete Shift:=xlToLeft

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


Творец
****


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

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



я попробовал так
Var
Sheets,Colums:Variant;
begin
...
Sheets.Colums('D:D').Delete


нормально удалилось.

У меня кстати Off XP
PM MAIL   Вверх
alexe
Дата 20.5.2004, 08:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











To dsergey
Пробовал по-всякому до этого и сегодня полтара часа убил на это. Сыплет ошибками, хоть тресни, причем никак не могу узнать, что в качестве параметров передавать.
Зато набрел на кое-что интересное. Если не упираться в выбор колонки, а сразу попытаться скрыть, то ошибки выдаются уже другие smile.gif)
Если набрать
isheet.Columns.Hidden['1','1'] ;
то выдается несовместимость типов Integer и Char на этапе компиляции.
Если набрать
isheet.Columns.Hidden[1,1] ; или isheet.Columns.Hidden[1] ;
то выдается EVariantError "Variant is not an array".
Может так что-нибудь получится, но описание свойства Hidden в модуле excel97.pas:
property Hidden: OleVariant dispid 268;
меня ни на какие мысли не наводит sad.gif(
Может быть знаешь, какие параметры нужны?
Единственно, чего добился вразумительного, то это возможность выбора строки, хотя сам механизм выбора опять же непонятен
isheet.Range['1:1','1:1'].select;
Если менять любое (!) число, то это определяет количество выбираемых строк, причем выбирается любое (!) наибольшее из значений.
В общем, вопросов только прибавилось...

Поздно обновился. У меня Office 97.
Попробовал sheets.Columns['d:d'].delete ;
Получил EVariantError "Variant does not reference an automation object"
А объявления Sheets,Colums:Variant;
достаточно, или нужны какие-либо еще. Подключение к Excel прежнее, добавил в код только пробуемую строку(без добавок), ну и описание в var соответственно.


Это сообщение отредактировал(а) alexe - 20.5.2004, 09:14
  Вверх
Akella
Дата 21.5.2004, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Процедура экспорта таблицы в Excel
tRekv, tZay - таблицы
Excel - объявлено в начале модуля (Excel:Variant)
dbGridZay - TDBGrid (проверка, какие столбцы скрытые перед экспортом)
Код
procedure TfmMain.actZayToExcelExecute(Sender: TObject);
Var
UsedRange, Range, Sheets, Columns:Variant;
iColForRekv, iColSum, iColCount, iBegRow, iBegRowTitle, vRow:Integer;
s:String;
FirstAddress: string;
dDate:TDate;
begin
if not VarIsEmpty(Excel) then begin
 Excel.Quit;
 Excel := Unassigned;
end;//if
begin
 try
   Screen.Cursor:=crHourGlass;
   tZay.DisableControls;
   sb2.Panels[0].Text:='Открытие Excel...';
   application.ProcessMessages;
   Try//открываем Excel и создаем раб.книгу
     Excel:=CreateOleObject('Excel.Application');
     Excel.SheetsInNewWorkbook:=1;
     Excel.WorkBooks.Add;
     Sheets:=Excel.Workbooks[1].Sheets[1];
   Except
     SysUtils.beep;
     Screen.Cursor:=crDefault;
     sb2.Panels[0].Text:='Ошибка открытия Excel...';
     application.ProcessMessages;

     ShowMessage('Не могу открыть Excel!');
     Exit;
   end;//try-except
   //Название заявки
   sb2.Panels[0].Text:='Заполнение реквизитов...';
   application.ProcessMessages;

   tRekv.Open;

   iBegRowTitle:=1;
   //рисуем border
   Range:=Sheets.Range['B1'];
   Range.Borders[4].LineStyle := 1;
   //название поставщика
   Sheets.Cells[iBegRowTitle,2]:=lcbApt.Text;
   Range:=Sheets.Cells[iBegRowTitle,2];
   Range.HorizontalAlignment := xlCenter;
   Range.VerticalAlignment := xlCenter;
   Inc(iBegRowTitle);
   //подписываем под название поставщика
   Sheets.Cells[iBegRowTitle,2]:='/поставщик/';
   Range:=Sheets.Cells[iBegRowTitle,2];
   Range.HorizontalAlignment := xlCenter;
   Range.VerticalAlignment := xlCenter;

   iColForRekv:=4;//колонка для реквизитов
   Dec(iBegRowTitle,2);//строке для реквизитов
   if tRekvRNameUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:=tRekvRName.AsString;
   end;
   if tRekvRAddressUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:=tRekvRAddress.AsString;
   end;
   if tRekvRTelUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='Тел/Факс: '+tRekvRTel.AsString;
   end;
   if tRekvREMailUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='e-mail: '+tRekvREMail.AsString;
   end;
   if tRekvROKPOUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='ОКПО: '+tRekvROKPO.AsString;
   end;
   if tRekvRINNUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='ИНН: '+tRekvRINN.AsString;
   end;
   if tRekvRSvidNdsUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='№ свид плат. НДС: '+tRekvRSvidNds.AsString;
   end;
   if tRekvRBankUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='Банк: '+tRekvRBank.AsString;
   end;
   if tRekvRGorBankUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='город банка: '+tRekvRGorBank.AsString;
   end;
   if tRekvRMFOUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='МФО: '+tRekvRMFO.AsString;
   end;

   if tRekvRRSUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='Р/счет: '+tRekvRRS.AsString;
   end;
   if tRekvRLicenzeUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='Лицензия: '+tRekvRLicenze.AsString;
   end;
   Inc(iBegRowTitle);

   Sheets.Cells[iBegRowTitle,3]:='ЗАЯВКА';
   Range:=Sheets.Cells[iBegRowTitle,3];
   Range.Font.Bold:=True;

   Inc(iBegRowTitle);
   Sheets.Cells[iBegRowTitle,3]:='на '+ DateToStr(dtpZayBegin.Date);
   Inc(iBegRowTitle,2);
   sb2.Panels[0].Text:='Создание заголовков...';
   application.ProcessMessages;
   //заголовки столбцов
   iBegRow:=iBegRowTitle;//начальная строка для преператов
   vRow:=iBegRow+1;
   tZay.First;
   For iColCount:=0 to dbGridZay.Columns.Count-1 do begin
     Sheets.Cells[iBegRow,iColCount+1]:=dbGridZay.Columns[iColCount].Title.Caption;
     Sheets.Cells[iBegRow,iColCount+1].ColumnWidth:=dbgridzay.Columns[iColCount].Width div 6;
     Range:=Sheets.Cells[iBegRow,iColCount+1];
     Range.Font.Bold:=True;
     //рисуем border
     Range.Borders[1].LineStyle := 1;
     Range.Borders[2].LineStyle := 1;
     Range.Borders[3].LineStyle := 1;
     Range.Borders[4].LineStyle := 1;
   end;
   //заполнение таблицы
   sb2.Panels[0].Text:='Отправка данных...';
   application.ProcessMessages;
   while not tZay.Eof do begin
     For iColCount:=0 to dbGridZay.Columns.Count-1 do begin
       Range:=Sheets.Cells[vRow,iColCount+1];
       Case tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).DataType of
         ftFloat   : begin
                       Range.NumberFormat := '0,000';
                       Sheets.Cells[vRow,iColCount+1]:=
                       tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsFloat
                     end;
         ftString  : begin
                       Range.NumberFormat := '@';
                       Sheets.Cells[vRow,iColCount+1]:=
                       tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsString;
                     end;
         ftInteger : begin
                       Range.NumberFormat := '0';
                       Sheets.Cells[vRow,iColCount+1]:=
                       tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsInteger;
                     end;
         ftAutoinc : begin
                       Range.NumberFormat := '0';
                       Sheets.Cells[vRow,iColCount+1]:=
                       tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsInteger;
                     end;

         ftDate    : begin
                       Range.NumberFormat := '@';
                       dDate:=tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsDateTime;
                       Sheets.Cells[vRow,iColCount+1]:=FormatDateTime('dd.mm.yyyy',dDate);
                     end
       else
         Range.NumberFormat := '@';
         Sheets.Cells[vRow,iColCount+1]:=
         tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsString;
       end;//case-else
       try
       if tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).DataType = ftFloat then
        if tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsFloat = 0 then
           Sheets.Cells[vRow,iColCount+1]:=' ';
       except
       end;

       //рисуем border
       Range.Borders[1].LineStyle := 1;
       Range.Borders[2].LineStyle := 1;
       Range.Borders[3].LineStyle := 1;
       Range.Borders[4].LineStyle := 1;
     end;// FOR
     Inc(vRow);
     tZay.Next;
   end;//WHILE
   if (StrToFloat(dbGridZay.Columns[5].Footer.Value)<>0) AND
   (dbGridZay.Columns[5].Visible)  then begin
     iColSum:=dbGridZay.Columns[5].Index+1;//колонка для суммы
     Sheets.Cells[vRow,2]:='ИТОГО:';
     Range:=Sheets.Cells[vRow,iColSum];
     Range.HorizontalAlignment := xlRight;
     Range.VerticalAlignment := xlCenter;
     Range.NumberFormat := '0,000';
     try
      Sheets.Cells[vRow,iColSum]:=StrToFloat(dbGridZay.Columns[5].Footer.Value);
     except
      Range.NumberFormat := '@';
      Sheets.Cells[vRow,iColSum]:=dbGridZay.Columns[5].Footer.Value;
     end;
   end;

   sb2.Panels[0].Text:='Удаление лишних полей...';
   application.ProcessMessages;

   //удаляем лишние столбцы (по умолчанию со сдвигом влево)
   For iColCount:= dbGridZay.Columns.Count-1 downto 0 do begin
     if dbGridZay.Columns[iColCount].Visible=False then begin
       UsedRange := Sheets.Range['A1','Z100'];//диапазон поиска заголовка
       Range := UsedRange.Find(What:=dbGridZay.Columns[iColCount].title.Caption, LookIn := xlValues, LookAt := xlWhole,SearchDirection := xlNext);
       if not VarIsEmpty(Range) then begin
         try
           FirstAddress := Range.Address;
           s:=StringReplace(FirstAddress,'$','',[rfReplaceAll]);
           Range:=Sheets.Range[s+':'+Copy(s,1,1)+IntToStr(vRow)];
           Range.Delete;
         except

         end;//try
       end;//if not VarIsEmpty(Range)then begin
     end;//if dbGridZay.Columns[iColCount].Visible=False then begin
   end;//for delete
   sb2.Panels[0].Text:='Экспорт завершен...';
   application.ProcessMessages;
  finally
   tZay.EnableControls;
   Screen.Cursor:=crDefault;
   tRekv.Close;
   Excel.Visible:=True;
  end;//finally
end;

Добавлено @ 08:04
Переходи на Delphi7 и OfficeXP
PM MAIL   Вверх
Guest
Дата 21.5.2004, 09:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Большое спасибо за информацию!
Кажется, количество полученной информации должно вот-вот перерасти в новое качество smile.gif
Самое главное, в цикле статей "Заметки программиста" из журнала Компьютер-Пресс нашел очень интересный факт:
"... использование вариантов (позднее связывание) проще, удобнее, а главное - намного понятнее, чем непосредственная работа с интерфейсами (раннее связывание)."
Автор статьи, используя раннее связывание, как и я, пытался выполнить действие с колонкой, но так и не смог. Что, в общем-то, и подтверждается моей практикой. Короче говоря, пора переходить на позднее связывание, что я и вижу в твоих работающих (!) примерах.
А на счет перехода на Office XP, это, к сожелению, технически невозможно. Вот поставить себе новую версию Delphi 6 или 7 в планах есть, но пока не знаю, что лучше по нетребовательности к ресурсам (у меня Celeron 1ГГц / 128 МБ DIMM / Win98SE и необходимость одновременной работы, помимо Delphi, с 2-3 сессиями Access одновременно) и по устойчивости в работе. Так что пока собираю информацию. Но это так, мысли вслух.
Еще раз большущее спасибо!!!

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


Творец
****


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

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



Добавь 128 памяти, и переходи на WinXP. А процессор для программирования у тебя вполне нормальный.

Я работаю и с ранним связыванием, и с позним связыванием.
Так получилось.
Импорт из Excel - через компоненту на странице Servers,
Экспорт в Excel - через Ole
PM MAIL   Вверх
Гость_alexe
Дата 21.5.2004, 11:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











To dsergey
Пока ни на какой Windows перейти не могу. У нас так хитро заморочена сеть, что ПК с Win2k/WinXP пропадают у остальных пользователей в сетевом окружении.
Подскажи, пожалуйста, а сильно придется "переучиваться" при переходе с Delphi 5.5 на 7, и, самое главное, нет ли каких неприятных "особенностей" у 7 версии. У меня жесткая привязка к Office 97, точнее к Access 97, поэтому если 7 версия вдруг не поддерживает Access 97, то придется переходить на 6.

  Вверх
Akella
Дата 25.5.2004, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Delphi 7 поддерживает и 97, и 2000, и XP.
Переход на Delphi 7 безболезненный, по крейней мере пока о проблемах не слышал не от кого.
Так что дерзай.

а в модуле я могу указать в секции uses Excel97 или Excel2000, или ExcelXP, или и то, и другой, и можно без хлеба. Только некоторые параметры нужно менять, как, например, при открытии файла количество параметров разное.

hehe.gif rolleyes.gif hehe.gif rolleyes.gif

Это сообщение отредактировал(а) dsergey - 25.5.2004, 08:24
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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