15.02.2017, 16:18
|
|
I Like it!
|
|
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
|
|
Не знаю, отпишется ли ТС. На всякий случай отпишусь я.
Найдено рабочее решение: Программа-D2 и DLL-D7. Библиотечная функция получает страницу книги и координаты ячейки, где вставляется символ диаметра.
Программа:
Код:
uses
OleAuto;
type
_DoChangeSymbol = function (OleSheet: PVariant; Col, Row: Integer): Boolean; stdcall; //external 'ChangeSymbol.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
excel, wb, sh: Variant;
lib: THandle;
proc: _DoChangeSymbol;
begin
if OpenDialog1.Execute then
try
excel := CreateOleObject('Excel.Application');
excel.Visible := false;
excel.DisplayAlerts := false;
try
excel.WorkBooks.Open(OpenDialog1.FileName);
wb := excel.WorkBooks[ExtractFileName(OpenDialog1.FileName)];
sh := wb.WorkSheets[1];
sh.Cells[1, 1].Value := 'Outer d=12, Inner d=8';
lib := LoadLibrary('ChangeSymbol.dll');
if lib >= 32 then
begin
@proc := GetProcAddress(lib, 'DoChangeSymbol');
if @proc <> nil then proc(@sh, 1, 1);
//if proc(@sh, 1, 1) then ShowMessage('Yep!')
//else ShowMessage('Upssss....');
FreeLibrary(lib);
end;
wb.Save;
finally
excel.Quit;
sh := UnAssigned;
wb := UnAssigned;
excel := UnAssigned;
end;
except
raise Exception.Create('Error');
end;
ShowMessage('Done!');
end;
Библиотека:
Код:
library ChangeSymbol;
function DoChangeSymbol(OleSheet: PVariant; Col, Row: Integer): Boolean; stdcall;
var
i: Integer;
ws: WideString;
begin
try
ws := OleSheet^.Cells[Col, Row];
i := Pos('d=', ws);
while i > 0 do
begin
ws[i] := WideChar(216);
i := Pos('d=', ws);
end;
OleSheet^.Cells[Col, Row] := ws;
Result := True;
except
Result := False;
end;
end;
exports
DoChangeSymbol;
begin
end.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
|