• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Excel В Delphi Цикл По Строкам

  • Автор темы 123456789igor
  • Дата начала
1

123456789igor

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

до
V2nW2OPS.jpg

после
J8AT2skW.jpg

Задание:
1) После каждой строки добавить 3 пустых строки
2) Объединение
3) С чем пока совсем глухо это в образовавшейся так сказать "матрице"(выделена жирным) вокруг одного числа, к примеру 2,45 заполнить 7 близлежащих ячеек значениями 2,45+-10%от этого числа(так же с 4,56 и 7,67) цифры и задание выдумано мной для практики

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

123456789igor

В общем добрался до следующего:
Код:
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.
проблема с рандомом я хочу заполнить ячейки 8,14 и 9,14 случайным числом которое получ след образом: число b_+(или "-")0-10% от этого же числа но не знаю как осуществить + или - чтобы тоже рандомно выбирало знак
 
S

sinkopa

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

Не понимаю в чем (с рандомом) у Вас проблема может возникнуть... :huh:
Код:
// Вы тип не указали, поэтому Variant (универсальный случай)
function RandomDeltaB(b_: Variant): Variant;
var
delta: Integer;
result2: Variant;
begin
Randomize;
//я хочу заполнить ячейки случайным числом которое получ след образом:

{ число b_+(или "-") }
Result := b_;

{ 0-10% от этого же числа }
delta := (b_ * 100)*10 div 100;
Result2 := Random(delta)/100;

{ как осуществить + или - чтобы тоже рандомно выбирало знак }
if (Random(10) > 5) then
Result := Result + Result2
else
Result := Result - Result2;
end;
 
1

123456789igor

В общем я сам во всем разобрался и задача практически выполнена осталась она проблема:
допустим у меня есть 7 ячеек(В них может быть число отличное от нуля либо ничего) по вертикали мне нужно сделать такое условие
Если А пустая то переходим к следующей ячейке иначе копируем значение в стоящие следом 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]
 
1

123456789igor

Все всем спасибо программа написана.
Остался последний вопрос как сделать так, что бы пользователь сам мог выбрать файл с которым работает программа? Ну знаю что нужно вставить 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.
 
S

sinkopa

Все всем спасибо программа написана.
Остался последний вопрос как сделать так, что бы пользователь сам мог выбрать файл с которым работает программа?
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
OpenDialog1.Filter := 'Excel files (*.xlsx)|*.xlsx';
if not OpenDialog1.Execute then // пользователь нажал "Отменить"
Exit;

Excel:= CreateOleObject('Excel.Application');
try
Excel.workbooks.open(OpenDialog1.FileName);
try
// Тело
Excel.Visible := true;
finally
Excel.ActiveWorkbook.Close;
end;
finally
end;
end;
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!