Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

excel в delphi цикл по строкам   Найти похожие ветки 

 
123456789igor ©   (2012-09-08 20:12) [0]

Начал изучать редактирование excel книг через delphi по началу было все понятно, пока не столкнулся с одним примером:
Вот картинки что есть и что надо получить:

до
[IMG]http://s1.ipicture.ru/uploads/20120908/EN8U64Hh.bmp[/IMG]
после
[IMG]http://s1.ipicture.ru/uploads/20120908/Et6puQCQ.bmp[/IMG]
Задание:
1) После каждой строки добавить 3 пустых строки
2) Объединение
3) С чем пока совсем глухо это в образовавшейся так сказать "матрице"(выделена жирным) вокруг одного числа, к примеру 2,45 заполнить 7 близлежащих ячеек значениями 2,45+-10%от этого числа(так же с 4,56 и 7,67) цифры и задание выдумано мной для практики

ну значит по сути все что надо мне сделать это разобраться с проходом цикла по строкам(так как я не знаю какое конечное кол-во строк в документе)
Как я себе это представил[CODE]
procedure TForm1.Button1Click(Sender: TObject);
begin
try
for номер строки равен от 1 до n do
begin
создать новую строку
создать новую строку
создать новую строку
номер строки:=номер строки+1;(что бы перескакивал через изначально 2ую строку и после нее рисовал ещё 3)
end;[/CODE]
но реализовать это программно у меня не входит
Так же пробовал с объединением:[CODE]
for a_:=1 to 5 do
begin
excel.WorkBooks[1].WorkSheets[1].Range["a_,5"].Merge;
end;[/CODE]
тоже не выходит, а так все команды, без циклов, все получается:добавить стоку после какой-то строки или объединить или записать значение
p.s
читал форумы и книгу ВАСИЛИЯ КОРНЯКОВА ПРОГРАММИРОВАНИЕ ДОКУМЕНТОВ И ПРИЛОЖЕНИЙ MS OFFICE в DELPHI про массивы ничего(((


 
sniknik ©   (2012-09-09 09:06) [1]

цикл не нужен... используй их пореже для построчной/по ячеечной работы с Excel.
лучше ищи инфу как работать с макросами, это обычная практика, начать макрос, сделать все что нужно руками, записать макрос, а после смотреть его код и переносить в свою программу. так чтобы как можно меньше внешних вызовов было.


 
Amoeba_   (2012-09-09 11:53) [2]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1274


 
123456789igor ©   (2012-09-09 14:49) [3]


> цикл не нужен... используй их пореже для построчной/по ячеечной
> работы с Excel.
> лучше ищи инфу как работать с макросами, это обычная практика,
>  начать макрос, сделать все что нужно руками, записать макрос,
>  а после смотреть его код и переносить в свою программу.
>  так чтобы как можно меньше внешних вызовов было.

Я пробовал работать с макросами, но ведь программа будет обрабатывать разные документы и в них кол-во строк может отличаться и это количество мне не известно. Не пойму как тут без цикла.
А вот про макросы открываю документ(мне надо после каждой строчки добавить 3 пустые строки и так после каждой строки) делаю вручную и пишу макрос вот что получилось:
Sub Макрос1()
"
" Макрос1 Макрос
"

"
   Rows("2:2").Select
   Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
   Rows("3:3").Select
   Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
   Rows("4:4").Select
   Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
   Rows("6:6").Select
   Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
   Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
   Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
   Rows("10:10").Select
   Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
   Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
   Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
End Sub
Но как мне поможет макрос если я не знаю кол-во строк изначально ведь от этого зависит кол-во новых, вставленных, строк?


 
sniknik ©   (2012-09-09 14:54) [4]

> если я не знаю кол-во строк
это секрет, конечно же, но оно точно такое же как в исходных данных...
т.е.
знаешь начало, знаешь сколько записей, значит знаешь конец... применяешь макрос на range (диапазон).


 
123456789igor ©   (2012-09-09 15:05) [5]

а как узнать сколько записей?


 
123456789igor ©   (2012-09-09 15:19) [6]

Вот код с которым мне помогли
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Excel:= CreateOleObject("Excel.Application");
 try
   Excel.workbooks.open(GetCurrentDir() + "\book.xlsx");
 
   try
     for i:= Excel.WorkBooks[1].WorkSheets[1].UsedRange.Row + Excel.WorkBooks[1].WorkSheets[1].UsedRange.Rows.Count+1 downto
     Excel.WorkBooks[1].WorkSheets[1].UsedRange.Row+1 do
     begin
       for j:=1 to 3 do
       begin
         Excel.WorkBooks[1].WorkSheets[1].Rows[i].insert(-4121);
       end;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,1],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,1]].merge;
     end;
     excel.visible := true;
   finally
     Excel.ActiveWorkbook.Close;
   end;
 finally

 end;

end;

end.

я почитал про UsedRange я так понял это прямоугольная область которая охватывает все ячейки(исп. и неисп.) правильно?
Тогда логично предположить что UsedRange.Row это все строки, так? Но что означает эта запись?
for i:= Excel.WorkBooks[1].WorkSheets[1].UsedRange.Row + Excel.WorkBooks[1].WorkSheets[1].UsedRange.Rows.Count+1 downto
Excel.WorkBooks[1].WorkSheets[1].UsedRange.Row+1 do


 
123456789igor ©   (2012-09-09 18:45) [7]

