Russian Qt Forum
Сентябрь 21, 2024, 17:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Таблица в odf  (Прочитано 9565 раз)
RVZ
Гость
« : Апрель 25, 2011, 13:33 »

Доброе время суток всем!
Помогите кто чем может. при сохранении QTextDocument в odf игнорируются параметры BorderStyle (таблица с прозрачными границами выводятся а мне надо чтобы было видно)
даже пробовал insertHtml (с html кодом) тоже самое границ не видно, даже css не помогает
Тихий ужос что делать  Плачущий  Плачущий  Непонимающий как лечить
Пример тут http://doc.trolltech.com/qq/qq27-odfwriter.html
OpenOffice.org 3.3
QT 4.7.2
OS - windows
« Последнее редактирование: Апрель 25, 2011, 18:34 от Пантер » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Апрель 25, 2011, 17:44 »

а у границы толщина не нулевая?
Записан

Юра.
RVZ
Гость
« Ответ #2 : Апрель 26, 2011, 08:40 »

Как мне кажется не нулевая.
блок вывода таблицы выглядит так
Код
C++ (Qt)
QString text;
   QTextBlockFormat format;
   QTextCharFormat chformat;
   QTextTableFormat StTableFormat;
   StTableFormat.setBorder(10);
   //StTableFormat.setBorderBrush(Qt::cyan);
   StTableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Ridge);
   StTableFormat.setWidth(QTextLength(QTextLength::PercentageLength, 100));
   cursor.insertTable(1, 2, StTableFormat);
   QTextTable *StTable = cursor.currentTable();
   cursor.setBlockFormat(format);
   cursor.movePosition(QTextCursor::PreviousRow);
   text = QString("1");
   cursor.setCharFormat(chformat);
   cursor.insertText(text);
   cursor.movePosition(QTextCursor::NextCell);
   text = QString("2");
   StTable->appendRows(1);
 

StTableFormat.setBorder(10); - как я понял толщина границ устанавливается тут*/
StTableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Ridge); - тут пробовал разные параметры эффект 0

в для html выводл примерно такой фрагмент
Код
C++ (Qt)
   cursor.movePosition(QTextCursor::End);
   QString html;
 
   html="<html>";
   html+="<head>";
   html+="<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">";
   //html+="<link rel=\"stylesheet\" type=\"text/css\">";
   html+="<title>border</title>";
   html+="<style type=\"text/css\">";
   html+="DIV.brd {";
   html+="border: 4px double black; /* Параметры границы */";
   html+="background: #fc3; /* Цвет фона */";
   html+="padding: 10px; /* Поля вокруг текста */";
   html+="}";
   html+="table.sample {";
   html+="border: 4px double black;";
   //html+="border-spacing: 5px;";
   //html+="border-style: outset;";
   //html+="border-color: gray;";
   //html+="border-collapse: separate;";
   //html+="background-color: white;";
   html+="}";
   html+="</style>";
   html+="</head>";
   html+="<body>";
   html+="<div class=\"brd\">";
   html+="Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat.";
   html+="</div>";
   html+="</body>";
   html+="</html>";
   html+="<table class=\"sample\">";
   html+="<tr>";
   html+="<td>row 1, cell 1</td>";
   html+="<td>row 1, cell 2</td>";
   html+="</tr>";
   html+="<tr>";
   html+="<td>row 2, cell 1</td>";
   html+="<td>row 2, cell 2</td>";
   html+="</tr>";
   html+="</table>";
   cursor.insertHtml(html);
 
html+="border: 4px double black; /* Параметры границы */";
« Последнее редактирование: Апрель 26, 2011, 11:15 от RVZ » Записан
TERMIT88
Гость
« Ответ #3 : Июнь 27, 2011, 17:47 »

Мне нада заполнить таблицу вида http://imagepost.ru/images/1/qu/1qu_3.JPG . Но для начала ее нада построить. Есть шаблон этой таблицы в формате odf, но загрузки шаблонов как я понял нету. Так что придется рисовать самому. Рисую через QTextTableFormat. Но даже не получается сделать колонки разной ширины, при выгрузке в odf все форматирование ломается.  Вообще реально такую таблицу нарисовать средствами QTextTableFormat?) Спасибо
Записан
RVZ
Гость
« Ответ #4 : Июнь 27, 2011, 19:21 »

