30.11.2011, 15:44 | #1 |
Участник
|
Всем, привет!
Собственно вопрос в теме: как прочитать длинный текст из Excel? В ячейке excel - текст длиной > 1024 символов. Как его правильно оттуда достать\прочитать из MAV? С самим excel я работаю через Automation Следующий код FORMAT(xlWorkSheet.Range(X+FORMAT(Y)).Text) вываливается с ошибкой: --------------------------- Microsoft Dynamics NAV Classic --------------------------- Длина текстовой строки превосходит размер буфера строки. --------------------------- OK --------------------------- Спасибо! |
|
30.11.2011, 17:06 | #2 |
Участник
|
Цитата:
Сообщение от mandrake
Всем, привет!
Собственно вопрос в теме: как прочитать длинный текст из Excel? В ячейке excel - текст длиной > 1024 символов. Как его правильно оттуда достать\прочитать из MAV? С самим excel я работаю через Automation Следующий код FORMAT(xlWorkSheet.Range(X+FORMAT(Y)).Text) вываливается с ошибкой: --------------------------- Microsoft Dynamics NAV Classic --------------------------- Длина текстовой строки превосходит размер буфера строки. --------------------------- OK --------------------------- Спасибо! Так написано в документации, т.е. по идее задача не решаема в том виде, в котором поставлена. Но. Во-первых: есть обходной путь позволяющий Наву работать с текстовыми переменными длиннее 1024 символов, копать здесь: http://forum.mazzy.ru/index.php?showtopic=1477 А во-вторых: и именно этот вариант выбрал бы я, можно предварительно разбить переменную на части длинной не более 1024 символов и читать её по частям. Разбивать можно прямо из Нава. Весь код приводить не буду, но мейнстрим подкину. В примере рассматриваю случай строки больше 1024 символов, но меньше 2048. Если строка ещё длиннее, то дальше сами доработаете алгоритм. С помощью Automation создаёте в экселе формулу, которая вычисляет длину строки =ДЛСТР(X+FORMAT(Y)) и записываете значение в переменную, назовём её strlen. Далее, с помощью Automation создаёте в экселе, где-нибудь в свободных ячейках формулы =ЗАМЕНИТЬ (X+FORMAT(Y);1025;strlen;'') //это скопирует в ячейку первые 1024 символа =ЗАМЕНИТЬ (X+FORMAT(Y);1;1024;'') //это скопирует в ячейку оставшиеся символы Ну вот собственно и всё, дальше читаете данные без проблем кусками по 1024 символа. P.S. Есть ещё третий путь. Можно написать свой Automation, который сам будет делить строку на блоки по 1024 символа и возвращать данные через переменные переданные в него по ссылке. |
|
30.11.2011, 17:42 | #3 |
Участник
|
Теоретически можно еще потоки использовать. Загонять значение аутомейшена в BLOB временной таблицы, а потом читать оттуда по нужному кол-ву символов.
|
|
30.11.2011, 17:53 | #4 |
Участник
|
Хм... как-то не подумал об этом. Это наверное будет даже правильней, проще и удобней. Надо только поэкспериментировать с загонянием значения в BLOB, теоретически могут возникнуть проблемы, хотя вроде не должны. Самому сейчас проверять лень/некогда, но если кто поделится результатом эксперимента, будет интересно.
|
|
01.12.2011, 08:23 | #5 |
Участник
|
Сохраните Excel в XML формате, а дальше выдергивайте, пример писал здесь:
http://www.mibuso.com/forum/viewtopic.php?f=23&t=43794 |
|
01.12.2011, 10:56 | #6 |
Участник
|
Цитата:
Сообщение от rmv
Сохраните Excel в XML формате, а дальше выдергивайте, пример писал здесь:
http://www.mibuso.com/forum/viewtopic.php?f=23&t=43794 |
|
01.12.2011, 10:56 | #7 |
Участник
|
С BLOB не прокатила идея.
rmv, сенкс за пример. |
|
01.12.2011, 11:57 | #8 |
Участник
|
Цитата:
Сообщение от Predatore
Цитата:
Сообщение от rmv
Сохраните Excel в XML формате, а дальше выдергивайте, пример писал здесь:
http://www.mibuso.com/forum/viewtopic.php?f=23&t=43794 |
|
01.12.2011, 12:49 | #9 |
Участник
|
В MSDN я и посмотрел описание метода substringData, а вот по поводу его поведения при попытке прочитать больше чем есть или про метод возвращающий длину строки ничего не нашёл. Может плохо искал? Потому и спросил.
|
|
01.12.2011, 13:38 | #10 |
Участник
|
Цитата:
Сообщение от Predatore
Цитата:
Сообщение от mandrake
Всем, привет!
Собственно вопрос в теме: как прочитать длинный текст из Excel? В ячейке excel - текст длиной > 1024 символов. Как его правильно оттуда достать\прочитать из MAV? С самим excel я работаю через Automation Следующий код FORMAT(xlWorkSheet.Range(X+FORMAT(Y)).Text) вываливается с ошибкой: --------------------------- Microsoft Dynamics NAV Classic --------------------------- Длина текстовой строки превосходит размер буфера строки. --------------------------- OK --------------------------- Спасибо! Так написано в документации, т.е. по идее задача не решаема в том виде, в котором поставлена. Но. Во-первых: есть обходной путь позволяющий Наву работать с текстовыми переменными длиннее 1024 символов, копать здесь: http://forum.mazzy.ru/index.php?showtopic=1477 А во-вторых: и именно этот вариант выбрал бы я, можно предварительно разбить переменную на части длинной не более 1024 символов и читать её по частям. Разбивать можно прямо из Нава. Весь код приводить не буду, но мейнстрим подкину. В примере рассматриваю случай строки больше 1024 символов, но меньше 2048. Если строка ещё длиннее, то дальше сами доработаете алгоритм. С помощью Automation создаёте в экселе формулу, которая вычисляет длину строки =ДЛСТР(X+FORMAT(Y)) и записываете значение в переменную, назовём её strlen. Далее, с помощью Automation создаёте в экселе, где-нибудь в свободных ячейках формулы =ЗАМЕНИТЬ (X+FORMAT(Y);1025;strlen;'') //это скопирует в ячейку первые 1024 символа =ЗАМЕНИТЬ (X+FORMAT(Y);1;1024;'') //это скопирует в ячейку оставшиеся символы Ну вот собственно и всё, дальше читаете данные без проблем кусками по 1024 символа. P.S. Есть ещё третий путь. Можно написать свой Automation, который сам будет делить строку на блоки по 1024 символа и возвращать данные через переменные переданные в него по ссылке. |
|
16.01.2012, 19:37 | #11 |
Участник
|
у XmlDomTextNode есть св-во text, у которого есть св-во Length, которое вернет длинну строки. Дальше уже substringData считываем данные с контролем длинны.
|
|