Имя: Пароль:
1C
 
Сохранение в экселе табличного документа с длинным текстом
0 selenat
 
05.08.09
17:02
Столкнулся с проблемкой. Ячейки в табличном документе содержат длинные строки. При сохранении в эксель содержимое этих ячеек просто обрезается. Релиз платформы старый. 8.0.18.2. Вопроса два.
1.Удастся ли это победить обновлением релиза (соответсвенно до какой версии).
2.Как еще это можно победить.
1 Aprobator
 
05.08.09
17:03
точно обрезается? А если границы ячейки раздвинуть?
2 selenat
 
05.08.09
17:05
(1) раздвигаю. Обрезано.
3 selenat
 
05.08.09
17:12
апп
4 Aprobator
 
05.08.09
17:16
дык -  а в макете внутри 1С если показать (вывести баличный документ) все на месте?
5 selenat
 
05.08.09
17:21
(4) в 1С все нормально показывается. Мало того, если сохранить в mxl и открывать из 1С, тоже все хорошо. Обрезает почему-то при сохранении в формате xls
6 selenat
 
05.08.09
17:30
ау
7 dk
 
05.08.09
17:32
где-то вроде сплывало, что режет до 256 символов
8 selenat
 
05.08.09
17:35
(7) да, именно так. Посчитал...
9 Aprobator
 
05.08.09
17:39
(8) может объединение ячеек поможет? Типа кидать длинный текст не в одну ячейку, а в объединение ячеек, как вариант.
10 htva
 
05.08.09
17:39
mxl круче xls тут ограничения
11 dk
 
05.08.09
17:40
хз, вроде перенос строк через каждые 255 символов должен помочь, хотя не помню
12 selenat
 
05.08.09
17:41
(9) у меня и так ячейка - объединение нескольких. Но в экселе должен быть уже готовый вариант (который сосбственно и сформирован в 1С)...
13 selenat
 
05.08.09
17:47
Звездец. Позвонил отцу проконсультирваться. Он говорит, что это обходится. Но для этого нужно формировать средствами языка экселевский документ через ОЛЕ-объект, при помощи бесиковских команд... о-О
14 selenat
 
05.08.09
17:48
(11) интересно, надо будет проверить...
15 Torquader
 
05.08.09
18:08
(13) просто в Excel передаются строки до 255 символов, а уже макрос в Excel собирает их, как было нужно - у меня вообще Excel "кушала" текстовый файл, по которому формировался лист.
16 selenat
 
05.08.09
18:34
(11) не, перенос строк не помогает.
(15) надо будет подумать над этим, спасибо.
17 Torquader
 
05.08.09
18:56
(16) на самом деле проблема в том, что окно передачи данных OLE - это 256 символов на строку, далее он её режет, причём даже из макросов Excel.
Вот только не помню, что будет, если использовать значение Value2, которое чем-то там отличается.
А формула в ячейке Excel никогда не может быть больше 256 символов - Microsoft никогда не умел и не научится работать с динамической памятью.
18 selenat
 
05.08.09
19:00
(17) свой примерчик работы через текстовый файл кинуть можешь?
19 Torquader
 
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 Torquader
 
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 selenat
 
05.08.09
21:22
(19,20) спасибо! Завтра буду разбираться...
(21) слышал про него краем уха, но не помню что за зверь...
23 Коллайдер
 
05.08.09
21:28
обрезка - шалости экселя....
вроде в последнем (2007 или каком там) - это ограничение сняли....



(20) как все сложно то... Проще надо быть... проще...
24 selenat
 
05.08.09
22:24
(23) завтра проверю
26 selenat
 
06.08.09
10:56
(23) таки нет. И в 2007 то же самое....
27 selenat
 
06.08.09
11:22
+26 кроме того, если обыкновенным копи-пастом копируешь в ячейку текст, то ничего не обрезается, весь текст сохраняется в ячейке. Так что это не приколы экселя, это уродский механизм платформы 1С по сохранению данных в экселевском формате...
28 selenat
 
06.08.09
11:47
Так, еще вопросик. А рисунки при сохранении табличного документа в эксель почему теряются? Эксельный файл уже без факсимилье идет. Это как-то настраивается?
29 MM
 
06.08.09
11:52
8.0 штатными средствами пишет в формате Эксел 95, который не поддерживает Юникод и есть ограничение на длину ячейки. В 8.1 использует более старшую версию Эксела, или можно, как было сказано ранее, исправить полученный xls файл через OLE Automation, достаточно изменить только ячейки с длинными строками.
30 Leksus
 
06.08.09
11:53
(0) сохраняй в формате Excel97 и все будет ок
31 selenat
 
06.08.09
11:56
(29) а если точнее, 8.1 не будет обрезать текст?
32 selenat
 
06.08.09
11:58
(30) как это практически сделать? 8.1 использует этот формат для сохранения?
33 Leksus
 
06.08.09
12:01
ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Синтаксис:
Записать(<Имя файла>, <Тип файла таблицы>)
Параметры:
<Имя файла> (обязательный)
Тип: Строка. Имя файла, в котором сохраняется табличный документ.
<Тип файла таблицы> (необязательный)
Тип: ТипФайлаТабличногоДокумента. Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL
Описание:
Записывает табличный документ в файл.
Примечание:
При работе на сервере или через com-соединение использует только файлы форматов mxl и txt.
Пример:
ТабДок.Записать("C:\My Documents\Таблица2.mxl");
34 Leksus
 
06.08.09
12:01
(32) см. параметр <Тип файла таблицы>
35 selenat
 
06.08.09
12:03
(33) спасибо! Сейчас попробую.
36 selenat
 
06.08.09
12:05
(34) увидел. Но коллекция <Тип файла таблицы> не содержит Excel97. Похоже, надо перейти на 8.1...
37 selenat
 
06.08.09
12:11
Насчет сохранения рисунка подскажите. По поводу (28)...
38 selenat
 
06.08.09
12:25
Рисунки в эксель никто не сохраняет? Ау!
39 selenat
 
06.08.09
12:51
Рискунки... В эксель...
40 selenat
 
06.08.09
15:10
апп
41 КонецЕсли
 
06.08.09
16:07
Из 8.0 по ОЛЕ засылаю в ячейку столько, что помещается только на 2 экранах (19 дюймов). Одной строкой. Ехель2002.
42 КонецЕсли
 
06.08.09
16:15
+(41) Правда тоже не всё доходит, но обрезает после многих тысяч символов
43 selenat
 
06.08.09
16:48
(41) по ОЛЕ - да. Можно. Уже пример надыбал. Только трудоемко...
Про рисунок кто-нить скажет чего?