Не то чтобы ответ но по пытаюсь поделится своим горьким опытом.
1) Шаблонов нет но хотя с какой стороны посмотреть можно распокавать odf (тупо зипом) и работать с xml файлами (так решалась проблема с границами таблиц в одном примере)

Много всего чего перебробывал но так и не получилось заставить опен офис видить форматирование (до xml не добрался хотя при подпиливании xml.ку руками видно что это вполне возможно) причем если расширение файла поменять с odf на html и открыть его браузером то форматирование нормальное (в данный момент пользуюсь таким методом жаль что его на долго не хватит)
как врянт попробывать другой офис с поддержкой odf (я не пробывал пока еще) ведь почемуто браузер понимает стиль
в общем пока отложил до лучших времен  Злой
Записан
TERMIT88
Гость
« Ответ #5 : Июнь 28, 2011, 06:08 »

пробовал я LibreOffice и несколько вариантов ОО...Везде одиноково криво
Записан
RVZ
Гость
« Ответ #6 : Июнь 28, 2011, 14:52 »

Пример по протезированию здесь Улыбающийся
http://sourceforge.net/p/mw2odf/home/Home/

В общем дальше записки охотника (буду живодерить QTextOdfWriter) учитывая мой уровень  Смеющийся думаю это затянется
итак

экспериментировать решил с приведенным выше кодом немного его поменяв
Код
C++ (Qt)
void TestsToOdf::test(){
       QString text;
       QTextBlockFormat format;
       QTextCharFormat chformat;
       QTextTableFormat StTableFormat;
       QTextTableCell cell;
       QVector<QTextLength> constraints;
       constraints << QTextLength(QTextLength::PercentageLength, 20);
       constraints << QTextLength(QTextLength::PercentageLength, 80);
       StTableFormat.setBorder(10);
       //StTableFormat.setBorderBrush(Qt::cyan);
 
       text = QString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
       cursor.insertText(text);
 
       StTableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Ridge);
       StTableFormat.setWidth(QTextLength(QTextLength::PercentageLength, 100));
       StTableFormat.setColumnWidthConstraints(constraints);
       cursor.insertTable(1, 2, StTableFormat);
       QTextTable *StTable = cursor.currentTable();
       StTable->setName("StTable");
       //StTable->setObjectName("StTableObject");
       cursor.setBlockFormat(format);
       cursor.movePosition(QTextCursor::PreviousRow);
       text = QString("1");
       cursor.setCharFormat(chformat);
       cursor.insertText(text);
       cursor.movePosition(QTextCursor::NextCell);
       text = QString("2");
       StTable->appendRows(1);
       cursor.movePosition(QTextCursor::End);
}
 
данный метод вызывал два раза чтобы получить две одинаковые таблицы в документе. после чего полученный одф распаковал zip.ОМ и обнаружилась горстка файлов где основное зодчество в content.xml следущего содержания
Код
XML
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0">
 <office:automatic-styles>
   <style:style style:name="c0" style:family="text">
     <style:text-properties fo:font-family="Sans"/>
   </style:style>
   <style:style style:name="p1" style:family="paragraph">
     <style:paragraph-properties/>
   </style:style>
   <style:style style:name="s2" style:family="section">
     <style:section-properties/>
   </style:style>
   <style:style style:name="T3" style:family="table">
     <style:table-properties/>
   </style:style>
   <style:style style:name="T5" style:family="table">
     <style:table-properties/>
   </style:style>
 </office:automatic-styles>
 <office:body>
   <office:text>
     <text:p text:style-name="p1"><text:span text:style-name="c0">FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</text:span></text:p>
     <table:table>
       <table:table-column table:number-columns-repeated="2"/>
       <table:table-row>
         <table:table-cell table:style-name="T3">
           <text:p text:style-name="p1"><text:span text:style-name="c0">1</text:span></text:p>
         </table:table-cell>
         <table:table-cell table:style-name="T3">
           <text:p text:style-name="p1"/>
         </table:table-cell>
       </table:table-row>
       <table:table-row>
         <table:table-cell table:style-name="T3">
           <text:p text:style-name="p1"/>
         </table:table-cell>
         <table:table-cell table:style-name="T3">
           <text:p text:style-name="p1"/>
         </table:table-cell>
       </table:table-row>
     </table:table>
     <text:p text:style-name="p1"><text:span text:style-name="c0">FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</text:span></text:p>
     <table:table>
       <table:table-column table:number-columns-repeated="2"/>
       <table:table-row>
         <table:table-cell table:style-name="T5">
           <text:p text:style-name="p1"><text:span text:style-name="c0">1</text:span></text:p>
         </table:table-cell>
         <table:table-cell table:style-name="T5">
           <text:p text:style-name="p1"/>
         </table:table-cell>
       </table:table-row>
       <table:table-row>
         <table:table-cell table:style-name="T5">
           <text:p text:style-name="p1"/>
         </table:table-cell>
         <table:table-cell table:style-name="T5">
           <text:p text:style-name="p1"/>
         </table:table-cell>
       </table:table-row>
     </table:table>
     <text:p text:style-name="p1"/>
   </office:text>
 </office:body>
