Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Программное сохранение табл документа в Excel с ячейками в формате Текстовый

Программное сохранение табл документа в Excel с ячейками в формате Текстовый
Я
   МимохожийОднако
 
21.03.19 - 16:32
Программно сохраняю прайс или отчет в формате XLSX методом табличного документа. Когда открываю файл, у него формат Общий. Это клиентов не устраивает. Поэтому и вопрос: Как сохранить табличный документ с форматом ячеек Тестовый?
 
 
   СтарПом
 
1 - 21.03.19 - 16:39
v8: Табличный документ. Формат ячеек
(22) и далее
пысы: сам не пробовал
   СтарПом
 
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-ки пока не сделано
   sqr4
 
8 - 21.03.19 - 17:56
(7) Прижми в право или влево не помню
   МимохожийОднако
 
9 - 21.03.19 - 18:44
(8) Это не помогает после сохранения в Excel
   d4rkmesa
 
10 - 21.03.19 - 19:11
   ProxyInspector
 
11 - 21.03.19 - 19:21
(10) Не плохо. Осталось только к СКД прикрутить.
   МимохожийОднако
 
12 - 21.03.19 - 19:29
У меня прайс формируется в СКД. Как применить это из ссылки (10) ?
   МимохожийОднако
 
13 - 21.03.19 - 19:31
Обрабатываю полученный табличный документ кодом
МассивБулево = Новый Массив; 
    МассивБулево.Добавить(Тип("Строка"));
    ОписаниеТиповСтрока = Новый ОписаниеТипов(МассивБулево);
    НомерКолонки=0;
    Для а = 1 по Результат.ВысотаТаблицы Цикл
        Для б=1 По Результат.ШиринаТаблицы Цикл
            ТекстЯчейки=""+Результат.Область(а,б,а,б).Текст;
            Результат.Область(а,б,а,б).СодержитЗначение=Истина;
            Результат.Область(а,б,а,б).ТипЗначения=ОписаниеТиповСтрока;
            Результат.Область(а,б,а,б).Значение=ТекстЯчейки;
            //Результат.Область(а,б,а,б).ФорматРедактирования="";

            //Результат.Область(а,б,а,б).Формат="строка";

        КонецЦикла;
    КонецЦикла;
Но это не помогает
   d4rkmesa
 
14 - 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 = Неопределено;
   ProxyInspector
 
16 - 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. А потом откройте. И увидите, что там формат Общий, а не Текстовый
   sqr4
 
27 - 22.03.19 - 09:06
(26) наверно только открывать экселькой файл после сохранения и проставлять
   МимохожийОднако
 
28 - 22.03.19 - 09:12
(27) От этого я хотел уйти, но пока остановился на этом варианте. При массовом формировании прайсов ожидаю сбоев. Ну, ладно. Посмотрю, что будет на практике.
   ProxyInspector
 
29 - 22.03.19 - 15:53
Попробовал ручками в табличном документе,  поставить в ячейке, которая содержит значение 00001,  
.СодержитЗначение = Истина;
.Тип = Строка
 Потом сохранил в формате Exell и у ячейки получился вполне нормальное значение "00001"
 И это радует. Правда не понятно как это сделать в СКД, но хотя бы появился свет в конце туннеля.
   СтарПом
 
30 - 22.03.19 - 15:58
(29) задача другая
ТСу (а точнее его заказчикам) нужно (зачем? - хз) чтобы формат ячейки в экселе был не Общий, и Текстовый...
про СодержитЗначение и Тип=Строка я еще в (1) ссылку приводил
 
 
   Garykom
 
31 - 22.03.19 - 16:02
(29) Программно в ТабДок это проставить можно и все ОК?
   Дмитрий
 
32 - 22.03.19 - 16:21
(26) А если программно сразу в Excel писать ?
   ProxyInspector
 
33 - 22.03.19 - 16:49
Текстовый - понятно почему. Если в отчете 1с значение в ячейке табличного документа 0001, то при команде сохранить как Exell значение в ячейке Exell получается 1, с каким то левым форматом типа "00000000". Когда люди делают импорт из Exell, то и получают значение 1 вместо "0001".  Это проблема Exell, с которой народ бьется уже лет 10.
   Программно в ТабДок ставить можно, но это как-то не кошерно. Хочется в Построителе и в СКД как-то указать для ячейки .СодержитЗначение = Истина не анализируя сам ТабДок
   Сияющий в темноте
 
34 - 22.03.19 - 17:36
Сохраняйте через Ado,тат тип ячейки можно точно задать.
   mistеr
 
35 - 22.03.19 - 18:37
(33) Свой макет поля должен помочь.

P.S. А еще длинные цифровые коды (типа номеров банковских счетов) превращаются в непотребство типа "1.24Е18". Это к вопросу "зачем".
   ad205
 
36 - 28.03.19 - 17:41
На самом деле всё проще. В свойствах нужной ячейки в шаблоне поставьте признак "Содержит значение" и тип строка. Тогда при сохранении в Excel, ячейке сразу будет присваиваться тип строка.
   МимохожийОднако
 
37 - 28.03.19 - 19:00
(36) Приведи пример кода программной установки в табличный документ при формировании в СКД. Тут уже раза три спрашивал. Сам такого кода не смог родить.
Через использование Excel  у меня получилось. Но желание обойтись без него окаянного не прошло.)
   ProxyInspector
 
