Прайс excel с корзиной

Хочу сделать прототип корзины магазина как в этом примере

PYCTAM

Дата: Среда, 12.11.2014, 06:51 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
60% ±


Excel 2010

Когда то нашел в этом сайте один хороший пример, сейчас мне оно понадобилась…
не смог найти эту тему
не разобрался с формулой =ЕСЛИОШИБКА(ИНДЕКС(Прайс!E$11:E$343;НАИМЕНЬШИЙ(Прайс!A$11:A$343;A17)-10);»») и с условным форматированием… Делаю также но у меня не получается…
Здесь сделано так чтобы при двойном щелчке товара оно добавлялась в другом листе ЗАЯВКИ (как в корзину в интернет магазинах)…

К сообщению приложен файл:

_1_2.xlsm
(47.2 Kb)

Сообщение отредактировал PYCTAMСреда, 12.11.2014, 08:20

 

Ответить

Pelena

Дата: Среда, 12.11.2014, 08:58 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Не понятно, в чём вопрос. В файле всё работает


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Гость

Дата: Среда, 12.11.2014, 09:06 |
Сообщение № 3

почему то у меня не работает

 

Ответить

Pelena

Дата: Среда, 12.11.2014, 09:07 |
Сообщение № 4

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Макросы включены?


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Гость

Дата: Среда, 12.11.2014, 09:35 |
Сообщение № 5

да, для меня не понятно алгоритм их работы
я сделал точно такой же скопировав эти формулы и макросы, но увы в моем примере все это не работаеть…

 

Ответить

Pelena

Дата: Среда, 12.11.2014, 09:37 |
Сообщение № 6

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Ну, так выложите свой пример, где не работает. Здесь же не Битва экстрасенсов!


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

PYCTAM

Дата: Четверг, 13.11.2014, 09:58 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
60% ±


Excel 2010

С «корзиной» как то разобрался, но с условным форматированием как то не заладилось…
Хочется как в первом примере при двойном щелчке вся нужная часть этой строки выделялось

Конечно я мог сделать веником (формат по образцу), но у меня все делает макрос и перед открытием листа стоить код [vba]

Код

Activesheet.Cells.Clear

[/vba]….

Сообщение отредактировал PYCTAMЧетверг, 13.11.2014, 10:02

 

Ответить

ShAM

Дата: Четверг, 13.11.2014, 11:58 |
Сообщение № 8

Группа: Друзья

Ранг: Старожил

Сообщений: 1347


Репутация:

249

±

Замечаний:
0% ±


Excel 2010

но у меня все делает макрос

Видимо по дороге потерялся.

перед открытием листа стоить код
[vba]

Код

Activesheet.Cells.Clear

[/vba]

Может, написать:
[vba]

Код

Activesheet.Cells.ClearContents

[/vba]

Сообщение отредактировал ShAMЧетверг, 13.11.2014, 11:59

 

Ответить

Библиотека разработок

Документооборот 76
Наука/образование 30
Бухгалтерский учет. Финансы 63
Обработка и хранение данных 49
Решения для бизнеса 65
Игры и развлечения, анализ и тестирование 5
Домашние дела 10
Культура, спорт, здоровье 6
Инструменты для разработчика 48

Конкурс

Разработчикам

Документооборот → Работа с электронной почтой и Интернет

Анатолий Ефимочкин

01.06.06

PC Magazine: It works!

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

Данная разработка позволяет очень легко дополнять ваш прайс-лист функцией «Корзина» не прибегая к программированию. Не использует макросов, поэтому вы смело можете рассылать прайс-лист вместе с корзиной вашим покупателям.
Вы можете легко изменять количество строк и столбцов корзины. Поэтому корзину можно использовать и для других целей, отбирая записи из списка в произвольном порядке.


Исходный код: доступен
Способ распространения: бесплатно

СкачатьKorzina_OE.zip
39 КБ

Журнал PC Magazine/REРейтинг разработки: 4

PC Magazine/RE:
Данная разработка представляет собой документ Excel, при вставке в который дополнительного листа содержащего прайс-лист у пользователя появляется возможность размещать выбранный товар в необходимом количестве в корзину аналогичную применяемым, например в Интернет-магазинах. При наличии даже минимального опыта работы с Excel, во всех необходимых настройках можно разобраться буквально за пару минут и оснастить «корзиной» любой прайс-лист.

