[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    koffice/filters/kspread/excel/import
From:       Sebastian Sauer <mail () dipe ! org>
Date:       2010-03-02 21:05:11
Message-ID: 1267563911.119749.17438.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1098096 by sebsauer:

and the first pie chart loaded from a Excel 2003 shows up. Some things are hardcoded \
and some things are missing. More later.

 M  +177 -31   excelimport.cc  


--- trunk/koffice/filters/kspread/excel/import/excelimport.cc #1098095:1098096
@@ -133,6 +133,7 @@
     QList<QString> sheetStyles;
     QHash<FormatFont, QString> fontStyles;
     QString subScriptStyle, superScriptStyle;
+    QList<ChartObject*> charts;
     
     QHash<int,int> rowsRepeatedHash;
     int rowsRepeated(Row* row, int rowIndex);
@@ -143,7 +144,6 @@
     bool createStyles(KoOdfWriteStore* store, KoXmlWriter* manifestWriter);
     bool createContent(KoOdfWriteStore* store);
     bool createMeta(KoOdfWriteStore* store);
-    bool createManifest(KoOdfWriteStore* store, KoXmlWriter* manifestWriter);
     bool createSettings(KoOdfWriteStore* store);
 
     int sheetFormatIndex;
@@ -168,6 +168,7 @@
     void processFormat(Format* format, KoGenStyle& style);
     QString processValueFormat(const QString& valueFormat);
     void processFontFormat(const FormatFont& font, KoGenStyle& style);
+    void processCharts(KoXmlWriter* manifestWriter);
 };
 
 ExcelImport::ExcelImport(QObject* parent, const QStringList&)
@@ -269,7 +270,7 @@
         delete d->storeout;
         return KoFilter::CreationError;
     }
-    
+
     // store settings
     if (!d->createSettings(&oasisStore)) {
         kWarning() << "Couldn't open the file 'settings.xml'.";
@@ -278,14 +279,14 @@
         return KoFilter::CreationError;
     }
 
-    // store document manifest
-    if (!d->createManifest(&oasisStore, manifestWriter)) {
-        kWarning() << "Couldn't open the file 'META-INF/manifest.xml'.";
-        delete d->workbook;
-        delete d->storeout;
-        return KoFilter::CreationError;
-    }
+    manifestWriter->addManifestEntry("meta.xml", "text/xml");
+    manifestWriter->addManifestEntry("styles.xml", "text/xml");
+    manifestWriter->addManifestEntry("content.xml", "text/xml");
+    manifestWriter->addManifestEntry("settings.xml", "text/xml");
 
+    d->processCharts(manifestWriter);
+    oasisStore.closeManifestWriter();
+
     // we are done!
     delete d->workbook;
     delete d->styles;
@@ -405,7 +406,23 @@
     stylesWriter->addAttribute("xmlns:draw", \
                "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0");
     stylesWriter->addAttribute("xmlns:fo", \
                "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0");
     stylesWriter->addAttribute("xmlns:svg", \
                "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0");
-    stylesWriter->addAttribute("office:version", "1.0");
+    stylesWriter->addAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
+    stylesWriter->addAttribute("xmlns:chart", \
"urn:oasis:names:tc:opendocument:xmlns:chart:1.0"); +    \
stylesWriter->addAttribute("xmlns:dc", "http://purl.org/dc/elements/1.1/"); +    \
stylesWriter->addAttribute("xmlns:meta", \
"urn:oasis:names:tc:opendocument:xmlns:meta:1.0"); +    \
stylesWriter->addAttribute("xmlns:number", \
"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"); +    \
//stylesWriter->addAttribute("xmlns:presentation", \
"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0"); +    \
//stylesWriter->addAttribute("xmlns:dr3d", \
"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"); +    \
stylesWriter->addAttribute("xmlns:math", "http://www.w3.org/1998/Math/MathML"); +    \
//stylesWriter->addAttribute("xmlns:form", \
"urn:oasis:names:tc:opendocument:xmlns:form:1.0"); +    \
//stylesWriter->addAttribute("xmlns:script", \
"urn:oasis:names:tc:opendocument:xmlns:script:1.0"); +    \
//stylesWriter->addAttribute("xmlns:dom", "http://www.w3.org/2001/xml-events"); +    \
//stylesWriter->addAttribute("xmlns:xforms", "http://www.w3.org/2002/xforms"); +    \
//stylesWriter->addAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); +    \
//stylesWriter->addAttribute("xmlns:xsi", \
"http://www.w3.org/2001/XMLSchema-instance"); +    \
stylesWriter->addAttribute("xmlns:of", \
"urn:oasis:names:tc:opendocument:xmlns:of:1.2"); +    \
//stylesWriter->addAttribute("xmlns:rdfa", \
"http://docs.oasis-open.org/opendocument/meta/rdfa#"); +    \
stylesWriter->addAttribute("office:version", "1.2");  
     mainStyles->saveOdfMasterStyles(stylesWriter);
     mainStyles->saveOdfDocumentStyles(stylesWriter); // office:style
@@ -549,16 +566,6 @@
     return store->store()->close();
 }
 
-// Writes the manifest into the manifest.xml
-bool ExcelImport::Private::createManifest(KoOdfWriteStore* store, KoXmlWriter* \
                manifestWriter)
-{
-    manifestWriter->addManifestEntry("meta.xml", "text/xml");
-    manifestWriter->addManifestEntry("styles.xml", "text/xml");
-    manifestWriter->addManifestEntry("content.xml", "text/xml");
-
-    return store->closeManifestWriter();
-}
-
 // Processes the workbook content. The workbook is the top-level element for \
content.  void ExcelImport::Private::processWorkbookForBody(KoOdfWriteStore* store, \
Workbook* workbook, KoXmlWriter* xmlWriter)  {
@@ -1447,41 +1454,180 @@
     }
 
     // handle charts
-    static int externalObject = 0;
-    int externalObj = ++externalObject;
     foreach(ChartObject *chart, cell->charts()) {
         //<draw:frame table:end-cell-address="Sheet1.I17" table:end-x="0.5217in" \
table:end-y="0.1382in" draw:z-index="0" draw:style-name="gr1" svg:width="3.1492in" \
                svg:height="2.7555in" svg:x="0.0398in" svg:y="0.0394in">
         //<draw:object draw:notify-on-update-of-ranges="Sheet1.C2:Sheet1.E2" \
xlink:href="./Object 1" xlink:type="simple" xlink:show="embed" \
xlink:actuate="onLoad"/>  //</draw:frame>
+        this->charts << chart;
         DrawingObject* drawobj = chart->drawingObject();
         Q_ASSERT(drawobj);
-        const QString href = QString("./Object %1").arg(externalObj);
+        const QString href = QString("./Object%1").arg(this->charts.count());
         xmlWriter->startElement("draw:frame");
+
+#if 0 //FIXME
         xmlWriter->addAttribute("table:end-cell-address", \
                columnName(drawobj->m_colR) + QString::number(drawobj->m_rwB));
         xmlWriter->addAttribute("svg:x", \
                QString::number(columnWidth(cell->sheet(),drawobj->m_colL,drawobj->m_dxL))+"pt");
                
         xmlWriter->addAttribute("svg:y", \
                QString::number(rowHeight(cell->sheet(),drawobj->m_rwT,drawobj->m_dyT))+"pt");
                
         xmlWriter->addAttribute("svg:width", \
QString::number(columnWidth(cell->sheet(),drawobj->m_colR-drawobj->m_colL,drawobj->m_dxR))+"pt");
                
         xmlWriter->addAttribute("svg:height", \
QString::number(rowHeight(cell->sheet(),drawobj->m_rwB-drawobj->m_rwT,drawobj->m_dyB))+"pt");
 +#else
+        xmlWriter->addAttribute("table:end-cell-address", "Sheet1.H20");
+        xmlWriter->addAttribute("table:end-x", "0.2953in");
+        xmlWriter->addAttribute("table:end-y", "0.0232in");
+        xmlWriter->addAttribute("draw:z-index", "0");
+        xmlWriter->addAttribute("svg:x", "0.702in");
+        xmlWriter->addAttribute("svg:y", "0.1016in");
+        xmlWriter->addAttribute("svg:width", "3.1492in");
+        xmlWriter->addAttribute("svg:height", "2.7555in");
+#endif
         xmlWriter->startElement("draw:object");
-        //xmlWriter->addAttribute("draw:notify-on-update-of-ranges", );
+        xmlWriter->addAttribute("draw:notify-on-update-of-ranges", \
"Sheet1.D2:Sheet1.F2");  xmlWriter->addAttribute("xlink:href", href);
         xmlWriter->addAttribute("xlink:type", "simple");
         xmlWriter->addAttribute("xlink:show", "embed");
         xmlWriter->addAttribute("xlink:actuate", "onLoad");
         xmlWriter->endElement(); // draw:object
+
         xmlWriter->endElement(); // draw:frame
-
-#if 0 //TODO
-        // now write the external object
-        KoEmbeddedDocumentSaver embeddedSaver;
-        //d->storeout
-        KoDocument::SavingContext documentContext(store, embeddedSaver);
-#endif
     }
 
     xmlWriter->endElement(); //  table:[covered-]table-cell
 }
 
