Программа iNETsHOP - обработка, сравнение, анализ прайс листов поставщиков, создание каталога товаров интернет магазина Форум - Программа iNETsHOP - Работа с программой - Создание схемы импорта


http://inetshop.in.ua/index.php?p=showtopic&toid=281&fid=2&area=1&print_post=1619
05.01.2016 17:32

MaXX


Пользователь iNETsHOP


Количество сообщений   64
Зарегистрирован:   11-11-2008, 04:35:57
Как загрузить прайс из Excel через OLE Automation
Мне, когда нужно вытащить какое-то значение ячейки из экселевского листа, открываю его через OLE Automation и читаю из Cells. Сейчас переделал чтение для такого прайса как в примере. Держите вариант на заметку (если колонок не хватает, добавляйте их так же):

Код

declare
@file_name varchar(255), @IExcel int, @hr int, @IWorkbook int,
@data varchar(255),
@source varchar(255),
@description varchar(255),
@iRow int, @iColumn int, @sCellStr varchar(150);
;

DECLARE
@code varchar(32),
@name varchar(155),
@photo varchar(1024),
@price varchar(16),
@url varchar(1024),
@folder_name varchar(155),
@manuftac varchar(1024),
@attributes varchar(max)
;

set @file_name = :FILENAME;
exec @hr = sp_OACreate 'Excel.Application', @IExcel OUT
exec @hr = sp_OASetProperty @IExcel, 'DisplayAlerts', 0

exec @hr = sp_OAMethod @IExcel, 'Application.workbooks.Open', @IWorkbook OUT , @file_name

SET @iRow = 1;
while 1=1
begin
SET @code = NULL;
SET @name = NULL;
SET @photo = NULL;
SET @price = NULL;
SET @url = NULL;
SET @folder_name = NULL;
SET @manuftac = NULL;
SET @attributes = NULL;
SET @sCellStr = 'Application.Activeworkbook.Activesheet.Cells(' + LTRIM(STR(@iRow, 10, 0)) + ',1).value';
exec @hr = sp_OAGetProperty @IExcel, @sCellStr, @code OUT;

SET @sCellStr = 'Application.Activeworkbook.Activesheet.Cells(' + LTRIM(STR(@iRow, 10, 0)) + ',3).value';
exec @hr = sp_OAGetProperty @IExcel, @sCellStr, @name OUT;

SET @sCellStr = 'Application.Activeworkbook.Activesheet.Cells(' + LTRIM(STR(@iRow, 10, 0)) + ',7).value';
exec @hr = sp_OAGetProperty @IExcel, @sCellStr, @photo OUT;

SET @sCellStr = 'Application.Activeworkbook.Activesheet.Cells(' + LTRIM(STR(@iRow, 10, 0)) + ',8).value';
exec @hr = sp_OAGetProperty @IExcel, @sCellStr, @price OUT;

SET @sCellStr = 'Application.Activeworkbook.Activesheet.Cells(' + LTRIM(STR(@iRow, 10, 0)) + ',9).value';
exec @hr = sp_OAGetProperty @IExcel, @sCellStr, @url OUT;

SET @sCellStr = 'Application.Activeworkbook.Activesheet.Cells(' + LTRIM(STR(@iRow, 10, 0)) + ',11).value';
exec @hr = sp_OAGetProperty @IExcel, @sCellStr, @folder_name OUT;

SET @sCellStr = 'Application.Activeworkbook.Activesheet.Cells(' + LTRIM(STR(@iRow, 10, 0)) + ',12).value';
exec @hr = sp_OAGetProperty @IExcel, @sCellStr, @manuftac OUT;

SET @sCellStr = 'Application.Activeworkbook.Activesheet.Cells(' + LTRIM(STR(@iRow, 10, 0)) + ',13).value';
exec @hr = sp_OAGetProperty @IExcel, @sCellStr, @attributes OUT;

IF ISNULL(@name, '') = '' BREAK;

INSERT INTO #TMP_PRICE ([NAME],[BRAND], [SID], [DESC_FULL], [PRICE], [CATEGORY], [URL], [IMAGE_URL])
SELECT @name, @manuftac, @code, @attributes, @price, @folder_name, @photo, @url;
SET @iRow = @iRow + 1;
end;

exec sp_OAMethod @IExcel, 'Quit';

exec @hr = sp_OADestroy @IExcel;


P.S.
Этот код нужно вставить в схему импорта там где SQL-запрос импорта или как-то так называется.