Информация продать офисную мебель бу в москве быстро здесь. Кровля пвх мембрана москва полимерные пвх мембраны для кровли.

Копирование материалов разрешается только при наличии ссылки на сайт offext.ru © 2006–2023

Задача: 

Нестандартное применение парсера — автоматическое добавление товаров в корзину поставщика по списку в Экселе с учетом цвета, размера и наличия товара.

Описание: 

ВНИМАНИЕ!!! ДЛЯ РАБОТЫ ПАРСЕРА НЕОБХОДИМО СКАЧАТЬ ОБА ФАЙЛА!

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

Когда объемы заказов большие и происходят регулярно, целесообразно отдать эту операцию на выполнение парсеру.

Данная настройка проходит по специально подготовленному списку в Эксель. Сначала она находит товар на сайте поставщика (kotikof.ru), потом определяет наличие цвета и нужного размера. Если товар не найден или нет нужного цвета/размера в наличии, то парсер ставит соответствующую метку напротив товарной позиции. Если всё подходит, то отправляется запрос через Internet Explorer на добавление товара в корзину в нужном количестве.

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

После окончания работы парсера открывается окно Internet Explorer со страницей корзины. Обычно для работы с корзиной требуются учетные данные — логин/пароль, но сайт kotikof поддерживает работу без них.

По аналогии с данной настройкой могут быть написаны настройки для добавления товаров в корзину на других сайтах.

Для приобретения полной версии настройки этого парсера, обращайтесь на почту, с указанием ссылки на эту статью.

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

Надо что бы с листа Прайс, были выбраны только те позиции, который закажет клиент из столбца Заказ. И перенесены на новую страницу, где будет уже указана суммарная стоимость заказа, и отдельно сумма всех заказанных позиций (это вроде работает, но ещё не доехал до них) Не могу понять в чём косяк, нашёл файл пытался под себя сделать. Запутался.  

 

Kuzmich

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

Сообщений: 7998
Регистрация: 21.12.2012

#2

21.11.2017 09:20:30

Цитата
Потерялся в макросе

А где макрос-то?
На листе Заказ что должно подтягиваться в столбец Заказ?

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

только выбранные позиции с листа прайс
Я подумал проще будет скинуть файл)

 

The_Prist

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

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#4

21.11.2017 09:26:12

Цитата
kehrypy написал:
Я подумал проще будет скинуть файл

проще. А теперь откройте файл и найдите там макрос :) У Вас файл .xlsx — а они не могут хранить макросы. Чтобы макросы сохранились в файле надо сохранять в формате «Книга с поддержкой макросов(.xlsm)»

И главное: ознакомьтесь с правилами: сейчас название тема не отражает суть задачи. А значит тема — кандидат как минимум на закрытие. Предложите в новом сообщении название темы, согласно правил. Модераторы придут и изменят.

Изменено: The_Prist21.11.2017 09:27:07

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

#5

21.11.2017 09:28:21

Код
Sub test()
Dim rng As Range, mass(), wsh As Worksheet, flag As Boolean, wName As String, i As Long, RowsNumber As Long
Dim TotalSum As Currency

Application.ScreenUpdating = False

wName = "Заказ"
For Each wsh In ActiveWorkbook.Worksheets
    If wsh.Name = wName Then
        flag = True
    End If
Next wsh


If flag Then
    ActiveWorkbook.Worksheets(wName).UsedRange.Clear
Else
    Set wsh = ActiveWorkbook.Sheets.Add(, Worksheets("Прайс"))
    wsh.Name = wName
End If


Set wsh = Worksheets(wName)
wsh.Range("A1").Value = "Группа"
wsh.Range("B1").Value = "Артикул"
wsh.Range("C1").Value = "Наименование"
wsh.Range("D1").Value = "Производство"
wsh.Range("E1").Value = "Цена"
wsh.Range("F1").Value = "Заказ"

Set rng = Worksheets("Прайс").Range("A3").Resize(Worksheets("Прайс").Range("A3").CurrentRegion.Rows.Count, 6)
mass() = rng.Value