38 - 08.04.19 - 15:38
Попробовал на своей базе, все прекрасно получилось. В СКД формируется ТабличныйДокумент.
Перед сохранением ТабличногоДокумента в Exell Выполняется код:

    ТипСтрока = Новый ОписаниеТипов("Строка");
    Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
        ДЛя НомерСтолбца = 1 ПО ТабличныйДокумент.ШиринаТаблицы Цикл
            Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца);
            ТекТекст = Ячейка.Текст;
            Если ТребуетсяПреобразованиеСтрока(ТекТекст) Тогда
                                //Первый символ "0" или строка содержит "e" и числа ( для  "1.24Е18")

                Ячейка.СодержитЗначение = Истина;
                Ячейка.ТипЗначения = ТипСтрока;
            КонецЕСли;
        КонецЦикла;
    КонецЦикла;

Вполне возможно этот код выполнять просто после формирования ТабличногоДокумента, но до вывода на эеран. Тогда корректно работать
  "Сохранить как"
   МимохожийОднако
 
39 - 08.04.19 - 15:41
(38) В какую процедуру ты разместил этот код?
   ProxyInspector
 
40 - 08.04.19 - 15:44
Пока перед сохранением файла. У нас кнопочка сделана "Сохранить в Exell" когда сформирован табличныйДокумент
 И еще добавил в Рассылку отчетов, опять же перед сохранением во временный файл
   МимохожийОднако
 
41 - 08.04.19 - 15:47
(40) У меня формирование идёт в режиме фонового задания.   В интерактивном режиме этой проблемы нет. Меня интересует только программное сохранение. Приведенный код не работает на сервере. У меня не работает. Всё что предлагалось - интерактив. Или я не понял?
   ProxyInspector
 
42 - 08.04.19 - 15:49
У меня тоже рассылка идет в Фоновом режиме.
   МимохожийОднако
 
43 - 08.04.19 - 15:50
(42) А формирование файла вручную?
   МимохожийОднако
 
44 - 08.04.19 - 15:52
У меня платформа 8.3.9. Может быть, из-за этого?
   ProxyInspector
 
45 - 08.04.19 - 15:53
Я правда не проверил еще в Фоновом режиме :) Но мне кажется должно работать. Там такой-же ТабличныйДокумент и команда ТабличныйДокумент.Записать(...)
У меня 8.3.8.2197
   ProxyInspector
 
46 - 08.04.19 - 15:54
Формирование файла происходит так
 табличныйДокумент.Записать(..)
   ProxyInspector
 
47 - 08.04.19 - 15:55
Перед этим прохожу по ячейкам Табличного документа и где надо ставлю 
                Ячейка.СодержитЗначение = Истина;
                Ячейка.ТипЗначения = ТипСтрока;
   МимохожийОднако
 
48 - 08.04.19 - 15:56
(45) С кода, который ты привёл, я начинал до сабжа, но у меня при этом формат оставался общим.
   МимохожийОднако
 
49 - 08.04.19 - 15:57
+ см(13)
   ProxyInspector
 
50 - 08.04.19 - 15:59
Так там хитро, формат остается "общий", но значение не конвертируется в число. Т.е если без преобразования делаешь, то из "0000001" получается  формат = "000000000" значение = 1
 а с преобразованием получается
 формат = "общий"   значение = "0000001"
   ProxyInspector
 
51 - 08.04.19 - 16:04
Тоже самое с "1000e10"
без преобразования получается формат "общий"  значение 1.00e10
c преобразованием  формат "общий"  значение "1000e10"
   ProxyInspector
 
52 - 08.04.19 - 16:06
При этом Exell говорит на "0000001" что данная ячейка содержит значение в виде строка, и предлагает изменить его на число
   МимохожийОднако
 
53 - 08.04.19 - 16:13
У меня последняя задача была поставлена, чтобы не только значение было строка, но и формат  Текстовый. Из-за этого копья ломались )) Через 1С не удалось, поэтому пока работает режим вызова Excel/
   ProxyInspector
 
54 - 11.04.19 - 10:02
Продолжили тестирование, обнаружились некоторые странности. На некоторых артикулах типа "0AA-1BB23456" не корректно переносилось в Excell, судя по всему в 1С начудили. Пришлось добавить строку в код "   Ячейка.Текст = ТекТекст;" и получилось так.

ТипСтрока = Новый ОписаниеТипов("Строка");
    Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
        ДЛя НомерСтолбца = 1 ПО ТабличныйДокумент.ШиринаТаблицы Цикл
            Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца);
            ТекТекст = Ячейка.Текст;
            Если ТребуетсяПреобразованиеСтрока(ТекТекст) Тогда
                                //Первый символ "0" или строка содержит "e" и числа ( для  "1.24Е18")

                Ячейка.СодержитЗначение = Истина;
                Ячейка.ТипЗначения = ТипСтрока;
                Ячейка.Текст = ТекТекст;
            КонецЕСли;
        КонецЦикла;
    КонецЦикла;

    И это работает нормально, для нашего полного набора артикулов автозапчастей  (где-то в районе 100 тыс шт)
 Для себя мы эту тему закрыли.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.