Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2009, 10:02   #1
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию выгрузка определенных ячеек из excel

хочу сделать такую штуку. допустим на форме есть поле, в ктр пользователь выбирает ячейки, ктр нужно выгрузить из excel допустим в блокнот.есть тысяча excel файлов. нажимаю кнопку и из всех файлов начинается выборка ячеек и сохранение их значений в блокнот. каким образом это можно сделать?
kate158 вне форума Ответить с цитированием
Старый 18.09.2009, 10:51   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

извините, Катя, а можно встречный вопрос?

А что именно вызывает трудности?
Как прочитать значение ячейки из XLS файла?
Или как сохранить полученное значение в текстовый файл? (надеюсь, Вы же не собираетесь передавать данные в окно открытго Блокнота?! )
Или проблема перебрать все XLS файлы в определённом каталоге (кстати, подкаталоги Вас тоже интересуют)
Или проблема в том, каким образом Вы в поле собираетесь задавать нужные ячейки?!

p.s. кстати, эту задачу можно решить и макросом на Excel
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.09.2009, 11:10   #3
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

вот что вызывает трудности:
1. попробую объяснить. в общем, хочу чтоб в эдит поле было добавление номеров ячеек экселя, допустим D2,D3. потом нажатие кнопки, и из всех 1000 файлов значения ячеек передавались в блокнот. т.е.,Не знаю каким образом передавать выбранные ячейки.
2. не знаю как перебрать все excel файлы.

подкаталоги пока не интересуют. все файлы лежат в одном месте.

Последний раз редактировалось kate158; 18.09.2009 в 11:12.
kate158 вне форума Ответить с цитированием
Старый 18.09.2009, 11:23   #4
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

Для начала надо найти книгу, например.
Корняков В. - Программирование документов и приложений MS Office в Delphi.pdf

адресация Экселя от A B, C ... AA, AB, AC ... IV - значит это в список.

процедура поиска файлов, что-то типа:
Код:
with StringGrid1 do
  begin
    RowCount := 0;

    if FindFirst(Edit1.Text, FileAttrs, sr) = 0 then

    begin
      repeat
        if (sr.Attr and FileAttrs) = sr.Attr then
        begin
        RowCount := RowCount + 1;
        Cells[1,RowCount-1] := sr.Name;
        Cells[2,RowCount-1] := IntToStr(sr.Size);
        end;
      until FindNext(sr) <> 0;
      FindClose(sr);
    end;
  end;
end;
// это все из дельфийского примера.

Затем
Создаем в памяти ОЛЕ-объект Экселя и возвращаем на него ссылку
Код:
procedure Excel_view(var ExcelApp : variant;var ExcelBook :Variant; var ExcelSheet:Variant;path, name : string; visbl: boolean; opn :  string);
var
 kk : integer;
begin
  try
   ExcelApp := GetActiveOleObject('Excel.Application');
// ищем активный запущенный Эксель
  except
   try
// иначе создаем его - невидимо грузим в память эксель
   ExcelApp := CreateOleObject('Excel.Application');
   except
// ругаем что нет ничего
   Application.MessageBox('Excel Not instalelled!','Attention!')
   end;
 end;
либо проще - просто создаем эксель.
Код:
 try
  // работаем с Excel    eOleSysError
 // Path := ExtractFileDir(Application.ExeName);
  if opn = 'open' then begin
  // проверяем. не открыт ли указанный документ
   kk := ExcelApp.WorkBooks.Count; // число книг кажется 
   while kk > 0 do
   begin
   ExcelBook := ExcelApp.WorkBooks.Item[kk]; 
    if name = ExcelBook.Name then begin
      kk := -1 ;
    end;
    kk := kk - 1;
   end;

   if kk = 0 then
   try
   ExcelBook := ExcelApp.WorkBooks.open(path+name) 
// открываем нужную книу
   except
   end
   else if ExcelApp.WorkBooks.Count =0 then
              ExcelBook := ExcelApp.WorkBooks.Add;
// или создаем чистый лист
    end
   else
   if opn = 'dot' then
   try
   ExcelBook := ExcelApp.WorkBooks.Add(path+name)
   except
   end
   else begin
   if ExcelApp.WorkBooks.Count=0 then ExcelBook := ExcelApp.WorkBooks.Add
   else ExcelBook := ExcelApp.ActiveWindow;
   end;

  ExcelApp.Visible := visbl; //показали или нет 

  if visbl then begin

   ExcelBook.Activate;
   ExcelApp.WindowState := -4137//-4143;
  end;
   except
  name := 'File "'+name+ '" not found in directory: ' + path;
  Application.MessageBox(PAnsiChar(name),'Attention!');
       end;
end;
А теперь работа с ячейками

Код:
var
  D1, D2 : Variant;
  E, W, SH : Variant;

* * * *
    SB.SimpleText := 'вызываем Эксель';
    E  := CreateOleObject('Excel.Application');
    SB.SimpleText := 'удачно вызвали Эксель - открываем книгу';
    try
      E.DisplayAlerts  := False;
      E.WorkBooks.Open(EditFile.Text, ReadOnly:=True);
      SB.SimpleText := 'Удачно открыли книгу';
      W := E.WorkBooks.Item[1];
      SH := W.Sheets.Item[1];
    except
       Application.MessageBox('Ошибка при работе с XLS-файлом'');
       SB.SimpleText := 'Ошибка при открытии xls-файла';
       Application.ProcessMessages;
    end;
* * * 
   Application.ProcessMessages;
   try
   D1 :=  SH.Range[EditAA.Text+EditS.Text+':'+EditAA.Text+EditPO.Text].Value;
// диапазон для обращения к столбцу открытой книги выбранного листа
// считываем его в эту переменную весь диапазон из экселя
   except
     Application.MessageBox('Ошибка в указании диапазона строк','');
    exit;
   end;
* * * *
 if VarIsEmpty(D1) then begin
    MessageDlg('Ошибка: диапазон пуст',mtConfirmation,[mbOk],0);
    exit;
   end;
* * * 

      StartDDD := VarArrayLowBound(D1,1);
      NumS := StrToInt(EditS.Text);
// начальная строка
      NumPo := StrToInt(EditPo.Text);
// конечная строка

* * * 
while (StartDDD  <= (NumPo-Nums+1))and(STOPPROCESS) do begin
       try
      SB.SimpleText := IntToStr(StartDDD );
      Application.ProcessMessages;
      GaugeProgress.Progress := (StartDDD  * 100) div (NumPo - NumS);

      Per1 := VarArrayGet( D1,[StartDDD ,1]);
// считываем из диапазона из 1-го столбца строку StartDDD 

finally
// при любой ошибке работы с экселем - переходим к другой строке
        inc(StartDDD );
next
Где-то так. В итоге - получается на мой взгляд такой цикл.

1-й цикл
ищем эксель файл
2 -й цикл
открываем книгу
и считываем заданные ячейки и диапазоны
если ячеек много, то будет несколько диапазонов D1, D2, D3
либо можно создать массив диапазонов или динамический массив
Dmas : array [1..255] of variant
а диапазон задавать типа A1-A65535

конец цикла по файлы эксель

конец цикла по найденным файлам.

И в цикле обрабатывать файлы

Ну как-то так.
Может есть и проще способ
и это пройдет...

Последний раз редактировалось grenles; 18.09.2009 в 11:39.
grenles вне форума Ответить с цитированием
Старый 18.09.2009, 11:33   #5
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

Цитата:
Сообщение от kate158 Посмотреть сообщение
вот что вызывает трудности:
1. попробую объяснить. в общем, хочу чтоб в эдит поле было добавление номеров ячеек экселя, допустим D2,D3. потом нажатие кнопки, и из всех 1000 файлов значения ячеек передавались в блокнот. т.е.,Не знаю каким образом передавать выбранные ячейки.
2. не знаю как перебрать все excel файлы.

подкаталоги пока не интересуют. все файлы лежат в одном месте.
Ну допустим это можно задавать на форме, или списком диапазонов.

В любом случае "B2" "C3" - это

В итоге в эту строу будет вставляться что-то типа
Код:
   D1 :=  SH.Range[EditLS.Text+EditS.Text+':'+EditLS.Text+EditPO.Text].Value;
D[1] := SH.Range["B2:B2"]
D[2] := SH.Range["C3:C3"]

ну а дальше просто по схеме из диапазона выбирай число
Код:
     Per := VarArrayGet( D[1],[CurrentLine,1]);
и делай что хочешь с ним

то есть Per - Это искомое значение любого типа от строки до даты или числа
и это пройдет...

Последний раз редактировалось grenles; 18.09.2009 в 11:41.
grenles вне форума Ответить с цитированием
Старый 18.09.2009, 11:37   #6
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

А задавать можно не доверяя пользователя. а сделай примитивный автомат, для формирования списков, типа

четыре выпадающих списка
1 - 3 - это названия столбцов A. B. ... AA.... BR... IV
2-4 это спидэдиты (1-65535)
и кнопочку - создать, и сама пишешь в редактор диапазон уже точно верный, чтобы пользователь не зафигачил руками "русскую" А1-А2

ну или как-то в таком же направлении.

Можно предлагать заготовки, для более быстрого задания диапазона
и это пройдет...
grenles вне форума Ответить с цитированием
Старый 18.09.2009, 11:43   #7
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

ого. как глобально.=)спасибо.
уже программлю
kate158 вне форума Ответить с цитированием
Старый 18.09.2009, 11:56   #8
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

да не за что, главное, чтобы у вас получилось..

Постскриптум.
Если честно я сам половину кода из книжки и ... чужой программы взял.
Ну кое-что и сам додумал.
и это пройдет...
grenles вне форума Ответить с цитированием
Старый 22.09.2009, 14:51   #9
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

пытаюсь побороться с ячейками..
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  D1, D2 : Variant;
  E, W, SB,SH : Variant;
  i:integer;
BEGIN
    E  := CreateOleObject('Excel.Application');
      E.DisplayAlerts  := False;
      for i:=0 to Memo1.Lines.Count - 1 do
      E.WorkBooks.Open(trim(Memo1.Lines[i]), ReadOnly:=True);
      W := E.WorkBooks.Item[1];
      SH := W.Sheets.Item[1];
         D1 :=  SH.Range[EditAA.Text].Value;
            showmessage(d1);
            //E.Visible:=true;
               e.WorkBooks.close;
   Application.ProcessMessages;
end;
теперь пользователь может добавить либо диапазон вида D1:D3 либо D5 либо D1;D4;D8
цикл по excel файлам есть, по значениям ячеек нет..
в чем проблема?

ни у кого никаких идей?

Последний раз редактировалось Stilet; 23.09.2009 в 08:39.
kate158 вне форума Ответить с цитированием
Старый 22.09.2009, 16:33   #10
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

Цитата:
ни у кого никаких идей?
по поводу чего?
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
автоматическое заполнение данными ячеек в excel kasanad80 Microsoft Office Excel 7 17.07.2009 15:31
Excel выдает ошибку "слишком много различных форматов ячеек" Рогачева Татьяна Microsoft Office Excel 2 14.04.2009 08:50
Чтение Excel ячеек в текстовый фаил jopaz Общие вопросы Delphi 4 06.10.2008 00:04
Суммирование определенных ячеек при переносе Pilot Microsoft Office Excel 5 17.07.2008 12:46
Delphi c SQL и выгрузка в Excel или word girl23 БД в Delphi 7 24.10.2007 17:56