For i = 1 To UBound(mass, 1)
    If IsNumeric(mass(i, 6)) And Not IsEmpty(mass(i, 6)) And mass(i, 6) <> 0 Then
        RowsNumber = wsh.UsedRange.Rows.Count
        wsh.Range("A1").Offset(RowsNumber, 0).Value = mass(i, 1)
        wsh.Range("B1").Offset(RowsNumber, 0).Value = mass(i, 2)
        wsh.Range("C1").Offset(RowsNumber, 0).Value = mass(i, 3)
        wsh.Range("D1").Offset(RowsNumber, 0).Value = mass(i, 4)
        wsh.Range("E1").Offset(RowsNumber, 0).Value = mass(i, 6)
        wsh.Range("F1").Offset(RowsNumber, 0).Value = mass(i, 5) * mass(i, 6)
        TotalSum = TotalSum + mass(i, 5) * mass(i, 6)
    End If
Next i

wsh.UsedRange.Borders.LineStyle = xlContinuous
wsh.UsedRange.Borders.Weight = xlThin
wsh.Columns("A:D").EntireColumn.AutoFit

wsh.Range("A1").Offset(RowsNumber + 1, 0).Resize(1, 6).Borders(xlEdgeBottom).LineStyle = xlContinuous

wsh.Range("A1").Offset(RowsNumber + 3, 0).Value = "Итого:"
wsh.Range("D1").Offset(RowsNumber + 3, 0).Value = TotalSum

wsh.Columns("A:D").EntireColumn.AutoFit

wsh.Activate

Application.ScreenUpdating = True


End Sub

Изменено: kehrypy21.11.2017 10:56:00

 
 

Kuzmich

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

Сообщений: 7998
Регистрация: 21.12.2012

#7

21.11.2017 09:34:18

Можно тему назвать:
Формирование заказа на основе выделенных позиций в прайсе

Цитата
только выбранные позиции с листа прайс
Код
Sub Tablica()
Dim i As Long
Dim iLastRow As Long
Dim iLR As Long
 iLastRow = Cells(Rows.Count, "A").End(xlUp).Row
 With Worksheets("Заказ")
  iLR = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
  .Range("A2:F" & iLR).ClearContents
   For i = 10 To iLastRow
     If Not IsEmpty(Cells(i, "G")) Then
       iLR = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
       Range("A" & i & ":E" & i).Copy .Cells(iLR, "A")
     End If
   Next
       iLR = .Cells(.Rows.Count, "A").End(xlUp).Row
       .Cells(iLR + 2, "A") = "Итого:"
       .Cells(iLR + 2, "E") = WorksheetFunction.Sum(.Range(.Cells(2, "E"), .Cells(iLR, "E")))
       .Activate
 End With
End Sub
 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

#8

21.11.2017 09:42:13

Цитата
Казанский написал:
Да еще и кросс, похоже

там посоветовали обратиться сюда

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

Kuzmich, в область заказа не попадают выбранное количество позиций с листа прайса. Цена которая стоит должна быть уже суммой этого количества выбранного покупателем:(
извините что я может как то не точно выражаюсь, пока что

 

Kuzmich

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

Сообщений: 7998
Регистрация: 21.12.2012

#10

21.11.2017 10:04:31

Цитата
В область заказа не попадают выбранное количество позиций с листа прайса

Попробуйте дописать сами в макрос это действие.
Я вас спрашивал о том, что должно быть в столбце Заказ.

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

А как сделать что бы в столбце заказ было конкретно количество ( тоесть в листе прайс я выбрал эту позицию 1, следующую три, и он показывал в листе заказа что я выбрал три, а чего один) а столб цена был равен количеству одной цены за штуку на количество заказа. не грамотен я маленько в этом, вот и прошу помочь = извините уж за тупость, я пока ещё тут не грамотен

Изменено: kehrypy21.11.2017 10:56:56

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

kehrypy, не нужно цитировать без необходимости — кнопка цитирования не для ответа!
А код следует оформлять соответствующим тегом. Ищите такую кнопку и исправьте свой #6.

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

Исправил.
Ребят, подскажите как все ж сделать? Не шарю я в макросах, так, поискал инфу с интернета и вышел на Вас

Изменено: kehrypy21.11.2017 11:39:38

 

Kuzmich

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

Сообщений: 7998
Регистрация: 21.12.2012

#14

21.11.2017 11:49:53

Цитата
а столб цена был равен количеству одной цены за штуку на количество заказа

У вас на листе Прайс есть столбец Кол-во. Его как учитывать?

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

Кнопка цитирования не для ответа [МОДЕРАТОР]

Его вообще не учитывать. Это для меня инфо. мб и не будет столбца такого

 

Kuzmich

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

Сообщений: 7998
Регистрация: 21.12.2012

#16

21.11.2017 11:59:28

Добавьте в цикл строки

Код
   For i = 10 To iLastRow
     If Not IsEmpty(Cells(i, "G")) Then
       iLR = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
       Range("A" & i & ":D" & i).Copy .Cells(iLR, "A")
       .Cells(iLR, "E") = Cells(i, "E") * Cells(i, "G")
       .Cells(iLR, "F") = Cells(i, "G")
     End If
   Next
 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

Спасибо большое! вроде всё как хотел) буду обращаться как возникнут трудности :D

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