</office:document-content>
 

состояние строк
 <style:style style:name="T3" style:family="table">
      <style:table-properties/>
  </style:style>
тонко намикает на то что чембы не открывать границ и форматирования не будет стили пустые  Непонимающий  Плачущий  Плачущий
решил посмотреть как должно быть. Открыл сотворенный файл опенОфисом ручками поставил границы и изменил размер первого (из всех двух) столбца первой таблицы. после сохранения и распаковки получилось следующие
Код
XML
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" office:version="1.2" grddl:transformation="http://docs.oasis-open.org/office/1.2/xslt/odf2rdf.xsl">
<office:scripts/>
<office:font-face-decls>
 <style:font-face style:name="Sans" svg:font-family="Sans"/>
 <style:font-face style:name="Times New Roman" svg:font-family="&apos;Times New Roman&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
 <style:font-face style:name="Arial Unicode MS" svg:font-family="&apos;Arial Unicode MS&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
 <style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-family-generic="system" style:font-pitch="variable"/>
</office:font-face-decls>
<office:automatic-styles>
 <style:style style:name="Table1" style:family="table">
  <style:table-properties style:width="17.013cm" fo:margin-left="0cm" fo:margin-right="-0.012cm" table:align="margins"/>
 </style:style>
 <style:style style:name="Table1.A" style:family="table-column">
  <style:table-column-properties style:column-width="1.508cm" style:rel-column-width="855*"/>
 </style:style>
 <style:style style:name="Table1.B" style:family="table-column">
  <style:table-column-properties style:column-width="15.505cm" style:rel-column-width="8790*"/>
 </style:style>
 <style:style style:name="Table1.A1" style:family="table-cell">
  <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.002cm solid #000000" fo:border-right="none" fo:border-top="0.002cm solid #000000" fo:border-bottom="0.002cm solid #000000"/>
 </style:style>
 <style:style style:name="Table1.B1" style:family="table-cell">
  <style:table-cell-properties fo:padding="0.097cm" fo:border="0.002cm solid #000000"/>
 </style:style>
 <style:style style:name="Table1.A2" style:family="table-cell">
  <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.002cm solid #000000" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.002cm solid #000000"/>
 </style:style>
 <style:style style:name="Table1.B2" style:family="table-cell">
  <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.002cm solid #000000" fo:border-right="0.002cm solid #000000" fo:border-top="none" fo:border-bottom="0.002cm solid #000000"/>
 </style:style>
 <style:style style:name="Table2" style:family="table">
  <style:table-properties style:width="17cm" table:align="margins"/>
 </style:style>
 <style:style style:name="Table2.A" style:family="table-column">
  <style:table-column-properties style:column-width="8.5cm" style:rel-column-width="32767*"/>
 </style:style>
 <style:style style:name="Table2.B" style:family="table-column">
  <style:table-column-properties style:column-width="8.5cm" style:rel-column-width="32768*"/>
 </style:style>
 <style:style style:name="Table2.A1" style:family="table-cell">
  <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.002cm solid #000000" fo:border-right="none" fo:border-top="0.002cm solid #000000" fo:border-bottom="0.002cm solid #000000"/>
 </style:style>
 <style:style style:name="Table2.B1" style:family="table-cell">
  <style:table-cell-properties fo:padding="0.097cm" fo:border="0.002cm solid #000000"/>
 </style:style>
 <style:style style:name="Table2.A2" style:family="table-cell">
  <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.002cm solid #000000" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.002cm solid #000000"/>
 </style:style>
 <style:style style:name="Table2.B2" style:family="table-cell">
  <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.002cm solid #000000" fo:border-right="0.002cm solid #000000" fo:border-top="none" fo:border-bottom="0.002cm solid #000000"/>
 </style:style>
 <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard">
  <style:text-properties style:font-name="Sans"/>
 </style:style>
