|
Программное сохранение табл документа в Excel с ячейками в формате Текстовый | ☑ | ||
---|---|---|---|---|
0
Мимохожий Однако
21.03.19
✎
16:32
|
Программно сохраняю прайс или отчет в формате XLSX методом табличного документа. Когда открываю файл, у него формат Общий. Это клиентов не устраивает. Поэтому и вопрос: Как сохранить табличный документ с форматом ячеек Тестовый?
|
|||
1
СтарПом
21.03.19
✎
16:39
|
||||
2
СтарПом
21.03.19
✎
16:48
|
(1) отбой, не то
|
|||
3
СтарПом
21.03.19
✎
17:01
|
Похоже, только если формировать печатную форму через Excel.Application и с установкой у ячеек NumberFormat = "@"
|
|||
4
Мимохожий Однако
21.03.19
✎
17:06
|
(3) Я не хочу запускать Excel. В этом ограничение.
|
|||
5
Мимохожий Однако
21.03.19
✎
17:07
|
Приведенный пример только с использованием Excel
|
|||
6
СтарПом
21.03.19
✎
17:09
|
ВК из соседней ветки?
Сохраняем mxl в Excel 2007 |
|||
7
Мимохожий Однако
21.03.19
✎
17:21
|
(6) Там немного другое и для 8-ки пока не сделано
|
|||
8
sqr4
21.03.19
✎
17:56
|
(7) Прижми в право или влево не помню
|
|||
9
Мимохожий Однако
21.03.19
✎
18:44
|
(8) Это не помогает после сохранения в Excel
|
|||
10
d4rkmesa
21.03.19
✎
19:11
|
||||
11
ProxyInspector
21.03.19
✎
19:21
|
(10) Не плохо. Осталось только к СКД прикрутить.
|
|||
12
Мимохожий Однако
21.03.19
✎
19:29
|
У меня прайс формируется в СКД. Как применить это из ссылки (10) ?
|
|||
13
Мимохожий Однако
21.03.19
✎
19:31
|
Обрабатываю полученный табличный документ кодом
МассивБулево = Новый Массив; МассивБулево.Добавить(Тип("Строка")); ОписаниеТиповСтрока = Новый ОписаниеТипов(МассивБулево); НомерКолонки=0; Для а = 1 по Результат.ВысотаТаблицы Цикл Для б=1 По Результат.ШиринаТаблицы Цикл ТекстЯчейки=""+Результат.Область(а,б,а,б).Текст; Результат.Область(а,б,а,б).СодержитЗначение=Истина; Результат.Область(а,б,а,б).ТипЗначения=ОписаниеТиповСтрока; Результат.Область(а,б,а,б).Значение=ТекстЯчейки; //Результат.Область(а,б,а,б).ФорматРедактирования=""; //Результат.Область(а,б,а,б).Формат="строка"; КонецЦикла; КонецЦикла; Но это не помогает |
|||
14
d4rkmesa
21.03.19
✎
21:38
|
(12) (13) Одно не исключает другого. Правда, я подобное в шаблон типового отчета для ОФ добавлял(давно это было), там проще получилось. Пример:
ТиповыеОтчеты.СформироватьТиповойОтчет(ЭтотОбъект, Результат, ДанныеРасшифровки, ВыводВФормуОтчета); ОбластьЗаголовка = Результат.Области.Найти("Заголовок"); ОбластьРезультата = Результат.Область(?(ОбластьЗаголовка <> Неопределено, ОбластьЗаголовка.Низ + 3, 1), 1, Результат.ВысотаТаблицы, Результат.ШиринаТаблицы); ОбластьРезультата.СодержитЗначение = Истина; ОбластьРезультата.ТипЗначения = Новый ОписаниеТипов("Строка"); |
|||
15
Мимохожий Однако
21.03.19
✎
22:22
|
В результате сделал через Excel, хотя не хотелось...
Excel = Новый COMОбъект("Excel.Application"); Excel.WorkBooks.Open(ИмяФайла); Excel.Visible = 0; Excel.ActiveWindow.DisplayWorkbookTabs = 1; Excel.ActiveWindow.TabRatio = 0.6; Excel.Cells.Select(); Excel.Selection.NumberFormat = "@"; //FullName = Excel.ActiveWorkbook.FullName; Excel.DisplayAlerts = false; Если Расширение="XLSX" Тогда Excel.ActiveWorkbook.SaveAs(ИмяФайла, 51); // 18 - xls 97-2003; 51 - xlsx 2007-2013 Иначе Excel.ActiveWorkbook.SaveAs(ИмяФайла, 18); // 18 - xls 97-2003; 51 - xlsx 2007-2013 КонецЕсли; Excel.Application.Quit();// завершаем процесс Excel Excel = Неопределено; |
|||
16
ProxyInspector
22.03.19
✎
07:17
|
(15) Это не кошерно. Но (10) и (14) наконец-то дают надежду победить этот косяк Exell
|
|||
17
Йохохо
22.03.19
✎
07:29
|
апостроф в начало пробовали добавлять? '
|
|||
18
Мимохожий Однако
22.03.19
✎
07:29
|
(16) Я этим путём проходил. см (13). Но после сохранения табличного документа в Excel формат остаётся Общим. при этом в исходном файле mxl в каждой ячейке прописано значение как текст и свойство ячейки как и задумывалось было:
бластьРезультата.СодержитЗначение = Истина; ОбластьРезультата.ТипЗначения = Новый ОписаниеТипов("Строка"); .. |
|||
19
Мимохожий Однако
22.03.19
✎
07:29
|
(17) я с этого начинал )
|
|||
20
Мимохожий Однако
22.03.19
✎
07:30
|
(17) Но не всем клиентам этот апостроф понравился. У них роботы обрабатывают файл и лезут глюки. Пришлось отказаться.
|
|||
21
Мимохожий Однако
22.03.19
✎
07:32
|
Единственно, что я еще не испытал, это использование макетов в СКД. У меня прайсы формируются через СКД. Потом сохраняются из полученного табличного документа в различные форматы средствами 1С.
|
|||
22
Йохохо
22.03.19
✎
07:36
|
(21) тогда, вероятно, если скопировать скдшный вывод в новый табдок, как в (13), то (10) заработает
|
|||
23
Мимохожий Однако
22.03.19
✎
07:44
|
(22) Пример кода или ссылка есть, как в СКД в макете установить вариант (10) ?
|
|||
24
Йохохо
22.03.19
✎
07:50
|
(23) НовыйТабличныйДокумент.Область(а,б,а,б).Текст = "" + Результат.Область(а,б,а,б).Текст
|
|||
25
Дмитрий
22.03.19
✎
08:22
|
(0) в макете в параметрах ячейки содержит значение = истина, тип значения = строка
|
|||
26
Мимохожий Однако
22.03.19
✎
08:51
|
(24) (25) Мужики,я ЭТО делал. Попробуйте ПРОГРАММНО сохранить полученный табличный документ в Excel. А потом откройте. И увидите, что там формат Общий, а не Текстовый
|
|||
27
sqr4
22.03.19
✎
09:06
|
(26) наверно только открывать экселькой файл после сохранения и проставлять
|
|||
28
Мимохожий Однако
22.03.19
✎
09:12
|
(27) От этого я хотел уйти, но пока остановился на этом варианте. При массовом формировании прайсов ожидаю сбоев. Ну, ладно. Посмотрю, что будет на практике.
|
|||
29
ProxyInspector
22.03.19
✎
15:53
|
Попробовал ручками в табличном документе, поставить в ячейке, которая содержит значение 00001,
.СодержитЗначение = Истина; .Тип = Строка Потом сохранил в формате Exell и у ячейки получился вполне нормальное значение "00001" И это радует. Правда не понятно как это сделать в СКД, но хотя бы появился свет в конце туннеля. |
|||
30
СтарПом
22.03.19
✎
15:58
|
(29) задача другая
ТСу (а точнее его заказчикам) нужно (зачем? - хз) чтобы формат ячейки в экселе был не Общий, и Текстовый... про СодержитЗначение и Тип=Строка я еще в (1) ссылку приводил |
|||
31
Garykom
гуру
22.03.19
✎
16:02
|
(29) Программно в ТабДок это проставить можно и все ОК?
|
|||
32
Дмитрий
22.03.19
✎
16:21
|
(26) А если программно сразу в Excel писать ?
|
|||
33
ProxyInspector
22.03.19
✎
16:49
|
Текстовый - понятно почему. Если в отчете 1с значение в ячейке табличного документа 0001, то при команде сохранить как Exell значение в ячейке Exell получается 1, с каким то левым форматом типа "00000000". Когда люди делают импорт из Exell, то и получают значение 1 вместо "0001". Это проблема Exell, с которой народ бьется уже лет 10.
Программно в ТабДок ставить можно, но это как-то не кошерно. Хочется в Построителе и в СКД как-то указать для ячейки .СодержитЗначение = Истина не анализируя сам ТабДок |
|||
34
Сияющий в темноте
22.03.19
✎
17:36
|
Сохраняйте через Ado,тат тип ячейки можно точно задать.
|
|||
35
mistеr
22.03.19
✎
18:37
|
(33) Свой макет поля должен помочь.
P.S. А еще длинные цифровые коды (типа номеров банковских счетов) превращаются в непотребство типа "1.24Е18". Это к вопросу "зачем". |
|||
36
ad205
28.03.19
✎
17:41
|
На самом деле всё проще. В свойствах нужной ячейки в шаблоне поставьте признак "Содержит значение" и тип строка. Тогда при сохранении в Excel, ячейке сразу будет присваиваться тип строка.
|
|||
37
Мимохожий Однако
28.03.19
✎
19:00
|
(36) Приведи пример кода программной установки в табличный документ при формировании в СКД. Тут уже раза три спрашивал. Сам такого кода не смог родить.
Через использование Excel у меня получилось. Но желание обойтись без него окаянного не прошло.) |
|||
38
ProxyInspector
08.04.19
✎
15:38
|
Попробовал на своей базе, все прекрасно получилось. В СКД формируется ТабличныйДокумент.
Перед сохранением ТабличногоДокумента в Exell Выполняется код: ТипСтрока = Новый ОписаниеТипов("Строка"); Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл ДЛя НомерСтолбца = 1 ПО ТабличныйДокумент.ШиринаТаблицы Цикл Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца); ТекТекст = Ячейка.Текст; Если ТребуетсяПреобразованиеСтрока(ТекТекст) Тогда //Первый символ "0" или строка содержит "e" и числа ( для "1.24Е18") Ячейка.СодержитЗначение = Истина; Ячейка.ТипЗначения = ТипСтрока; КонецЕСли; КонецЦикла; КонецЦикла; Вполне возможно этот код выполнять просто после формирования ТабличногоДокумента, но до вывода на эеран. Тогда корректно работать "Сохранить как" |
|||
39
Мимохожий Однако
08.04.19
✎
15:41
|
(38) В какую процедуру ты разместил этот код?
|
|||
40
ProxyInspector
08.04.19
✎
15:44
|
Пока перед сохранением файла. У нас кнопочка сделана "Сохранить в Exell" когда сформирован табличныйДокумент
И еще добавил в Рассылку отчетов, опять же перед сохранением во временный файл |
|||
41
Мимохожий Однако
08.04.19
✎
15:47
|
(40) У меня формирование идёт в режиме фонового задания. В интерактивном режиме этой проблемы нет. Меня интересует только программное сохранение. Приведенный код не работает на сервере. У меня не работает. Всё что предлагалось - интерактив. Или я не понял?
|
|||
42
ProxyInspector
08.04.19
✎
15:49
|
У меня тоже рассылка идет в Фоновом режиме.
|
|||
43
Мимохожий Однако
08.04.19
✎
15:50
|
(42) А формирование файла вручную?
|
|||
44
Мимохожий Однако
08.04.19
✎
15:52
|
У меня платформа 8.3.9. Может быть, из-за этого?
|
|||
45
ProxyInspector
08.04.19
✎
15:53
|
Я правда не проверил еще в Фоновом режиме :) Но мне кажется должно работать. Там такой-же ТабличныйДокумент и команда ТабличныйДокумент.Записать(...)
У меня 8.3.8.2197 |
|||
46
ProxyInspector
08.04.19
✎
15:54
|
Формирование файла происходит так
табличныйДокумент.Записать(..) |
|||
47
ProxyInspector
08.04.19
✎
15:55
|
Перед этим прохожу по ячейкам Табличного документа и где надо ставлю
Ячейка.СодержитЗначение = Истина; Ячейка.ТипЗначения = ТипСтрока; |
|||
48
Мимохожий Однако
08.04.19
✎
15:56
|
(45) С кода, который ты привёл, я начинал до сабжа, но у меня при этом формат оставался общим.
|
|||
49
Мимохожий Однако
08.04.19
✎
15:57
|
+ см(13)
|
|||
50
ProxyInspector
08.04.19
✎
15:59
|
Так там хитро, формат остается "общий", но значение не конвертируется в число. Т.е если без преобразования делаешь, то из "0000001" получается формат = "000000000" значение = 1
а с преобразованием получается формат = "общий" значение = "0000001" |
|||
51
ProxyInspector
08.04.19
✎
16:04
|
Тоже самое с "1000e10"
без преобразования получается формат "общий" значение 1.00e10 c преобразованием формат "общий" значение "1000e10" |
|||
52
ProxyInspector
08.04.19
✎
16:06
|
При этом Exell говорит на "0000001" что данная ячейка содержит значение в виде строка, и предлагает изменить его на число
|
|||
53
Мимохожий Однако
08.04.19
✎
16:13
|
У меня последняя задача была поставлена, чтобы не только значение было строка, но и формат Текстовый. Из-за этого копья ломались )) Через 1С не удалось, поэтому пока работает режим вызова Excel/
|
|||
54
ProxyInspector
11.04.19
✎
10:02
|
Продолжили тестирование, обнаружились некоторые странности. На некоторых артикулах типа "0AA-1BB23456" не корректно переносилось в Excell, судя по всему в 1С начудили. Пришлось добавить строку в код " Ячейка.Текст = ТекТекст;" и получилось так.
ТипСтрока = Новый ОписаниеТипов("Строка"); Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл ДЛя НомерСтолбца = 1 ПО ТабличныйДокумент.ШиринаТаблицы Цикл Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца); ТекТекст = Ячейка.Текст; Если ТребуетсяПреобразованиеСтрока(ТекТекст) Тогда //Первый символ "0" или строка содержит "e" и числа ( для "1.24Е18") Ячейка.СодержитЗначение = Истина; Ячейка.ТипЗначения = ТипСтрока; Ячейка.Текст = ТекТекст; КонецЕСли; КонецЦикла; КонецЦикла; И это работает нормально, для нашего полного набора артикулов автозапчастей (где-то в районе 100 тыс шт) Для себя мы эту тему закрыли. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |