Добрый день, коллеги.

Пытаюсь решить одну проблему и столкнулся со странным поведением системы.

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

Код примерно такой:

var ExlApp = new ActiveXObject("Excel.Application");
var WorkBook = ExlApp.Workbooks.Open(FileName);
var Sheet = WorkBook.Sheets(1);
var BankData = Sheet.UsedRange.Value;
// Вот здесь BankData и есть тот самый массив, но обратится к нему проблематично
// var Value = BankData[2][2] выдает ошибку о том что объект есть null или не является объектом
// да и BankData имеет тип Unknown. Хотя в студии его структура видна и данные как бы есть.

WorkBook.Close(false);
ExlApp.Quit();
delete ExlApp;

Возможно этот псевдомассив можно как-то в javascript сконвертировать в нормальный.
Буду благодарен, если найдется решение.

Нравится

2 комментария

Добрый день!
Это не мессив. В MSDN есть вся информация.
Sheet.UsedRange возвращает тип Range
Здесь все об этом типе
Такие вещи очень хорошо поискать снача в MSDN, а после можно найти решение на Stackoverflow

Я не писал что Sheet.UsedRange это массив.
А вот Sheet.UsedRange.Value возвращает массив, с которым чудесно можно работать в Delphi например.
Быстрая обработка данных Excel в Delphi
Благодарю за ссылку на MSDN :)

Показать все комментарии

Возможно, не новый вопрос ]||||||[, но никак не удается передать внутри БП массив с ID-шниками как параметр.
Заполняется массив в одном скрипте, использовать надо в другом элементе-скрипте. Пытаюсь создать параметр с типом Объект (Entity) так ругается при попытке передачи туда массива.
Очень не хочется пользоваться строкой неограниченной длины с парсингом ее по необходимости... некрасиво это и если ID-шников много не факт что работать будет корректно.
Подскажите, какой тип параметра БП использовать и как туда закинуть массив?

Нравится

15 комментариев

Здравствуйте.
Есть специальный тип - массив:

На самый крайний случай, можно записать в атрибут глобального объекта Connector:

Connectror.Attributes('myArray') = myArray;
var myArrayNew = Connectror.Attributes('myArray'); 

"Олейник Дмитрий" написал:Здравствуйте.

Форум BPMonline 5.x

Саша, спасибо.

Александр, для BPM создайте параметр, и не меняйте его тип. Он по умолчанию создается как Object (внимание не как Object (Entity) - это другой тип данных). При этом, если Вы изменили тип - в списке Вы его уже не найдете.

А если ничего не менять, то такой код работает:

string[] strArr = new string[10];
array = strArr;

Где array - параметр с типом Object.

"Олейник Дмитрий" написал:Александр, для BPM создайте параметр, и не меняйте его тип. Он по умолчанию создается как Object (внимание не как Object (Entity) - это другой тип данных).

Значит, не показалось мне что оно сработало ровно один раз пока я не стал менять тип и перекомпилировал систему...
Дмитрий, ну это же не правильно как-то :smile:
Может разработчикам запрос на изменение с любым пусть низким приоритетом создать чтобы в список тот "просто объект" добавить для 5ки?

Александр, вопрос передал.

"Олейник Дмитрий" написал:Александр, вопрос передал.

Дмитрий, спасибо!

И вновь продолжается бой...
Передал я массив в параметр.
Пытаюсь к нему обратиться в другом элементе.
Вот так, например:

foreach (var i in SomeParameterArray.Length) {

где SomeParameterArray и есть параметр бп с типом объект...
и ругается оно, и не компилируется
'object' doesn't contain definition for 'Length' and no extension method 'Length' ...

Поэтому теперь надо разбираться, как же к этому переданному массиву обратиться... :sad:

Александр, во-первых, цикл foreach должен выглядеть так:

foreach (var i in SomeParameterArray) {

А в данном случае, скорее всего это не сработает и нужно приведение типов:

string[] strArr = new string[100];
ArrayParam = strArr;
IEnumerable<string> enumerable = ArrayParam as IEnumerable<string>;
foreach (var s in enumerable)
{
//своя логика
}

"Андрей Каспаревич" написал:Александр, во-первых, цикл foreach должен выглядеть так:
foreach (var i in SomeParameterArray) {

Ошибся :redface:

Сейчас еще поэкспериментирую

"Олейник Дмитрий" написал:Вопрос передал.

Дмитрий, а есть ли какиенибудь результаты? Тоже столкнулись с такой проблеммой.

Илья, в каком смысле? Всё работает и сейчас - создаете объект с типом Object, затем записываете в него массив.
При обращении, не забудьте привести тип Object к Array.

"Олейник Дмитрий" написал:Александр, для BPM создайте параметр, и не меняйте его тип. Он по умолчанию создается как Object (внимание не как Object (Entity) - это другой тип данных). При этом, если Вы изменили тип - в списке Вы его уже не найдете.

Я так понимаю Илья Т. пишет именно об этом, что нельзя данный тип назначить повторно, что есть баг

Тут я согласен, хоть, согласитесь, он и не критичен.

Создали действие процесса, а в нем параметр и по умолчанию создается тип String, создать параметр с типом Object невозможно.

"Олейник Дмитрий" написал:он и не критичен

Согласен :smile:
"Илья Т." написал:Создали действие процесса, а в нем параметр и по умолчанию создается тип String, создать параметр с типом Object невозможно.

В режиме редактирования метаданных поменяйте тип параметра "DataValueType" на "84ed6865-9692-4c98-aaed-4d15b96a95c2" ручками и затем сохраните и опубликуйте

Ручками и так поменяли. Но это не правильно. Так можно сказать, а зачем нужен редактор? Пишите метаданные в блокноте.

Показать все комментарии