</office:automatic-styles>
<office:body>
 <office:text>
  <text:sequence-decls>
   <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
   <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
   <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
   <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
  </text:sequence-decls>
  <text:p text:style-name="P1">FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</text:p>
  <table:table table:name="Table1" table:style-name="Table1">
   <table:table-column table:style-name="Table1.A"/>
   <table:table-column table:style-name="Table1.B"/>
   <table:table-row>
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
     <text:p text:style-name="P1">1</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B1" office:value-type="string">
     <text:p text:style-name="Standard"/>
    </table:table-cell>
   </table:table-row>
   <table:table-row>
    <table:table-cell table:style-name="Table1.A2" office:value-type="string">
     <text:p text:style-name="Standard"/>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B2" office:value-type="string">
     <text:p text:style-name="Standard"/>
    </table:table-cell>
   </table:table-row>
  </table:table>
  <text:p text:style-name="P1">FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</text:p>
  <table:table table:name="Table2" table:style-name="Table2">
   <table:table-column table:style-name="Table2.A"/>
   <table:table-column table:style-name="Table2.B"/>
   <table:table-row>
    <table:table-cell table:style-name="Table2.A1" office:value-type="string">
     <text:p text:style-name="P1">1</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table2.B1" office:value-type="string">
     <text:p text:style-name="Standard"/>
    </table:table-cell>
   </table:table-row>
   <table:table-row>
    <table:table-cell table:style-name="Table2.A2" office:value-type="string">
     <text:p text:style-name="Standard"/>
    </table:table-cell>
    <table:table-cell table:style-name="Table2.B2" office:value-type="string">
     <text:p text:style-name="Standard"/>
    </table:table-cell>
   </table:table-row>
  </table:table>
  <text:p text:style-name="Standard"/>
 </office:text>
</office:body>
</office:document-content>
 
Только а оригинале не Table1.A например а Таблица1.A (наверное по тому что на сайте офиса предупреждали что он нашими перепилен спецально)
« Последнее редактирование: Июнь 29, 2011, 00:10 от RVZ » Записан
RVZ
Гость
« Ответ #7 : Июль 02, 2011, 00:11 »

Метод write из qtextdocumentwriter.cpp
Код
C++ (Qt)
bool QTextDocumentWriter::write(const QTextDocument *document)
{
   QByteArray suffix;
 
   if (d->device && d->format.isEmpty()) {
       // if there's no format, see if device is a file, and if so, find
       // the file suffix
       if (QFile *file = qobject_cast<QFile *>(d->device))
           suffix = QFileInfo(file->fileName()).suffix().toLower().toLatin1();
   }
 
   QByteArray format = !d->format.isEmpty() ? d->format.toLower() : suffix;
 
#ifndef QT_NO_TEXTODFWRITER
   if (format == "odf" || format == "opendocumentformat" || format == "odt") {
       QTextOdfWriter writer(*document, d->device);
#ifndef QT_NO_TEXTCODEC
       writer.setCodec(d->codec);
#endif
       return writer.writeAll();
   }
#endif // QT_NO_TEXTODFWRITER
 
#ifndef QT_NO_TEXTHTMLPARSER
   if (format == "html" || format == "htm") {
       if (!d->device->isWritable() && ! d->device->open(QIODevice::WriteOnly)) {
           qWarning() << "QTextDocumentWriter::write: the device can not be opened for writing";
           return false;
       }
       QTextStream ts(d->device);
#ifndef QT_NO_TEXTCODEC
       ts.setCodec(d->codec);
       ts << document->toHtml(d->codec->name());
#endif
       d->device->close();
       return true;
   }
#endif
   if (format == "txt" || format == "plaintext") {
       if (!d->device->isWritable() && ! d->device->open(QIODevice::WriteOnly)) {
           qWarning() << "QTextDocumentWriter::write: the device can not be opened for writing";
           return false;
       }
       QTextStream ts(d->device);
#ifndef QT_NO_TEXTCODEC
       ts.setCodec(d->codec);
#endif
       ts << document->toPlainText();
       d->device->close();
       return true;
   }
 
   return false;
}
 
Непонимающий жуть какая  Шокированный
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.244 секунд. Запросов: 23.