А как сделать что бы строка 4000+ тоже была выбрана при нажатии кнопки заказ?
И таблица чего-то не вся отображается, теряются порой строки и прочее..в чем может быть проблем

 

Kuzmich

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

Сообщений: 7998
Регистрация: 21.12.2012

#19

21.11.2017 15:10:15

Цитата
теряются порой строки и прочее..в чем может быть проблем

Приведите пример

Цитата
строка 4000+

Что за строка?

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

Вместо того, чтобы написать «Строка 4775» прикрепили скрин )) Что он даёт?

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

При нажатии кнопки заказа, строки ниже четырёх тысяч не попадают почему то под результат

 

Hugo

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

Сообщений: 23257
Регистрация: 22.12.2012

Не почему то, а потому что последняя строка определяется по другому столбцу, измените на D или E, смотря какие там обычно файлы. Или определяйте сразу по нескольким столбцам (хоть 10), берите максимальное значение.

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

#23

22.11.2017 09:24:10

Цитата
Hugo написал:
измените на D или E

это где мне поменять? Простите за неграмотность

 

Kuzmich

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

Сообщений: 7998
Регистрация: 21.12.2012

#24

22.11.2017 12:21:57

kehrypy, написал

Цитата
это где мне поменять?

В коде последняя строка на листе Прайс определяется по столбцу А строкой

Код
iLastRow = Cells(Rows.Count, "A").End(xlUp).Row

Из скрина экрана в сообщении #20 у вас в столбце А нет значений, определяйте
последнюю строку по столбцу D или E

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

После нажатия кнопки заказа отображалось что бы количество заказа ещё (теперь понадобилось)

Прикрепленные файлы

  • пример.xlsm (23.48 КБ)

 

Kuzmich

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

Сообщений: 7998
Регистрация: 21.12.2012

#26

12.02.2018 18:00:25

Цитата
отображалось что бы количество заказа ещё (теперь понадобилось)
Код
Sub Tablica()
Dim i As Long
Dim iLastRow As Long
Dim iLR As Long
 iLastRow = Cells(Rows.Count, "A").End(xlUp).Row
 With Worksheets("Заказ")
  iLR = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
  .Range("A2:F" & iLR).ClearContents
   Range("A9:F9").Copy .Cells(1, "A")     'копирование шапки
   For i = 10 To iLastRow
     If Not IsEmpty(Cells(i, "G")) Then
       iLR = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
       Range("A" & i & ":F" & i).Copy .Cells(iLR, "A")
     End If
   Next
       iLR = .Cells(.Rows.Count, "A").End(xlUp).Row
       .Cells(iLR + 2, "A") = "Итого:"
       .Cells(iLR + 2, "E") = WorksheetFunction.Sum(.Range(.Cells(2, "E"), .Cells(iLR, "E")))
       .Cells(iLR + 2, "E").NumberFormat = "#,##0.00"
       .Activate
 End With
End Sub
 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

#27

13.02.2018 07:36:09

Спасибо, помог Ваш макрос, ещё там добавил что бы строка заказа была указана

Код
Range("A2:G" & iLR).ClearContents
   Range("A9:G9").Copy .Cells(1, "A")     '??????????? ?????
   For i = 10 To iLastRow
     If Not IsEmpty(Cells(i, "G")) Then
       iLR = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
       Range("A" & i & ":G" & i).Copy .Cells(iLR, "A")

Изменено: kehrypy13.02.2018 09:24:49

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

А как ещё сделать итоговую сумму всех этих товаров на листе заказа? Следуя из количества и цены

Изменено: kehrypy13.02.2018 09:46:13

 

Добрый день!

С помощью обычной Сводной таблицы (PivotTable) и 2-ч мааааленьких макросов.

Изменено: Михаил Лебедев13.02.2018 09:56:07

Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/

 

kehrypy

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

Сообщений: 24
Регистрация: 21.11.2017

#30

13.02.2018 10:15:52

С помощью сводной таблицы у Вас сумма по цене не сходится, а в макросе сразу вписать что бы расчёт был не выйдет?

06.07.2019

Добавление товаров в корзину из Excel прайса

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

Основная идея в том, чтобы дать скачать пользователю прайс с товарами, в котором будет проставлено необходимое количество товара для покупки.
После этого пользователь загружает такой прайс обратно на сайт, и скрипт добавляет товары из прайса в корзину.

Я реализовал это в виде компонента gricuk:basket.from.file. Дальше приведу код:

class.php

<?php

use BitrixMainApplication;
use BitrixMainLoader;
use BitrixSale;
use BitrixMainSystemException;

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();

class BasketFromFile extends CBitrixComponent
{

    public function onPrepareComponentParams($arParams)
    {
        BitrixMainLoader::includeModule("iblock");
        BitrixMainLoader::includeModule("catalog");
        BitrixMainLoader::includeModule("sale");


        return $arParams;
    }

    public function executeComponent()
    {
        $request = Application::getInstance()->getContext()->getRequest();
        $this->arResult["ACTION"] = $request->get("action");
        if ($this->arResult["ACTION"] == "download") {
            $this->downloadPriceForCurrentUser();
        }

        if ($this->arResult["ACTION"] == "addToBasket") {
            $this->addFromFile();
        }

        $this->includeComponentTemplate();
    }

    public function addFromFile()
    {
        global $USER;

        $dbProducts = BitrixCatalogProductTable::getList([
            "select" => [
                "NAME" => "IBLOCK_ELEMENT.NAME",
                "*"
            ],
            "filter" => [
                "IBLOCK_ELEMENT.ACTIVE" => "Y"
            ],
        ]);
        $existProducts = [];
        foreach ($dbProducts as $product) {
            $existProducts[$product["ID"]] = $product;
        }


        $resultArray = [["#", "Категория", "Название", "Доступно, шт", "Цена, руб", "Количество"]];

        try {
            $inputFileName = $_FILES["excelFile"]["tmp_name"];

            $reader = new PhpOfficePhpSpreadsheetReaderXlsx();
            $spreadsheet = $reader->load($inputFileName);

            $worksheet = $spreadsheet->getActiveSheet();
            $products = [];
            foreach ($worksheet->getRowIterator() as $row) {
                $cellIterator = $row->getCellIterator();
                $cellIterator->setIterateOnlyExistingCells(false);
                $cells = [];
                foreach ($cellIterator as $cell) {
                    $cells[] = $cell->getValue();
                }
                if (intval($cells[5]) > 0) {
                    $products[] = [
                        "ID" => $cells[0],
                        "QUANTITY" => $cells[5],
                    ];
                }

            }
            unset($products[0]);
            CSaleBasket::DeleteAll(CSaleBasket::GetBasketUserID());
            foreach ($products as $product) {
                if (isset($existProducts[$product["ID"]])) {
                    $addResult = $this->addProductToBasket($product["ID"], $product["QUANTITY"]);
                    if (!$addResult->isSuccess()) {
                        $this->arResult["ERRORS"][] = $addResult->getErrorMessages();

                    }
                }
            }
        } catch (Exception $e) {
            $this->arResult["ERRORS"][] = $e->getMessage();
        }

    }