+void ExcelImport::Private::processCharts(KoXmlWriter* manifestWriter)
+{
+    KoGenStyles styles;
+    KoGenStyles mainStyles;
+
+    for(int i = 0; i < this->charts.count(); ++i) {
+        ChartObject *chart = this->charts[i];
+        const QString href = QString("Object%1").arg(i+1); // don't use relative \
directories here +        this->storeout->pushDirectory();
+        this->storeout->enterDirectory(href);
+
+        KoOdfWriteStore s(this->storeout);
+        //KoXmlWriter* manifestWriter = \
s.manifestWriter("application/vnd.oasis.opendocument.spreadsheet"); +        \
KoXmlWriter* bodyWriter = s.bodyWriter(); +        KoXmlWriter* contentWriter = \
s.contentWriter(); +        Q_ASSERT(bodyWriter && contentWriter);
+        bodyWriter->startElement("office:body");
+        bodyWriter->startElement("office:chart");
+        bodyWriter->startElement("chart:chart"); //<chart:chart svg:width="8cm" \
svg:height="7cm" chart:class="chart:circle" chart:style-name="ch1"> +
+bodyWriter->addAttribute("chart:class", "chart:circle"); //FIXME
+bodyWriter->addAttribute("svg:width", "8cm"); //FIXME
+bodyWriter->addAttribute("svg:height", "7cm"); //FIXME
+
+        //KoGenStyle style(KoGenStyle::StyleGraphicAuto, "chart");
+        //style.addProperty("draw:stroke", "solid");
+        //style.addProperty("draw:fill-color", "#ff0000");
+        //bodyWriter->addAttribute("chart:style-name", styles.lookup(style, "ch"));
+        bodyWriter->addAttribute("chart:style-name", "ch94");
+
+        //<chart:legend chart:legend-position="end" svg:x="7.031cm" svg:y="2.843cm" \
chart:style-name="ch2"/> +
+        bodyWriter->startElement("chart:plot-area"); //<chart:plot-area \
chart:style-name="ch3" table:cell-range-address="Sheet1.C2:Sheet1.E2" svg:x="0.16cm" \
svg:y="0.14cm" +
+        //KoGenStyle chartstyle(KoGenStyle::StyleChartAuto, "chart");
+        //chartstyle.addProperty("chart:include-hidden-cells", "false");
+        //chartstyle.addProperty("chart:auto-position", "true");
+        //chartstyle.addProperty("chart:auto-size", "true");
+        //chartstyle.addProperty("chart:series-source", "rows");
+        //chartstyle.addProperty("chart:sort-by-x-values", "false");
+        //chartstyle.addProperty("chart:right-angled-axes", "true");
+        //bodyWriter->addAttribute("chart:style-name", styles.lookup(chartstyle, \
"ch")); +        bodyWriter->addAttribute("chart:style-name", "ch98");
+
+bodyWriter->addAttribute("table:cell-range-address", "Sheet1.C2:Sheet1.E2"); //FIXME
+bodyWriter->addAttribute("svg:x", "0.16cm"); //FIXME
+bodyWriter->addAttribute("svg:y", "0.14cm"); //FIXME
+bodyWriter->addAttribute("svg:width", "6.712cm"); //FIXME
+bodyWriter->addAttribute("svg:height", "6.58cm"); //FIXME
+
+        //<chart:axis chart:dimension="x" chart:name="primary-x" \
chart:style-name="ch4"/> +        //<chart:axis chart:dimension="y" \
chart:name="primary-y" chart:style-name="ch5"><chart:grid chart:style-name="ch6" \
chart:class="major"/></chart:axis> +
+        bodyWriter->startElement("chart:series"); //<chart:series \
chart:style-name="ch7" chart:values-cell-range-address="Sheet1.C2:Sheet1.E2" \
chart:class="chart:circle"> +
+        //KoGenStyle seriesstyle(KoGenStyle::StyleGraphicAuto, "chart");
+        //seriesstyle.addProperty("draw:stroke", "solid");
+        //seriesstyle.addProperty("draw:fill-color", "#ff0000");
+        //bodyWriter->addAttribute("chart:style-name", styles.lookup(seriesstyle, \
"ch")); +
+bodyWriter->addAttribute("chart:values-cell-range-address", "Sheet1.C2:Sheet1.E2"); \
//FIXME +bodyWriter->addAttribute("chart:class", "chart:circle"); //FIXME
+for(int j=0; j < 3; ++j) {
+    //KoGenStyle gs(KoGenStyle::StyleGraphicAuto, "chart");
+    //gs.addProperty("draw:fill-color", "#004586");
+    bodyWriter->startElement("chart:data-point");
+    //bodyWriter->addAttribute("chart-style-name", styles.lookup(gs, "ch"));
+    bodyWriter->addAttribute("chart-style-name", "ch97");
+    bodyWriter->endElement();
+}
+        //<chart:data-point chart:style-name="ch8"/>
+        //<chart:data-point chart:style-name="ch9"/>
+        //<chart:data-point chart:style-name="ch10"/>
+        bodyWriter->endElement(); // chart:series
+        //<chart:wall chart:style-name="ch11"/>
+        //<chart:floor chart:style-name="ch12"/>
+        bodyWriter->endElement(); // chart:plot-area
+
+        bodyWriter->endElement(); // chart:chart
+        bodyWriter->endElement(); // office:chart
+        bodyWriter->endElement(); // office:body
+
+        styles.saveOdfAutomaticStyles(contentWriter, false);
+        s.closeContentWriter();
+
+        if(this->storeout->open("styles.xml")) {
+            KoStoreDevice dev(this->storeout);
+            KoXmlWriter* stylesWriter = new KoXmlWriter(&dev);
+
+            stylesWriter->startDocument("office:document-styles");
+            stylesWriter->startElement("office:document-styles");
+            stylesWriter->addAttribute("xmlns:office", \
"urn:oasis:names:tc:opendocument:xmlns:office:1.0"); +            \
stylesWriter->addAttribute("xmlns:style", \
"urn:oasis:names:tc:opendocument:xmlns:style:1.0"); +            \
stylesWriter->addAttribute("xmlns:text", \
"urn:oasis:names:tc:opendocument:xmlns:text:1.0"); +            \
stylesWriter->addAttribute("xmlns:table", \
"urn:oasis:names:tc:opendocument:xmlns:table:1.0"); +            \
stylesWriter->addAttribute("xmlns:draw", \
"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"); +            \
stylesWriter->addAttribute("xmlns:fo", \
"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"); +            \
stylesWriter->addAttribute("xmlns:svg", \
"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"); +            \
stylesWriter->addAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); +          \
stylesWriter->addAttribute("xmlns:chart", \
"urn:oasis:names:tc:opendocument:xmlns:chart:1.0"); +            \
stylesWriter->addAttribute("xmlns:dc", "http://purl.org/dc/elements/1.1/"); +         \
stylesWriter->addAttribute("xmlns:meta", \
"urn:oasis:names:tc:opendocument:xmlns:meta:1.0"); +            \
stylesWriter->addAttribute("xmlns:number", \
"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"); +            \
//stylesWriter->addAttribute("xmlns:presentation", \
"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0"); +            \
//stylesWriter->addAttribute("xmlns:dr3d", \
"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"); +            \
stylesWriter->addAttribute("xmlns:math", "http://www.w3.org/1998/Math/MathML"); +     \
//stylesWriter->addAttribute("xmlns:form", \
"urn:oasis:names:tc:opendocument:xmlns:form:1.0"); +            \
//stylesWriter->addAttribute("xmlns:script", \
"urn:oasis:names:tc:opendocument:xmlns:script:1.0"); +            \
//stylesWriter->addAttribute("xmlns:dom", "http://www.w3.org/2001/xml-events"); +     \
//stylesWriter->addAttribute("xmlns:xforms", "http://www.w3.org/2002/xforms"); +      \
//stylesWriter->addAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); +      \
//stylesWriter->addAttribute("xmlns:xsi", \
"http://www.w3.org/2001/XMLSchema-instance"); +            \
stylesWriter->addAttribute("xmlns:of", \
"urn:oasis:names:tc:opendocument:xmlns:of:1.2"); +            \
//stylesWriter->addAttribute("xmlns:rdfa", \
"http://docs.oasis-open.org/opendocument/meta/rdfa#"); +            \
stylesWriter->addAttribute("office:version", "1.2"); +
+            mainStyles.saveOdfMasterStyles(stylesWriter);
+            mainStyles.saveOdfDocumentStyles(stylesWriter); // office:style
+            mainStyles.saveOdfAutomaticStyles(stylesWriter, false); // \
office:automatic-styles +
+            stylesWriter->endElement(); // office:document-styles
+            stylesWriter->endDocument();
+            delete stylesWriter;
+            this->storeout->close();
+        }
+
+        manifestWriter->addManifestEntry(href, \
"application/vnd.oasis.opendocument.chart"); +        \
manifestWriter->addManifestEntry(QString("%1/styles.xml").arg(href), "text/xml"); +   \
manifestWriter->addManifestEntry(QString("%1/content.xml").arg(href), "text/xml"); +
+        this->storeout->popDirectory();
+    }
+}
+
 // Processes style for a cell within a sheet.
 void ExcelImport::Private::processCellForStyle(Cell* cell, KoXmlWriter* xmlWriter)
 {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic