Содержание
- Ваш браузер устарел, пожалуйста обновите ваш браузер пройдя по ссылке www.microsoft.com/download
- [MXL to XLS]
- Почему не получается использовать ТабличныйДокумент для работы с Excel?
- Проблема при сохранении табличного документа в файл xlsx
- Проблема при загрузке табличного документа из файла xlsx
- Ньюансы (различия) чтения методом OLE и ТабДок
- Проблема при выводе из 1С в Excel
- Почему не получается использовать ТабличныйДокумент для работы с Excel?
- Проблема при сохранении табличного документа в файл xlsx
- Проблема при загрузке табличного документа из файла xlsx
- Ньюансы (различия) чтения методом OLE и ТабДок
Ваш браузер устарел, пожалуйста обновите ваш браузер пройдя по ссылке www.microsoft.com/download
[MXL to XLS]
Решаем две существующие проблемы 1С:Предприятия:
* медленное сохранение табличных документов в формате Microsoft Excel.
* некачественное сохранение табличных документов в формате Microsoft Excel.
Проблема 1: Медленное сохранение.
=================================
Суть состоит в том, что время, которое нужно 1С для сохранения, резко возрастает при увеличении объема сохраняемого документа. Если небольшие документы объемом до 1-2 тыс. строк 1С сохраняет еще за приемлемое время, то документы объемом выше 10 тыс. строк могут сохраняться несколько часов (или даже суток).
Проблема 2: Некачественное сохранение.
======================================
Штатный конвертер 1С не отличается высоким качеством. Например, конвертер не поддерживает текст в ячейках длиной более 255 символов: при сохранении более длинный текст будет усекаться. Также не поддерживаются ячейки с поворотом текста, часто ячейки с многострочным текстом имеют высоту в одну строку, часто не переносятся многострочные объединения ячеек и другое. Подробнее можно посмотреть на этой странице: http://yoksel.net.ru/ProblemyStandartnogoMxl2Xls
Данная обработка решает эти проблемы.
Скоростные характеристики.
==========================
Отчет «Анализ продаж», 18 тыс. строк: 4,46 сек.
Отчет «Анализ продаж», 78 тыс. строк: 17,23 сек.
Отчет «Анализ продаж», 184 тыс. строк: 24,44 сек.
(Для таблиц объемом больше 65536 строк сохраняется только 65536 строк — поэтому разница между временем 78 тыс. и 184 тыс. строк невелика)
Тестовая таблица 10 тыс. строк x 256 столбцов (2,5 млн. ячеек): 57,32 сек.
Для ускорения сохранения часто используется решение, известное под названием «патч Ромикса». Решение связано с модификацией кода 1С (патчем).
Отсюда вытекают основные проблемы решения:
— Проблемы при смене релиза 1С — при изменении релиза патч может перестать работать или вообще приведет к нестабильной работе 1С (аварийные завершения и возможность потери данных).
— Потенциальная ненадежность: т.к. исходных кодов 1С в открытом доступе нет, то и нет стопроцентной уверенности в корректности произведенной модификации.
Используемая в данной обработке внешняя компонента Йоксель не производит каких-либо модификаций исполняемого кода 1С, поэтому в ней отсутствуют указанные выше проблемы.
Другая проблема патча — «все равно медленно». В случае использования табличных документов со сложным форматирование сохранение все равно производится достаточно медленно. Компонента Йоксель сохраняет таблицы со сложным форматирование быстро.
Для решения проблем некачественного сохранения табличных документов в Excel часто применяют различные обработки, которые работает с Excel по технологии OLE-Automation и либо выполняют конвертирование документов полностью самостоятельно, либо сначала конвертируют документ стандартным конвертером, а потом исправляют допущенные конвертером ошибки.
Основной недостаток подобного решения: медленно. Обработки написаны на встроенном языке 1С:Предприятия и, значит, работают медленно, т.к. программный код интерпретируется. Далее, тормоза вносит использование OLE-Automation — данная технология никогда не предназначалась для обмена большими объемами данных.
Другой недостаток: необходимость наличия Excel. В связи с ужесточением ситуации с нелицензионным ПО, предприятия часто отказываются от использования Microsoft Office и переходят на свободное программное обеспечение (OpenOffice). Поэтому Excel может и отсутствовать. Также бывают ситуации, когда наличие Excel на компьютере нежелательно — например, в случае терминального сервера.
Компонента Йоксель не требует наличия Excel, поэтому может использоваться там, где Excel отсутствует. Также Йоксель написан на компилируемом языке — поэтому работает быстро.
Установка
=========
Для установки нужно следующее:
1) Если у вас еще не установлена FormEx или 1С++ версии 2.0, скопируйте компоненту FormEx (файл FormEx.dll) в каталог с программными файлами 1С (например, в каталог C:/Program Files/1Cv77/BIN).
2) Если у вас еще не установлена компонента Йоксель, скопируйте файл «SpreadSheet.dll» в каталог с программными файлами 1С (например, в каталог C:/Program Files/1Cv77/BIN).
(если нет возможности разместить внешние компоненты в каталоге программных файлов, то можно поместить компоненты в каталог информационной базы)
3) Скопируйте файл «Быстрое сохранение mxl в xls.ert» в подкаталог «ExtForms» каталога информационной базы.
4) В «Конфигураторе» добавьте на какую-нибудь панель инструментов кнопку следующего вида:
— Объект: «Задача».
— Команда: «Задача.Выполнить».
— Подсказка и короткая подсказка: «Сохранение таблицы в Excel»
— Параметры — Формула: «ОткрытьФорму («Отчет»,,КаталогИБ () + «ExtForms/Быстрое сохранение mxl в xls.ert»)»
Использование
=============
Переключитесь на табличный документ 1С, который требуется сохранить в Excel, и нажмите на созданную в Конфигураторе кнопку. В открывшейся форме укажите, куда следует сохранить табличный документ и нажмите кнопку «Сохранить».
Источник
Одним из полезных нововведений на платформе 8.3.6 стала возможность возможность импорта содержимого из файлов в форматах XLS (Microsoft Excel 97), Microsoft Office OpenXML (Microsoft Excel 2007- 2010) и ODS (OpenDocument) в табличный документ.
На платформе 8.3.10 появилась возможность считывания данных с отдельных листов книги EXCEL.
Данная возможность доступна как в интерактивном режиме, так и из встроенного языка.
Реализована поддержка вставки из буфера обмена областей, скопированных из Microsoft Excel и OpenOffice Calc.
Реализация импорта из EXCEL на встроенном языке стала возможна в результате нововведений в функционал объекта «ТабличныйДокумент»:
Для метода «Прочитать» объекта «ТабличныйДокумент» реализован параметр «СпособЧтенияЗначений» (Новое системное перечисление «СпособЧтенияЗначенийТабличногоДокумента»). (с) Загрузка из EXCEL
Тип: СпособЧтенияЗначенийТабличногоДокумента.
Определяет, каким образом нужно интерпретировать значения, считываемые из исходного документа XLS, XLSX или ODS.
При загрузке табличного документа из формата Excel 97 — 2010 и OpenOffice Calc, в случае если в ячейке исходного документа содержалось значение типа Дата или Число, то в ячейку результирующего табличного документа это значение попадает в зависимости от значения этого параметра.
Значение по умолчанию: Текст.
Так вот. И в excel и в mxl ячейка может содержать значение и иметь формат представления. Проблема в том, что СКД при выводе значений в табличный документ выводит только представление…
Проблема при сохранении табличного документа в файл xlsx
Если в ячейке будет код номенклатуры с лидирующими нулями — при экспорте в эксель значение ячейки их обрежет,
например было «00246100» стало «246100»:
При этом в представлении всё верно…
И да, если переименовать xlsx в zip и открыть архиватором sheet1.xml — то там будет именно «246100».
Конечно, есть ещё вариант ручной установки значения ячейки таб. документа, и он работает.
На клиенте…
Но #НаСервере установка свойства СодержитЗначение приводит к очистке. И в справке про это ничего нет…
Для регламентных не годится.
Проблема при загрузке табличного документа из файла xlsx
При загрузке файла экселя, сформированного в других языках программирования, содержимое может вообще не прочитаться (если верить гуглу при поиске заголовков этого файла выдаёт Open XML SDK 2.5),
например:
В режиме предприятия (меню Файл — Открыть) это пустой таб. документ
с 1026 столбца…
Хотя в экселе файл открывается прекрасно:
Ньюансы (различия) чтения методом OLE и ТабДок
Часть кода для сравнения этих методов:
Я конечно буду рад ошибаться, но, по-моему, нативные средства платформы по работе с Excel совсем далекоооооо не всегда применимы на практике.
Источник
Проблема при выводе из 1С в Excel
Добрый день!
Предыстория: необходимо было сделать так, чтобы из 1С формировался отчет Excel на нескольких листах с сохранением форматирования (главным образом, группировок) табличного документа. Стандартный метод Записать табличного документа создает файл с 1 листом. Поэтому было сделано так: сначала командой Записать создавался файл Excel с необходимым листом, потом лист переносился в нужную книгу:
ПостроительОтчета.Вывести(ТабДок);
ТабДок.Записать(ИмяВременныхФайлов, ТипФайлаТабличногоДокумента.XLS97);
Ексель.Workbooks(ИмяКнигиБуфера).Sheets(ИмяЛистаБуфера).Copy(Ексель.Workbooks(ИмяКнигиОтчета).Sheets(ТекущееИмяЛистаШаблонаЭксель));
И это дело прекрасно работает до тех пор пока не появляется еще один процесс Excel: либо запущенный интерактивно, либо в случае одновременного формирования из 2-х сеансов 1С на одном компьютере отчетов в Excel.
Собственно проблема: при наличии 2-ух одновременно запущенных экселей стока
не выполняется, выводится ошибка:
Ошибка при вызове метода контекста (Workbooks): Произошла исключительная ситуация (0x8002000b)
Подскажите, что можно сделать
Есть правда другой вариант сохранения данных вместе с форматированием (группировками) — выделить все и скопировать. Но данный вариант реализовать не удалось — бала другая ошибка «Ошибка при вызове метода контекста (Select): Произошла исключительная ситуация (Microsoft Office Excel): Метод Select из класса Range завершен неверно» (подробнее могу описать при необходимости). Поэтому был применен метод копирования листа целиком.
А собственно суть задачи сводится к следующему: необходимо иметь возможность выводить из 1С многостраничные отчеты Excel с группировками, при том, делать это параллельно, чтобы можно было одновременно формировать 2 и более отчетов.
Источник
Почему не получается использовать ТабличныйДокумент для работы с Excel?
Одним из полезных нововведений на платформе 8.3.6 стала возможность возможность импорта содержимого из файлов в форматах XLS (Microsoft Excel 97), Microsoft Office OpenXML (Microsoft Excel 2007- 2010) и ODS (OpenDocument) в табличный документ.
На платформе 8.3.10 появилась возможность считывания данных с отдельных листов книги EXCEL.
Данная возможность доступна как в интерактивном режиме, так и из встроенного языка.
Реализована поддержка вставки из буфера обмена областей, скопированных из Microsoft Excel и OpenOffice Calc.
Реализация импорта из EXCEL на встроенном языке стала возможна в результате нововведений в функционал объекта «ТабличныйДокумент»:
Для метода «Прочитать» объекта «ТабличныйДокумент» реализован параметр «СпособЧтенияЗначений» (Новое системное перечисление «СпособЧтенияЗначенийТабличногоДокумента»). (с) Загрузка из EXCEL
Тип: СпособЧтенияЗначенийТабличногоДокумента.
Определяет, каким образом нужно интерпретировать значения, считываемые из исходного документа XLS, XLSX или ODS.
При загрузке табличного документа из формата Excel 97 — 2010 и OpenOffice Calc, в случае если в ячейке исходного документа содержалось значение типа Дата или Число, то в ячейку результирующего табличного документа это значение попадает в зависимости от значения этого параметра.
Значение по умолчанию: Текст.
Так вот. И в excel и в mxl ячейка может содержать значение и иметь формат представления. Проблема в том, что СКД при выводе значений в табличный документ выводит только представление.
Проблема при сохранении табличного документа в файл xlsx
Если в ячейке будет код номенклатуры с лидирующими нулями — при экспорте в эксель значение ячейки их обрежет,
например было «00246100» стало «246100»:
При этом в представлении всё верно.
И да, если переименовать xlsx в zip и открыть архиватором sheet1.xml — то там будет именно «246100».
Конечно, есть ещё вариант ручной установки значения ячейки таб. документа, и он работает.
На клиенте.
Но #НаСервере установка свойства СодержитЗначение приводит к очистке. И в справке про это ничего нет.
Для регламентных не годится.
Проблема при загрузке табличного документа из файла xlsx
При загрузке файла экселя, сформированного в других языках программирования, содержимое может вообще не прочитаться (если верить гуглу при поиске заголовков этого файла выдаёт Open XML SDK 2.5),
например:
В режиме предприятия (меню Файл — Открыть) это пустой таб. документ
с 1026 столбца.
Хотя в экселе файл открывается прекрасно:
Ньюансы (различия) чтения методом OLE и ТабДок
Часть кода для сравнения этих методов:
Я конечно буду рад ошибаться, но, по-моему, нативные средства платформы по работе с Excel совсем далекоооооо не всегда применимы на практике.
Источник
Сохранение в экселе табличного документа с длинным текстом |
Я |
selenat
05.08.09 — 17:02
Столкнулся с проблемкой. Ячейки в табличном документе содержат длинные строки. При сохранении в эксель содержимое этих ячеек просто обрезается. Релиз платформы старый. 8.0.18.2. Вопроса два.
1.Удастся ли это победить обновлением релиза (соответсвенно до какой версии).
2.Как еще это можно победить.
Aprobator
1 — 05.08.09 — 17:03
точно обрезается? А если границы ячейки раздвинуть?
selenat
2 — 05.08.09 — 17:05
(1) раздвигаю. Обрезано.
selenat
3 — 05.08.09 — 17:12
апп
Aprobator
4 — 05.08.09 — 17:16
дык — а в макете внутри 1С если показать (вывести баличный документ) все на месте?
selenat
5 — 05.08.09 — 17:21
(4) в 1С все нормально показывается. Мало того, если сохранить в mxl и открывать из 1С, тоже все хорошо. Обрезает почему-то при сохранении в формате xls
selenat
6 — 05.08.09 — 17:30
ау
dk
7 — 05.08.09 — 17:32
где-то вроде сплывало, что режет до 256 символов
selenat
8 — 05.08.09 — 17:35
(7) да, именно так. Посчитал…
Aprobator
9 — 05.08.09 — 17:39
(8) может объединение ячеек поможет? Типа кидать длинный текст не в одну ячейку, а в объединение ячеек, как вариант.
htva
10 — 05.08.09 — 17:39
mxl круче xls тут ограничения
dk
11 — 05.08.09 — 17:40
хз, вроде перенос строк через каждые 255 символов должен помочь, хотя не помню
selenat
12 — 05.08.09 — 17:41
(9) у меня и так ячейка — объединение нескольких. Но в экселе должен быть уже готовый вариант (который сосбственно и сформирован в 1С)…
selenat
13 — 05.08.09 — 17:47
Звездец. Позвонил отцу проконсультирваться. Он говорит, что это обходится. Но для этого нужно формировать средствами языка экселевский документ через ОЛЕ-объект, при помощи бесиковских команд… о-О
selenat
14 — 05.08.09 — 17:48
(11) интересно, надо будет проверить…
Torquader
15 — 05.08.09 — 18:08
(13) просто в Excel передаются строки до 255 символов, а уже макрос в Excel собирает их, как было нужно — у меня вообще Excel «кушала» текстовый файл, по которому формировался лист.
selenat
16 — 05.08.09 — 18:34
(11) не, перенос строк не помогает.
(15) надо будет подумать над этим, спасибо.
Torquader
17 — 05.08.09 — 18:56
(16) на самом деле проблема в том, что окно передачи данных OLE — это 256 символов на строку, далее он её режет, причём даже из макросов Excel.
Вот только не помню, что будет, если использовать значение Value2, которое чем-то там отличается.
А формула в ячейке Excel никогда не может быть больше 256 символов — Microsoft никогда не умел и не научится работать с динамической памятью.
selenat
18 — 05.08.09 — 19:00
(17) свой примерчик работы через текстовый файл кинуть можешь?
Torquader
19 — 05.08.09 — 20:44
Пишется шаблон Excel, то есть документ, который будет что-то делать.
В нём есть процедура Sub Workboon_OnOpen в которой просто ищем нужный нам текстовый файл, который открываем на чтение через Scripting.FileSystemObject
и читаем по строкам:
Не забываем, что нужно создать новую книгу (или лист) — чтобы не писать в наш шаблон — посылать макросы кому-то в подарок — бессмысленно.
В начале идут определения штрифта и цветов.
Font:Номер,ИмяШтрифта,Высота,Жирность
Color:Номер,R,G,B
Border:Номер,Верх,Низ,Лево,Право,Ширина
Потом идёт описание шаблона документа
Columns:Ширина колонки,…
Теперь описываем «строки»
Line:Высота строки.
Cells:НомерЯчейки,Штрифт,Цвет,Рамка,Тип,Данные
Тип=Т просто текст, N это число,F это формула в формате RC.
Штрифт, цвет и рамка — это ссылки на описание в заголовке.
Чтение файла While File.atEndOfStream=false s=File.ReadLine() d=InStr(1,s,":") n=Left(s,d-1) s=Mid(s,d+1) if n="Line" then ' читаем высоту строки i=CLng(s) ' здесь у меня была функция проверки формата, но для скорости можно и так CurrentRow=CurrentRow+1 ' сдвигаемся на следующий ряд (не забть занулить перед работой) InputSheet.Rows(CurrentRow).Height=i ' устанавливаем высоту строки elseif n="Cells" then d=InStr(1,s,",") n=Left(s,d-1) ' номер ячейки s=Mid(s,d+1) CurCol=CLng(n) ' преобразование, как получится d=InStr(1,s,",") n=Left(s,d-1) ' штрифт s=Mid(s,d+1) CurFont=CLng(n) d=InStr(1,s,",") n=Left(s,d-1) ' цвет s=Mid(s,d+1) if n<>"-" then CurColor=GlobalColorArray(CLng(n)) else CurColor=False ' и так далее для остальных параметров with InputSheet.Cells(CurrentRow,CurCol) if CurType="T" then .Value=s elseif CurType="N" then .Value2=CDec(s) elseif CurType="F" then .FormulaR1C1=s end if .Font=GlobalFontArray(CurFont)
if CurColor<>False then .Interrior.Color=CurColor
' с Border немного сложнее, так как там надо установить флаги чёрточек и их тип в разные места (как это было сделано я сейчас не помню) end with elseif n="Fonts" then wend ' ну и так далее
Torquader
20 — 05.08.09 — 20:47
P.S. писал по памяти, но идея должна быть понятна.
Чтобы не было вопросов — Такой пример:
Sub test() s = "??????" For i = 1 To 1000 s = s & "," & CStr(i) Next i ThisWorkbook.Worksheets(1).Cells(1, 1).Value = s End Sub прекрасно "впихивает" в строку все 1000 чисел - явно более 256 символов.
Холст
21 — 05.08.09 — 20:49
может йоксель ?
selenat
22 — 05.08.09 — 21:22
(19,20) спасибо! Завтра буду разбираться…
(21) слышал про него краем уха, но не помню что за зверь…
Коллайдер
23 — 05.08.09 — 21:28
обрезка — шалости экселя….
вроде в последнем (2007 или каком там) — это ограничение сняли….
(20) как все сложно то… Проще надо быть… проще…
selenat
24 — 05.08.09 — 22:24
(23) завтра проверю
selenat
26 — 06.08.09 — 10:56
(23) таки нет. И в 2007 то же самое….
selenat
27 — 06.08.09 — 11:22
+26 кроме того, если обыкновенным копи-пастом копируешь в ячейку текст, то ничего не обрезается, весь текст сохраняется в ячейке. Так что это не приколы экселя, это уродский механизм платформы 1С по сохранению данных в экселевском формате…
selenat
28 — 06.08.09 — 11:47
Так, еще вопросик. А рисунки при сохранении табличного документа в эксель почему теряются? Эксельный файл уже без факсимилье идет. Это как-то настраивается?
MM
29 — 06.08.09 — 11:52
8.0 штатными средствами пишет в формате Эксел 95, который не поддерживает Юникод и есть ограничение на длину ячейки. В 8.1 использует более старшую версию Эксела, или можно, как было сказано ранее, исправить полученный xls файл через OLE Automation, достаточно изменить только ячейки с длинными строками.
Leksus
30 — 06.08.09 — 11:53
(0) сохраняй в формате Excel97 и все будет ок
selenat
31 — 06.08.09 — 11:56
(29) а если точнее, 8.1 не будет обрезать текст?
selenat
32 — 06.08.09 — 11:58
(30) как это практически сделать? 8.1 использует этот формат для сохранения?
Leksus
33 — 06.08.09 — 12:01
ТабличныйДокумент (SpreadsheetDocument) Записать (Write)
Синтаксис:
Записать(<Имя файла>, <Тип файла таблицы>)
Параметры:
<Имя файла> (обязательный)
Тип: Строка. Имя файла, в котором сохраняется табличный документ. <Тип файла таблицы> (необязательный) Тип: ТипФайлаТабличногоДокумента. Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL
Описание:
Записывает табличный документ в файл.
Примечание:
При работе на сервере или через com-соединение использует только файлы форматов mxl и txt.
Пример:
ТабДок.Записать(«C:My DocumentsТаблица2.mxl»);
Leksus
34 — 06.08.09 — 12:01
(32) см. параметр <Тип файла таблицы>
selenat
35 — 06.08.09 — 12:03
(33) спасибо! Сейчас попробую.
selenat
36 — 06.08.09 — 12:05
(34) увидел. Но коллекция <Тип файла таблицы> не содержит Excel97. Похоже, надо перейти на 8.1…
selenat
37 — 06.08.09 — 12:11
Насчет сохранения рисунка подскажите. По поводу (28)…
selenat
38 — 06.08.09 — 12:25
Рисунки в эксель никто не сохраняет? Ау!
selenat
39 — 06.08.09 — 12:51
Рискунки… В эксель…
selenat
40 — 06.08.09 — 15:10
апп
КонецЕсли
41 — 06.08.09 — 16:07
Из 8.0 по ОЛЕ засылаю в ячейку столько, что помещается только на 2 экранах (19 дюймов). Одной строкой. Ехель2002.
КонецЕсли
42 — 06.08.09 — 16:15
+(41) Правда тоже не всё доходит, но обрезает после многих тысяч символов
selenat
43 — 06.08.09 — 16:48
(41) по ОЛЕ — да. Можно. Уже пример надыбал. Только трудоемко…
Про рисунок кто-нить скажет чего?
Трудности загрузки/выгрузки эксельных прайсов.
Одним из полезных нововведений на платформе 8.3.6 стала возможность возможность импорта содержимого из файлов в форматах XLS (Microsoft Excel 97), Microsoft Office OpenXML (Microsoft Excel 2007- 2010) и ODS (OpenDocument) в табличный документ.
На платформе 8.3.10 появилась возможность считывания данных с отдельных листов книги EXCEL.
Данная возможность доступна как в интерактивном режиме, так и из встроенного языка.
Реализована поддержка вставки из буфера обмена областей, скопированных из Microsoft Excel и OpenOffice Calc.
Реализация импорта из EXCEL на встроенном языке стала возможна в результате нововведений в функционал объекта «ТабличныйДокумент»:
Для метода «Прочитать» объекта «ТабличныйДокумент» реализован параметр «СпособЧтенияЗначений» (Новое системное перечисление «СпособЧтенияЗначенийТабличногоДокумента»). (с) Загрузка из EXCEL
<СпособЧтенияЗначений> (необязательный)
Тип: СпособЧтенияЗначенийТабличногоДокумента.
Определяет, каким образом нужно интерпретировать значения, считываемые из исходного документа XLS, XLSX или ODS.
При загрузке табличного документа из формата Excel 97 — 2010 и OpenOffice Calc, в случае если в ячейке исходного документа содержалось значение типа Дата или Число, то в ячейку результирующего табличного документа это значение попадает в зависимости от значения этого параметра.
Значение по умолчанию: Текст.
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(тз);
Построитель.Выполнить();
Построитель.Вывести();
Так вот. И в excel и в mxl ячейка может содержать значение и иметь формат представления. Проблема в том, что СКД при выводе значений в табличный документ выводит только представление…
Проблема при сохранении табличного документа в файл xlsx
Если в ячейке будет код номенклатуры с лидирующими нулями — при экспорте в эксель значение ячейки их обрежет,
например было «00246100» стало «246100»:
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.Область(1,1).Текст = "Номенклатура";
ТабДокумент.Область(1,2).Текст = "Артикул";
ТабДокумент.Область(2,1).Текст = "NSIN0001130294";
ТабДокумент.Область(2,2).Текст = "00246100";
ИмяФайлаXLSX = ПолучитьИмяВременногоФайла("xlsx");
ТабДокумент.Записать(ИмяФайлаXLSX, ТипФайлаТабличногоДокумента.XLSX);
ЗапуститьПриложение(ИмяФайлаXLSX);
Выведет:
При этом в представлении всё верно…
И да, если переименовать xlsx в zip и открыть архиватором sheet1.xml — то там будет именно «246100».
Конечно, есть ещё вариант ручной установки значения ячейки таб. документа, и он работает.
На клиенте…
#Если ТолстыйКлиентОбычноеПриложение Тогда
// В экселе значение ячейки отличается от представления (обрезает лидирующие нули и т.п.)
Область = ТабДок.Область(1,1,ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);
Область.Защита = Ложь;
Область.СодержитЗначение = Истина;
#КонецЕсли
Но #НаСервере установка свойства СодержитЗначение приводит к очистке. И в справке про это ничего нет…
Для регламентных не годится.
Проблема при загрузке табличного документа из файла xlsx
При загрузке файла экселя, сформированного в других языках программирования, содержимое может вообще не прочитаться (если верить гуглу при поиске заголовков этого файла выдаёт Open XML SDK 2.5),
например:
ИмяФайлаXLSX = ПолучитьИмяВременногоФайла("xlsx");
Ссылка = "https://raw.githubusercontent.com/kuzyara/ConvertCSV/master/priceberg.xlsx";
КопироватьФайл(Ссылка, ИмяФайлаXLSX);
//ЗапуститьПриложение(ИмяФайлаXLSX);
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.Прочитать(ИмяФайлаXLSX, СпособЧтенияЗначенийТабличногоДокумента.Значение);
ЗаполненоЯчеек = 0;
Для НомерСтроки = 1 По ТабДокумент.ВысотаТаблицы Цикл
Для НомерСтолбца = 1 По ТабДокумент.ШиринаТаблицы Цикл
ТекЗначение = ТабДокумент.Область(НомерСтроки,НомерСтолбца).Текст;
Если НЕ ПустаяСтрока(ТекЗначение) Тогда
ЗаполненоЯчеек = ЗаполненоЯчеек + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Сообщить("Заполнено ячеек: " + ЗаполненоЯчеек);
// Выведет:
//
// Заполнено ячеек: 0
В режиме предприятия (меню Файл — Открыть) это пустой таб. документ
с 1026 столбца…
Хотя в экселе файл открывается прекрасно:
Ньюансы (различия) чтения методом OLE и ТабДок
//COM
Excel = Новый COMОбъект("Excel.Application");
Excel.Visible=0;
Excel.FileValidation = 1;
Excel.Workbooks.Open(ИмяФайла, , Истина);
Book = Excel.Workbooks(1);
Sheet = Book.Sheets(1);
МассивМассивовXLS = Sheet.UsedRange.Value.Выгрузить();
//ТАБ
ТабДокумент= Новый ТабличныйДокумент;
ТабДокумент.Прочитать(ИмяФайлаXLSX);
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДокумент.Область());
ПостроительОтчета.Выполнить();
// Результат выгружаем в таблицу значений.
ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
Часть кода для сравнения этих методов:
ИначеЕсли СтрНайти(Стр, ",") > 0 Тогда
//СтрокаCOM[КиЗ.Ключ] "0,00002" Строка
//СтрокаТАБ[КиЗ.Значение] "0,000020" Строка
// ...
ДобавитьНьюанс(Ньюансы, "Ньюанс1", СтрокаCOM[КиЗ.Ключ], СтрокаТАБ[КиЗ.Значение]);
ИначеЕсли ТолькоЦифрыВСтроке(Стр) Тогда
//СтрокаCOM[КиЗ.Ключ] "58198119" Строка
//СтрокаТАБ[КиЗ.Значение] "058198119" Строка
// ...
ДобавитьНьюанс(Ньюансы, "Ньюанс2", СтрокаCOM[КиЗ.Ключ], СтрокаТАБ[КиЗ.Значение]);
ИначеЕсли КиЗ.Значение = "Колонка4" И СтрНайти(Стр, ".") > 0 Тогда
//СтрокаCOM[КиЗ.Ключ] "835,2" Строка
//СтрокаТАБ[КиЗ.Значение] "835.2000000000001" Строка
// ...
ДобавитьНьюанс(Ньюансы, "Ньюанс3", СтрокаCOM[КиЗ.Ключ], СтрокаТАБ[КиЗ.Значение]);
ИначеЕсли СодержимоеПервых100СтрокПусто(ТабДокумент) Тогда
// если платформа не смогла прочитать и выдала пустые строки
// ...
ДобавитьНьюанс(Ньюансы, "Ньюанс4", "Пустые строки: NativeXLSX", "", Истина);
ИначеЕсли СокрЛП(СтрокаОбразец[КиЗ.Ключ]) = СокрЛП(Стр) Тогда
//СтрокаCOM[КиЗ.Ключ] "уп.10" Строка
//СтрокаТАБ[КиЗ.Значение] "уп.10 " Строка
// ...
ДобавитьНьюанс(Ньюансы, "Ньюанс5", СтрокаCOM[КиЗ.Ключ], СтрокаТАБ[КиЗ.Значение]);
ИначеЕсли ТабДокумент.ШиринаТаблицы > 1024 Тогда
ДобавитьНьюанс(Ньюансы, "Ньюанс6", "ШиринаТаблицы > 1024", "");
// и т.д.
Я конечно буду рад ошибаться, но, по-моему, нативные средства платформы по работе с Excel совсем далекоооооо не всегда применимы на практике.
Сохранение в экселе табличного документа с длинным текстом |
Я |
05.08.09 — 17:02
Столкнулся с проблемкой. Ячейки в табличном документе содержат длинные строки. При сохранении в эксель содержимое этих ячеек просто обрезается. Релиз платформы старый. 8.0.18.2. Вопроса два.
1.Удастся ли это победить обновлением релиза (соответсвенно до какой версии).
2.Как еще это можно победить.
1 — 05.08.09 — 17:03
точно обрезается? А если границы ячейки раздвинуть?
2 — 05.08.09 — 17:05
(1) раздвигаю. Обрезано.
3 — 05.08.09 — 17:12
апп
4 — 05.08.09 — 17:16
дык — а в макете внутри 1С если показать (вывести баличный документ) все на месте?
5 — 05.08.09 — 17:21
(4) в 1С все нормально показывается. Мало того, если сохранить в mxl и открывать из 1С, тоже все хорошо. Обрезает почему-то при сохранении в формате xls
6 — 05.08.09 — 17:30
ау
7 — 05.08.09 — 17:32
где-то вроде сплывало, что режет до 256 символов
8 — 05.08.09 — 17:35
(7) да, именно так. Посчитал…
9 — 05.08.09 — 17:39
(8) может объединение ячеек поможет? Типа кидать длинный текст не в одну ячейку, а в объединение ячеек, как вариант.
10 — 05.08.09 — 17:39
mxl круче xls тут ограничения
11 — 05.08.09 — 17:40
хз, вроде перенос строк через каждые 255 символов должен помочь, хотя не помню
12 — 05.08.09 — 17:41
(9) у меня и так ячейка — объединение нескольких. Но в экселе должен быть уже готовый вариант (который сосбственно и сформирован в 1С)…
13 — 05.08.09 — 17:47
Звездец. Позвонил отцу проконсультирваться. Он говорит, что это обходится. Но для этого нужно формировать средствами языка экселевский документ через ОЛЕ-объект, при помощи бесиковских команд… о-О
14 — 05.08.09 — 17:48
(11) интересно, надо будет проверить…
15 — 05.08.09 — 18:08
(13) просто в Excel передаются строки до 255 символов, а уже макрос в Excel собирает их, как было нужно — у меня вообще Excel «кушала» текстовый файл, по которому формировался лист.
16 — 05.08.09 — 18:34
(11) не, перенос строк не помогает.
(15) надо будет подумать над этим, спасибо.
17 — 05.08.09 — 18:56
(16) на самом деле проблема в том, что окно передачи данных OLE — это 256 символов на строку, далее он её режет, причём даже из макросов Excel.
Вот только не помню, что будет, если использовать значение Value2, которое чем-то там отличается.
А формула в ячейке Excel никогда не может быть больше 256 символов — Microsoft никогда не умел и не научится работать с динамической памятью.
18 — 05.08.09 — 19:00
(17) свой примерчик работы через текстовый файл кинуть можешь?
19 — 05.08.09 — 20:44
Пишется шаблон Excel, то есть документ, который будет что-то делать.
В нём есть процедура Sub Workboon_OnOpen в которой просто ищем нужный нам текстовый файл, который открываем на чтение через Scripting.FileSystemObject
и читаем по строкам:
Не забываем, что нужно создать новую книгу (или лист) — чтобы не писать в наш шаблон — посылать макросы кому-то в подарок — бессмысленно.
В начале идут определения штрифта и цветов.
Font:Номер,ИмяШтрифта,Высота,Жирность
Color:Номер,R,G,B
Border:Номер,Верх,Низ,Лево,Право,Ширина
Потом идёт описание шаблона документа
Columns:Ширина колонки,…
Теперь описываем «строки»
Line:Высота строки.
Cells:НомерЯчейки,Штрифт,Цвет,Рамка,Тип,Данные
Тип=Т просто текст, N это число,F это формула в формате RC.
Штрифт, цвет и рамка — это ссылки на описание в заголовке.
Чтение файла
While File.atEndOfStream=false
s=File.ReadLine()
d=InStr(1,s,»:»)
n=Left(s,d-1)
s=Mid(s,d+1)
if n=»Line» then
‘ читаем высоту строки
i=CLng(s) ‘ здесь у меня была функция проверки формата, но для скорости можно и так
CurrentRow=CurrentRow+1 ‘ сдвигаемся на следующий ряд (не забть занулить перед работой)
InputSheet.Rows(CurrentRow).Height=i ‘ устанавливаем высоту строки
elseif n=»Cells» then
d=InStr(1,s,»,»)
n=Left(s,d-1) ‘ номер ячейки
s=Mid(s,d+1)
CurCol=CLng(n) ‘ преобразование, как получится
d=InStr(1,s,»,»)
n=Left(s,d-1) ‘ штрифт
s=Mid(s,d+1)
CurFont=CLng(n)
d=InStr(1,s,»,»)
n=Left(s,d-1) ‘ цвет
s=Mid(s,d+1)
if n<>»-» then CurColor=GlobalColorArray(CLng(n)) else CurColor=False
‘ и так далее для остальных параметров
with InputSheet.Cells(CurrentRow,CurCol)
if CurType=»T» then
.Value=s
elseif CurType=»N» then
.Value2=CDec(s)
elseif CurType=»F» then
.FormulaR1C1=s
end if
.Font=GlobalFontArray(CurFont)
if CurColor<>False then .Interrior.Color=CurColor
‘ с Border немного сложнее, так как там надо установить флаги чёрточек и их тип в разные места (как это было сделано я сейчас не помню)
end with
elseif n=»Fonts» then
wend
‘ ну и так далее
20 — 05.08.09 — 20:47
P.S. писал по памяти, но идея должна быть понятна.
Чтобы не было вопросов — Такой пример:
Sub test()
s = «??????»
For i = 1 To 1000
s = s & «,» & CStr(i)
Next i
ThisWorkbook.Worksheets(1).Cells(1, 1).Value = s
End Sub
прекрасно «впихивает» в строку все 1000 чисел — явно более 256 символов.
21 — 05.08.09 — 20:49
может йоксель ?
22 — 05.08.09 — 21:22
(19,20) спасибо! Завтра буду разбираться…
(21) слышал про него краем уха, но не помню что за зверь…
23 — 05.08.09 — 21:28
обрезка — шалости экселя….
вроде в последнем (2007 или каком там) — это ограничение сняли….
(20) как все сложно то… Проще надо быть… проще…
24 — 05.08.09 — 22:24
(23) завтра проверю
26 — 06.08.09 — 10:56
(23) таки нет. И в 2007 то же самое….
27 — 06.08.09 — 11:22
+26 кроме того, если обыкновенным копи-пастом копируешь в ячейку текст, то ничего не обрезается, весь текст сохраняется в ячейке. Так что это не приколы экселя, это уродский механизм платформы 1С по сохранению данных в экселевском формате…
28 — 06.08.09 — 11:47
Так, еще вопросик. А рисунки при сохранении табличного документа в эксель почему теряются? Эксельный файл уже без факсимилье идет. Это как-то настраивается?
29 — 06.08.09 — 11:52
8.0 штатными средствами пишет в формате Эксел 95, который не поддерживает Юникод и есть ограничение на длину ячейки. В 8.1 использует более старшую версию Эксела, или можно, как было сказано ранее, исправить полученный xls файл через OLE Automation, достаточно изменить только ячейки с длинными строками.
30 — 06.08.09 — 11:53
(0) сохраняй в формате Excel97 и все будет ок
31 — 06.08.09 — 11:56
(29) а если точнее, 8.1 не будет обрезать текст?
32 — 06.08.09 — 11:58
(30) как это практически сделать? 8.1 использует этот формат для сохранения?
33 — 06.08.09 — 12:01
ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Синтаксис:
Записать(<Имя файла>, <Тип файла таблицы>)
Параметры:
<Имя файла> (обязательный)
Тип: Строка. Имя файла, в котором сохраняется табличный документ.
<Тип файла таблицы> (необязательный)
Тип: ТипФайлаТабличногоДокумента. Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL
Описание:
Записывает табличный документ в файл.
Примечание:
При работе на сервере или через com-соединение использует только файлы форматов mxl и txt.
Пример:
ТабДок.Записать(«C:My DocumentsТаблица2.mxl»);
34 — 06.08.09 — 12:01
(32) см. параметр <Тип файла таблицы>
35 — 06.08.09 — 12:03
(33) спасибо! Сейчас попробую.
36 — 06.08.09 — 12:05
(34) увидел. Но коллекция <Тип файла таблицы> не содержит Excel97. Похоже, надо перейти на 8.1…
37 — 06.08.09 — 12:11
Насчет сохранения рисунка подскажите. По поводу (28)…
38 — 06.08.09 — 12:25
Рисунки в эксель никто не сохраняет? Ау!
39 — 06.08.09 — 12:51
Рискунки… В эксель…
40 — 06.08.09 — 15:10
апп
41 — 06.08.09 — 16:07
Из 8.0 по ОЛЕ засылаю в ячейку столько, что помещается только на 2 экранах (19 дюймов). Одной строкой. Ехель2002.
42 — 06.08.09 — 16:15
+(41) Правда тоже не всё доходит, но обрезает после многих тысяч символов
selenat
43 — 06.08.09 — 16:48
(41) по ОЛЕ — да. Можно. Уже пример надыбал. Только трудоемко…
Про рисунок кто-нить скажет чего?
Тема: Ошибка экспорта табличного документа
Комбинированный просмотр
-
14.01.2011, 08:58
#1
Ошибка экспорта табличного документа
Доброго времени суток!!!!
Проблема следующая, хочу сохранять счета в формате Excel, но в результате выдает ошибку «Ошибка экспорта табличного документа.Документ Excel 97 не может содержать более 256 колонок и более 65536 строк» Платформа 1С:Предприятие 8.2 (8.2.10.82).
Скрин ошибки 123.jpgПомогите пожалуйста, заранее спасибо!!!!
-
07.05.2020, 17:30
#2
Гость форума
Re: Ошибка экспорта табличного документа
Экспорт через excel 2007)
Лучше поздно чем никогда
Похожие темы
-
Ответов: 0
Последнее сообщение: 20.09.2010, 22:12
-
Ответов: 4
Последнее сообщение: 08.07.2010, 23:29
-
Ответов: 1
Последнее сообщение: 13.05.2010, 01:26
Социальные закладки
Социальные закладки