    public function addProductToBasket($productId, $quantity)
    {
        BitrixMainLoader::includeModule("catalog");
        $product = BitrixCatalogProductTable::getById($productId)->fetch();
        $productToAdd = [
            "PRODUCT_ID" => $productId
        ];

        if ($product["TYPE"] == BitrixCatalogProductTable::TYPE_OFFER) {
            $parentProduct = CCatalogSku::GetProductInfo($productId);
            $productProperties = CIBlockPriceTools::GetOfferProperties(
                $productId,
                $parentProduct["IBLOCK_ID"],
                [
                    "VOLUME"
                ],
                []
            );
            if (!empty($productProperties)) {
                $productToAdd["PROPS"] = $productProperties;
            }
        }

        return BitrixCatalogProductBasket::addProduct(
            $productToAdd,
            [
                "QUANTITY" => $quantity
            ]
        );
    }

    public function downloadPriceForCurrentUser()
    {
        global $USER;

        $dbProducts = BitrixCatalogProductTable::getList([
            "select" => [
                "NAME" => "IBLOCK_ELEMENT.NAME",
                "SECTION_ID" => "IBLOCK_ELEMENT.IBLOCK_SECTION_ID",
                "SECTION_NAME" => "IBLOCK_ELEMENT.IBLOCK_SECTION.NAME",
                "*"
            ],
            "filter" => [
                "IBLOCK_ELEMENT.ACTIVE" => "Y",
                "IBLOCK_ELEMENT.IBLOCK_ID" => [
                    GricukMainConf::ID_IBLOCK_CATALOG,
                    GricukMainConf::ID_IBLOCK_OFFERS,
                ],
                [
                    "LOGIC" => "OR",
                    [
                        "!TYPE" => BitrixCatalogProductTable::TYPE_SKU,
                        ">QUANTITY" => 0,
                    ],
                    [
                        "TYPE" => BitrixCatalogProductTable::TYPE_SKU,
                    ]
                ]
            ],
            "order" => [
                "IBLOCK_ELEMENT.IBLOCK_SECTION.LEFT_MARGIN",
                "IBLOCK_ELEMENT.SORT",
                "IBLOCK_ELEMENT.ID",
            ]
        ]);
        $products = [];
        $skuProducts = [];
        foreach ($dbProducts as $product) {
            if ($product["TYPE"] != BitrixCatalogProductTable::TYPE_SKU) {
                $product["PRICE"] = CCatalogProduct::GetOptimalPrice($product["ID"]);
            } else {
                $skuProducts[$product["ID"]] = $product["ID"];
            }

            $products[$product["ID"]] = $product;
        }

        $skuOffersMap = CCatalogSku::getOffersList(array_keys($skuProducts));

        foreach ($skuOffersMap as $skuId => $offers) {
            foreach ($offers as $offerId => $offer) {
                if (isset($products[$skuId]) && isset($products[$offerId])) {
                    $products[$skuId]["OFFERS"][$offerId] = $products[$offerId];
                    unset($products[$offerId]);
                }
            }
        }

        $resultArray = [["#", "Категория", "Название", "Доступно, шт", "Цена, руб", "Количество"]];

        foreach ($products as $product) {
            if ($product["TYPE"] == BitrixCatalogProductTable::TYPE_OFFER) {
                continue;
            }

            if ($product["TYPE"] != BitrixCatalogProductTable::TYPE_SKU) {
                $resultArray[] = [
                    $product["ID"],
                    $product["SECTION_NAME"],
                    $product["NAME"],
                    $product["QUANTITY"],
                    $product["PRICE"]["RESULT_PRICE"]["DISCOUNT_PRICE"],
                    ""
                ];
            }

            if (isset($product["OFFERS"])) {
                foreach ($product["OFFERS"] as $offer) {
                    $resultArray[] = [
                        $offer["ID"],
                        $product["SECTION_NAME"],
                        $offer["NAME"],
                        $offer["QUANTITY"],
                        $offer["PRICE"]["RESULT_PRICE"]["DISCOUNT_PRICE"],
                        ""
                    ];
                }
            }
        }


        $spreadsheet = new PhpOfficePhpSpreadsheetSpreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->fromArray($resultArray);
        $sheet->getColumnDimension('A')->setWidth(10);//#
        $sheet->getColumnDimension('B')->setWidth(35);//Категория
        $sheet->getColumnDimension('C')->setWidth(62);//Название
        $sheet->getColumnDimension('D')->setWidth(14);//Доступно, шт
        $sheet->getColumnDimension('E')->setWidth(14);//Цена, руб
        $sheet->getColumnDimension('F')->setWidth(14);//Количество


        $writer = new PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);
        $filePath = BitrixMainApplication::getDocumentRoot() . "/upload/tmp/price-{$USER->GetID()}.xlsx";