В общем добрался до следующего:
[CODE]
unit new;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, comobj, StdCtrls, Excel_TLB, Buttons;

type
 TForm1 = class(TForm)
   BitBtn1: TBitBtn;
   procedure BitBtn1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
  Form1: TForm1;
 excel: variant;
 i,j,k,a_:integer;
 c_,d_:real;
 const b_=1.22;
implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Excel:= CreateOleObject("Excel.Application");
 try
   Excel.workbooks.open(GetCurrentDir() + "\book2.xlsx");
 
   try
    for i:= Excel.WorkBooks[1].WorkSheets[1].UsedRange.Rows.Count-1 downto 9 do
     begin
       for j:=1 to 3 do
       begin
         Excel.WorkBooks[1].WorkSheets[1].Rows[i].insert;
       end;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,1],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,1]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,2],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,2]].merge;

       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,6],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,6]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,7],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,7]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,8],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,8]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,9],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,9]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,10],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,10]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,12],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,12]].merge;

     Excel.WorkBooks[1].WorkSheets[1].cells[i,11]:=2;
     Excel.WorkBooks[1].WorkSheets[1].cells[i+1,11]:=3;
     Excel.WorkBooks[1].WorkSheets[1].cells[i+2,11]:=4;
     Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,18],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,21]]:="-";
     end;

[COLOR="Red"]
     randomize;

     for a_:=8 to 9 do
     begin
     c_:=(b_*0.01)+(b_*0.1)*random;
     d_:=b_*c_;
     Excel.WorkBooks[1].WorkSheets[1].cells[a_,14]:=b_+d_;
     end;[/COLOR]

     excel.visible := true;
   finally
     Excel.ActiveWorkbook.Close;
   end;
 finally

 end;

end;

end.
[/CODE]
проблема с рандомом я хочу заполнить ячейки 8,14 и 9,14 случайным числом которое получ след образом: число b_+(или "-")0-10% от этого же числа но не знаю как осуществить + или - чтобы тоже рандомно выбирало знак


 
123456789igor ©   (2012-09-10 22:39) [8]

В общем я сам во всем разобрался и задача практически выполнена осталась она проблема:
допустим у меня есть 7 ячеек(В них может быть число отличное от нуля либо ничего) по вертикали мне нужно сделать такое условие
Если А[i] пустая то переходим к следующей ячейке иначе копируем значение в стоящие следом 3 ячейки
было:                          стало:
А1  17,33                    А1    17,33                          
А2                               А2    17,33
А3                               А3    17,33
А4                               А4    17,33
А5  13,23                    А5    13,23
А6                               А6    13,23
А7                               А7    13,23
А8                               А8    13,23
А9                               А9
А10                             А10
А[n]                            A[n]
A[n+1]                        A[n+1]


 
Медвежонок Пятачок ©   (2012-09-10 23:01) [9]

а зачем здесь делфи вообще?


 
Медвежонок Пятачок ©   (2012-09-10 23:06) [10]

если цель - заполнить excel, то надо курить как это сделать самим экселем.
если цель научиться управлять книгой из делфи, то надо делать это опять же по максимуму используя средства самого экселя.
а то, что ты делаешь сейчас - это изучение алгоритмизации и циклов, но только через гланды. это надо осваивать в делфи без экселя.


 
123456789igor ©   (2012-09-11 21:44) [11]

Все всем спасибо программа написана.
Остался последний вопрос как сделать так, что бы пользователь сам мог выбрать файл с которым работает программа? Ну знаю что нужно вставить OpenDialog затем кнопку "открыть" затем при нажатии на кнопку открывался файл, как-то так:

procedure TForm1.Button1Click(Sender: TObject);
begin
           OpenDialog1.Execute;
end;


Но я не пойму как это осуществить для моей задачи вот мой код:

unit new;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, comobj, StdCtrls, Excel_TLB, Buttons;

type
 TForm1 = class(TForm)
   BitBtn1: TBitBtn;
   procedure BitBtn1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 excel: variant;
implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Excel:= CreateOleObject("Excel.Application");
 try
   Excel.workbooks.open(GetCurrentDir() + "\book2.xlsx");
 
   try
     
  Тело

     excel.visible := true;
   finally
     Excel.ActiveWorkbook.Close;
   end;
 finally

 end;

end;

end.


 
MBo ©   (2012-09-11 21:53) [12]

OpenDialog1.Execute - функция , возвращает результат.
В зависимости от него могут предприниматься действия с OpenDialog.Filename



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.076 c
2-1331452366
Alex_C
2012-03-11 11:52
2013.03.22
Работа с БД в отдельном треде.


2-1335429750
Daryma
2012-04-26 12:42
2013.03.22
Access & Delphi 7


15-1346743469
Dimka Maslov
2012-09-04 11:24
2013.03.22
Бубен не помогает.


2-1330858890
Zheksonz
2012-03-04 15:01
2013.03.22
Прерывание по изменению значения переменной.


2-1330935134
Alex_C
2012-03-05 12:12
2013.03.22
Вписать рисунок в RoundRect





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский