Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Таблицы в .doc и в .odt


Автор: WERITAS 9.2.2010, 12:31
Добрый день. Моя программа (которая написана на ПхП) использует СОМ-объект Word'a, для экспорта табличной информации в документ .doc. То есть документ .doc я создаю и сохраняю автоматически, используя свойства и методы СОМ-объекта. 
Однако если получившийся документ открыть в OpenOffice, то таблицы, которые есть в документе, отображаются не так как в Ворд (см. аттач КакЕсть.doc ). Нарушаются настройки ширины колонок в таблице. В то же время стоит только мне сделать ЛЮБОЕ редактирование получившегося документа (например, поставить пробел в конце документа) и сохранить его, как потом он открывается и просматривается в OpenOffice "нормально", все настройки таблицы такие же как и в Ворде (см. аттач КакНадо.doc ). Если я просто нажимаю "Сохранить" в моём получившемся документе, то это не помогает. Помогает именно редактирование и последующее сохранение. 
На основе этих наблюдений я сделал вывод, что документ формируется как-то "неправильно". Что мне надо сделать, чтобы документ формировался "правильно"? Отблагодарю в репу за пример макроса, который "исправляет" сформированный документ как надо  smile 

Автор: skyboy 9.2.2010, 13:05
а если вместо РНР кода с обращениями к СОМ написать макрос аналогичной функциональности и при помощи его создать файл. и сохранить его. то все нормально будет или нет?

Добавлено через 10 минут и 24 секунды
вобщем, если причина неизвестна, то самым быстрым методом отладки будет отсечение всего, что к ошибке не приводит, уменьшая проблему до одной-двух-трех строк кода. 
будет неплохо, если ты сам упростишь свой скрипт до минимально допустимого размера. чтоб не таблица на 14 страниц, на каждой из которых - колонтитулы и дополнительно извне таблицы текст. а таблица из одной строки. конечно,если при таком упрощении проблема останется.
а то сейчас вариантов масса:
0. некорректная работа РНР-скрипта(например, передача вместо целого числа числа с плавающей запятой - типа 7.999 вместо 8)
1. проблемы с СОМ(маловероятно, используют ведь)
2. проблемы сохранения документа, которые исправляются при повторном сохранении документа(без реального редактирования, мне кажется, редактор просто фактически не сохраняет документ - в целях оптимизации; потому тебе и "требуется" хоть что-то, но исправить)
3. спорные параметры, которые ОО не понимает. а при пересохранении используется некий режим "совместимости" в отличие от генерации через СОМ.
----------
вот. минимум - 4 точки вероятного сбоя.
а если у тебя будет скрипт на несколько строк, то каждый желающий сможет воспроизвести и ошибку станет проще обнаружить.

Добавлено через 10 минут и 55 секунд
у тебя 512 сообщений. поздравляю!

Автор: Akina 9.2.2010, 13:29
Цитата(WERITAS @  9.2.2010,  13:31 Найти цитируемый пост)
для экспорта табличной информации в документ .doc

Цитата(WERITAS @  9.2.2010,  13:31 Найти цитируемый пост)
получившийся документ открыть в OpenOffice

Попробуй использовать не DOC, а RTF.

Автор: WERITAS 10.2.2010, 11:25
Я написал код VBA, который делает всё тоже самое, что и мой СОМ-объект:
Код

Sub Export()
    
Documents.Open ("C:/pdt/test/test.mht")

ActiveWindow.View.TableGridlines = 0
ActiveDocument.PageSetup.Orientation = 1
ActiveDocument.PageSetup.TopMargin = 20
ActiveDocument.PageSetup.LeftMargin = 20
ActiveDocument.PageSetup.RightMargin = 20
ActiveDocument.PageSetup.BottomMargin = 20
Selection.ParagraphFormat.SpaceBefore = 1
ActiveWindow.View = 3

Documents(1).SaveAs "C:/pdt/test/test.doc", 1
Documents(1).Close

End Sub


Всё равно, когда открываю в OpenOffice, то таблицы кривые (((((((
мхт-файлик во вложении

Добавлено через 7 минут и 49 секунд
Попробовал задать больше параметров при сохранении написав:
Код

ActiveDocument.SaveAs FileName:="C:/pdt/test/test.doc", FileFormat:=wdFormatTemplate, _
        LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _
        :="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
        SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
        False

Не помогло! В чём же тут дело???? 

Автор: WERITAS 10.2.2010, 13:42
Начал исследовать вёрстку в мхт-файле, думал, что дело в тэгах. Удалось установить, что когда в таблице 199 тэгов <tr>, то есть 199 строк, то всё формируется нормально. Потом я открываю в ОпенОфисе сгенерированный доковский файл и у меня таблицы выглядят как в Ворде. Стоит только добавить ещё одну строку в таблицу, пускай даже пустую, то есть тэг <tr  class="Array"></tr>, снова сформировать доковский файл вышеприведённым макросом и открыть этот файл в ОпенОфисе, как опять таблицы "кривые" ((

Автор: skyboy 10.2.2010, 14:37
то есть твой РНР скрипт открывал mht и при помощи СОМ сохранял его как .doc?

Автор: WERITAS 10.2.2010, 15:04
Да, похоже что дело всё-таки в вёрстке, но закономерность я найти не могу (( Вышеописанный случай с кол-вом строк не сработал

Автор: WERITAS 10.2.2010, 15:35
Сгенерировал 2 doc-документа, менял вёрстку. В первом документе одна таблица правильно отображается, две другие неправильно. Во втором документе первые две таблицы правильно, третья - неправильно. Сохранил оба документа в xml-формате. 

1 документ
Код

<w:style w:styleId="Таблица1" w:type="table">
<w:name w:val="Таблица1"/>
<w:hidden w:val="on"/>
<w:tblPr>
<w:tblInd w:w="-44.793" w:type="dxa"/>
<w:jc w:val="left"/>
</w:tblPr>
</w:style>
<w:style w:styleId="Таблица2" w:type="table">
<w:name w:val="Таблица2"/>
<w:hidden w:val="on"/>
<w:tblPr>
<w:tblInd w:w="0" w:type="auto"/>
<w:jc w:val="left"/>
</w:tblPr>
</w:style>
<w:style w:styleId="Таблица3" w:type="table">
<w:name w:val="Таблица3"/>
<w:hidden w:val="on"/>
<w:tblPr>
<w:tblInd w:w="0" w:type="auto"/>
<w:jc w:val="left"/>
</w:tblPr>
</w:style>



2 документ
Код

<w:style w:styleId="Таблица1" w:type="table">
<w:name w:val="Таблица1"/>
<w:hidden w:val="on"/>
<w:tblPr>
<w:tblInd w:w="-44.793" w:type="dxa"/>
<w:jc w:val="left"/>
</w:tblPr>
</w:style>
<w:style w:styleId="Таблица2" w:type="table">
<w:name w:val="Таблица2"/>
<w:hidden w:val="on"/>
<w:tblPr>
<w:tblInd w:w="-150.255" w:type="dxa"/>
<w:jc w:val="left"/>
</w:tblPr>
</w:style>
<w:style w:styleId="Таблица3" w:type="table">
<w:name w:val="Таблица3"/>
<w:hidden w:val="on"/>
<w:tblPr>
<w:tblInd w:w="0" w:type="auto"/>
<w:jc w:val="left"/>
</w:tblPr>
</w:style>


Когда таблица отображается на всю ширину страницы (как мне и надо), то у неё 
Код

<w:tblInd w:w="-44.793" w:type="dxa"/>

 а когда криво отображается, то
Код

<w:tblInd w:w="0" w:type="auto"/>



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)