![]() |
![]() |
![]() |
|
Сохранение в экселе табличного документа с длинным текстом | ☑ | ||
---|---|---|---|---|
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) по ОЛЕ - да. Можно. Уже пример надыбал. Только трудоемко...
Про рисунок кто-нить скажет чего? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |