Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.244 c
15-1338131036
ProgRAMmer Dimonych
2012-05-27 19:03
2013.03.22
HP Photosmart B110b и чёрный картридж


2-1338196726
leklerk
2012-05-28 13:18
2013.03.22
Не работает WinExec


2-1330341762
kate158
2012-02-27 15:22
2013.03.22
выравнивание по ширине+абзац в qreport


15-1338665541
Rouse_
2012-06-02 23:32
2013.03.22
Ребят, а что за фильм?


15-1342873269
wl
2012-07-21 16:21
2013.03.22
подключение внешнего монитора к ноутбуку