Ваши права
- Вы не можете создавать новые темы
- Вы не можете отвечать в темах
- Вы не можете прикреплять вложения
- Вы не можете редактировать свои сообщения
- BB коды Вкл.
- Смайлы Вкл.
- [IMG] код Вкл.
- [VIDEO] код Вкл.
- HTML код Выкл.
Правила форума
Платформа 8.2.19.130, конф-ция УТ 10.3 в режиме совместимости. Наблюдается следующая проблема: Когда интерактивно (через «сохранить копию»), пытаемся экспортировать файл в формате Excel 97 (или лист excel), то файлы больше 3-4 mb сохраняется с потерей форматирования и открывается с ошибкой: «В книге …. обнаружено содержимое, которое не удалось прочитать….», далее ексель удаляет нечитаемое содержимое и пишет: «Формулы и значения ячеек были восстановлены, но некоторые данные могут быть потеряны.» Эта проблема возникла после перехода с 8.1 на 8.2 — платформу. При этом большие файлы експортируемые из БП 2.0 сохраняются и открываются нормально. Подскажите, как этом можно исправить, или в какую сторону копать. ЗЫ Офис на компах юзеров 2007-ой.
а в xlsx тоже криво сохраняется?
В xlsx сохраняется и открывается, но при этом сбивается форматирование ячеек, столбцы как бы сужаются, это неудобно так как выгружаются табличные документы с картинками, и их приходится править потом. Кроме того, не у всех клиентов установлен офис 2007 и выше, поэтому менеджерам, хотелось бы все-таки сохранять файлы совместимые с 97-2003. Пока предлагаем менеджерам такое решение: сохранять в xlsx, потом пересохранять в 97-2003, но они не в восторге, от лишних телодвижений. Нагуглить толком ничего не удалось, может сообщество подскажет какое-нибудь решение?
все таблицы так себя ведут? или только одна? зы может проблема тут?
Попробуйте поставить 8.2.17 (у нас стоит 1С:Предприятие 8.2 (8.2.17.153)). Пытались переходить на 8.2.19, так они что-то в moxel.dll навертели там и тяжелые прайсы с картинками также криво сохранялись. Оттого сидим и пока не переходим.
Все табличные документы себя так ведут, пробовали на прайс-листе, печати счета с картинками и etc. Как только размер файла превышает 3-4 mb, сразу начинаются проблемы с форматированием. На 17-ом релизе 97-2003 у вас нормально экспортируется?
да, есть прайсы, весящие до сжатия по 100 Мб
Ок, спасибо, будем пробовать этот вариант…
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
Уважаемые специалисты,
есть файл на 60 листов (сборник пустых бланков). На каждом листе — несложные таблицы БЕЗ формул. Цифр практически нет. Ссылок на другие файлы НЕТ. Есть только заголовки таблиц, названия столбцов и строк. Кое где применяется объединение ячеек и форматирование. К сожалению, сам файл выложить не могу.
В определённый момент, после выполнения нескольких обычных операций (ввод данных в ячейки, удаление или добавление строк), файл вдруг перестал сохраняться в формате XLSX с надписью: «Длина одной или нескольких формул данной книги превышает допустимую длину, равную 8192 знакам. Чтобы обойти это ограничение, следует сохранить данную книгу в формате двоичной книги Excel». Далее, сохраняю в XLSB и могу работать дальше, но данный формат мне не подходит, так как отдавать людям этот файл я должен строго в XLSX или XLS. Нигде в файле нет настолько огромной ячейки, и нет ни одной формулы. Имена в файле вычищены все через «Диспетчер имён». Сохранение в XLS приводит к потере всех форматов.
Вопрос: Как найти ту самую ячейку, где есть превышение символов? При сохранении в старом формате есть сообщение о потере точности, есть упоминание о превышении количества символов, но НЕТ ссылки на причину.
Добавим проблему в копилку неустранимых глюков Экселя……
Может, есть скрытые имена или формулы или еще что-нибудь скрытое?
Попробуйте залить файлик, а ссылку в личку, например. Посмотрим.
Вот пример. Попробуйте сохранить его как XLSX.
Именно этот файл удаётся «вылечить» пересохранением в 2003 и обратно, но данный фокус не срабатывает с рабочим файлом, так как, при этом, очищаются форматы.
Так что задача — найти источник проблемы.
Видимо, дело не в длине формул, а в длине имен. Попробуйте запустить такой макрос
Sub tt()
Dim nm As Name
For Each nm In ActiveWorkbook.Names
nm.Visible = True
Next
End Sub
После этого в диспетчере имен посмотрите какие имена есть в Вашем файле.
В примере просто удалил все имена
Sub ttt()
Dim nm As Name
For Each nm In ActiveWorkbook.Names
nm.Delete
Next
End Sub
и все отлично сохранилось.
Спасибо! Сработало!
Вот только тот факт, что косячные имена не были видны в диспетчере не является ли багом Экселя? И вообще, почему программа хранит весь этот мусор? Все именованные диапазоны давно удалены, а имена остались.
Цитата: Димычч от 26.03.2012, 13:02
Нигде в файле нет настолько огромной ячейки, и нет ни одной формулы.
У Вас их в файле 230 штук. И дело всё-таки в формулах, которым присвоены имена.
ЗЫ Скрытые имена — это не баг, а возможность excel
ЗЫЗЫ Порадовали имена типа «ж()п@»
Я в шоке…. использовал макрос «отобразить имена» на других рабочих файлах (в которых до этого почистил до тысячи левых имён), а там….. ещё по 2 тысячи в каждом. Когда-то, лет 5 назад, вставил листик с простенькой табличкой из чужого файла в свой рабочий файл, и эта безобидная операция принесла в мой файл эту кучу г….. Абсолютно никому не нужную, кроме Экселя, разумеется.
Serge 007,
я понимаю, возможность скрытия имён — хорошая возможность Экселя, но откуда берутся все эти тысячи скрытых имён, если их никто не прописывал? Например, я почистил все имена их файла, в том числе, скрытые. Через неделю снова заглянул в диспетчер, а там их 30 штук, все начинаются с буквы Z (как большинство в файле-примере). То есть, просто работая с файлом несколько лет, мы получаем снова неработающий файл с тысячами ненужных имен, который можно вылечить только с помощью недокументированной возможности через макрос отображения скрытых имен?
Цитата: Димычч от 02.04.2012, 09:39
…откуда берутся все эти тысячи скрытых имён, если их никто не прописывал?
Да много откуда. Простой пример: Вы создаёте таблицу XL 2007/2010 — Excel САМ создаёт именованный диапазон. Или Вы сами можете, не зная об этом, скопировать его из другой книги.
Цитата: Димычч от 02.04.2012, 09:39
…можно вылечить только с помощью недокументированной возможности через макрос отображения скрытых имен?
Это документированная возможность. Но не Excel, а VBA.
ЗЫ У меня например, за годы работы в Excel, никогда проблем с именами в файлах не возникало…
- Профессиональные приемы работы в Microsoft Excel
-
►
Обмен опытом -
►
Microsoft Excel -
►
EXCEL 2010 не даёт сохранить файл из-за превышения количества символов в ячейке