        $writer->save($filePath);

        GricukUtilsHelpers::file_force_download($filePath);
        die();
    }
}

template.php

<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
/** @var array $arParams */
/** @var array $arResult */
/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
/** @var string $templateName */
/** @var string $templateFile */
/** @var string $templateFolder */
/** @var string $componentPath */
/** @var CBitrixComponent $component */
$this->setFrameMode(true);
?>
<div class="row">
    <div class="col-sm-12">
        Для того чтобы добавить товары в корзину с помощью Excell прайса необходимо:
        <ul>
            <li>Скачать пример прайса, нажав кнопку <b>"Скачать шаблон"</b></li>
            <li>В полученном xlsx файле ввести необходимое количество товара в колонку <b>"Количество"</b></li>
            <li>Сохранить файл</li>
            <li>На данной странице нажать кнопку <b>"Выберите файл"</b>. В открывшемся окне, указать файл, который был
                ранее сохранен
            </li>
            <li>На странице сайта нажать на кноку <b>"Добавить в корзину"</b></li>
        </ul>
        <h4><b>Внимание!</b> Цены в файле не окончательные! При добавлении в корзину они могут измениться.</h4>
        <h4><b>Внимание!</b> Всё что уже есть в корзине будет удалено!</h4>
    </div>
    <div class="col-sm-12">
        <form action="<?= POST_FORM_ACTION_URI ?>" method="POST" enctype="multipart/form-data">
            <input type="hidden" name="action" value="addToBasket">
            <div class="form-group">
                <label for="excel-price">Файл Excel</label>
                <input type="file" id="excel-price" class="form-control" name="excelFile" required>
            </div>
            <div class="form-group">
                <a href="?action=download" class="btn btn-link">Скачать шаблон</a>
                <button class="btn btn-default">Добавить в корзину</button>
            </div>
        </form>
    </div>
    <? if ($arResult["ACTION"] == "addToBasket" && empty($arResult["ERRORS"])): ?>
        <div class="col-sm-12">
            <?
            ShowMessage(["MESSAGE" => "Товары из файла успешно добавлены в корзину", "TYPE" => "OK"]);
            ?>
        </div>
    <? endif ?>
    <? if ($arResult["ERRORS"]): ?>
        <div class="col-sm-12">
            <?
            foreach ($arResult["ERRORS"] as $error) {
                ShowError($error);
            }
            ?>
        </div>
    <? endif ?>
</div>

Шаблон выполнен без нормального внешнего вида, так как в моем случае компонент используют менеджеры со стороны сайта. Поэтому не было каких то требований к его оформлению.
На сайте выглядит как то так:
Шаблон корзины из файла

Теперь о коде компонента. Как можно увидеть, в нем для работы с Excel используется библиотека PhpSpreadsheet’s ,
поэтому ее надо будет скачать и подключить на сайт.

Код класса можно разделить на 2 части. 1я — формирует прайс для текущего пользователя (метод downloadPriceForCurrentUser). 2я — добавляет товары в корзину из загруженного файла (методы addFromFile и addProductToBasket).

Особое внимание стоит уделить строке в методе addProductToBasket со следующим кодом:

$productProperties = CIBlockPriceTools::GetOfferProperties(
    $productId,
    $parentProduct["IBLOCK_ID"],
    [
        "VOLUME"
    ],
    []
);

В качестве 3 параметра идет массив с символьными кодами свойств торговых предложений, которые необходимо добавлять в корзину. В моем случае это объем.
В конце можно увидеть вызов GricukUtilsHelpers::file_force_download($filePath);, подробнее об этом можно почитать в статье Принудительная загрузка файла

Понравилась статья? Поделить с друзьями:
  • Прайс лист работ в excel
  • Прайс лист продуктов питания excel
  • Прайс лист парикмахерских услуг образец скачать в word
  • Прайс лист образец шаблон в word
  • Прайс excel на моем сайте