34
51
#include <MsooXmlReader_p.h>
35
52
#include <MsooXmlUtils.h>
37
XlsxXmlDrawingReaderContext::XlsxXmlDrawingReaderContext(XlsxXmlWorksheetReaderContext* _worksheetReaderContext)
38
: MSOOXML::MsooXmlReaderContext()
53
#include <MsooXmlContentTypes.h>
54
#include <MsooXmlRelationships.h>
55
#include <KoXmlWriter.h>
57
// calculates the column width in pixels
58
int columnWidth2(unsigned long col, unsigned long dx = 0, qreal defaultColumnWidth = 8.43) {
59
QFont font("Arial", 10);
60
QFontMetricsF fm(font);
61
const qreal characterWidth = fm.width("h");
62
defaultColumnWidth *= characterWidth;
63
return (defaultColumnWidth * col) + (dx / 1024.0 * defaultColumnWidth);
66
// calculates the row height in pixels
67
int rowHeight2(unsigned long row, unsigned long dy = 0, qreal defaultRowHeight = 12.75)
69
return defaultRowHeight * row + dy;
72
// Returns A for 1, B for 2, C for 3, etc.
73
QString columnName2(uint column)
78
for (unsigned limit = 26; column >= limit + offset; limit *= 26, digits++)
80
for (unsigned col = column - offset; digits; --digits, col /= 26)
81
s.prepend(QChar('A' + (col % 26)));
85
KoXmlWriter* XlsxDrawingObject::setShape(XlsxShape* shape)
91
m_shapeBody = new KoXmlWriter(new QBuffer);
95
void XlsxDrawingObject::save(KoXmlWriter* xmlWriter)
99
// nothing to do for us
102
m_chart->m_chartExport->saveIndex(xmlWriter);
105
xmlWriter->startElement("draw:g");
106
xmlWriter->addAttribute("draw:name", "SmartArt Shapes Group");
107
xmlWriter->addAttribute("draw:z-index", "0");
108
xmlWriter->addAttribute("table:end-cell-address", fromCellAddress());
109
//xmlWriter->addAttribute("table:end-x", "0.6016in");
110
//xmlWriter->addAttribute("table:end-y", "0.1339in");
111
m_diagram->saveIndex(xmlWriter, positionRect());
112
xmlWriter->endElement(); // draw:g
115
m_picture->saveXml(xmlWriter);
118
Q_ASSERT(m_shapeBody);
119
QByteArray data = static_cast<QBuffer*>(m_shapeBody->device())->buffer().constData();
120
xmlWriter->addCompleteElement(data);
127
QRect XlsxDrawingObject::positionRect() const
129
QRect rect(QPoint(0,0),QSize(0,0));
130
if(m_positions.contains(FromAnchor)) {
131
qreal defaultColumnWidth = 8.43;
132
qreal defaultRowHeight = 12.75;
134
Position f1 = m_positions[FromAnchor];
135
rect.setX( columnWidth2(f1.m_col-1, 0 /*f.m_colOff*/, defaultColumnWidth) );
136
rect.setY( rowHeight2(f1.m_row-1, 0 /*f.m_rowOff*/, defaultRowHeight) );
137
if(m_positions.contains(ToAnchor)) {
138
Position f2 = m_positions[ToAnchor];
139
if(f2.m_col > 0 && f2.m_row > 0) {
140
rect.setWidth( columnWidth2( f2.m_col - f1.m_col - 1, 0 /*t.m_colOff*/, defaultColumnWidth) );
141
rect.setHeight( rowHeight2( f2.m_row - f1.m_row - 1, 0 /*t.m_rowOff*/, defaultRowHeight) );
148
QString XlsxDrawingObject::cellAddress(const QString &sheetname, int row, int column) const
151
if(!sheetname.isEmpty())
152
result += sheetname + '.';
153
result += columnName2(column) + QString::number(row);
157
QString XlsxDrawingObject::fromCellAddress() const
159
if(!m_positions.contains(FromAnchor)) return QString();
160
Position f = m_positions[FromAnchor];
161
return cellAddress(m_sheet->m_name, f.m_row, f.m_col);
164
QString XlsxDrawingObject::toCellAddress() const
166
if(!m_positions.contains(ToAnchor)) return QString();
167
Position f = m_positions[ToAnchor];
168
return cellAddress(m_sheet->m_name, f.m_row, f.m_col);
171
XlsxXmlDrawingReaderContext::XlsxXmlDrawingReaderContext(XlsxXmlWorksheetReaderContext* _worksheetReaderContext, Sheet* _sheet, const QString& _path, const QString& _file)
172
: MSOOXML::MsooXmlReaderContext(_worksheetReaderContext->relationships)
173
, import(_worksheetReaderContext->import)
176
, themes((_worksheetReaderContext->themes))
39
177
, worksheetReaderContext(_worksheetReaderContext)
69
211
if (!expectEl("xdr:wsDr")) {
70
212
return KoFilter::WrongFormat;
74
QXmlStreamReader::TokenType tokenType = readNext();
75
if(tokenType == QXmlStreamReader::Invalid || tokenType == QXmlStreamReader::EndDocument) break;
216
QXmlStreamReader::TokenType tokenType = readNext();
217
if(tokenType == QXmlStreamReader::Invalid || tokenType == QXmlStreamReader::EndDocument) break;
218
if (isStartElement()) {
219
const QStringRef s = qualifiedName();
220
if ( s == "xdr:oneCellAnchor" || s == "xdr:twoCellAnchor" || s == "xdr:absoluteAnchor" || s == "xdr:grpSp" ) {
226
m_context->saveCurrentCellData();
233
#define CURRENT_EL twoCellAnchor
234
KoFilter::ConversionStatus XlsxXmlDrawingReader::read_anchor(const QStringRef&)
238
class DrawingObjectGuard { // like QScopedPointer but sets the pointer to NULL afterwards
240
DrawingObjectGuard(XlsxDrawingObject** obj) : m_obj(obj) {}
241
~DrawingObjectGuard() { delete *m_obj; *m_obj = 0; }
243
XlsxDrawingObject** m_obj;
246
Q_ASSERT(!m_currentDrawingObject);
247
m_currentDrawingObject = new XlsxDrawingObject(m_context->sheet);
248
DrawingObjectGuard _guard(&m_currentDrawingObject);
251
QXmlStreamReader::TokenType tokenType = readNext();
252
if(tokenType == QXmlStreamReader::Invalid || tokenType == QXmlStreamReader::EndDocument) break;
253
BREAK_IF_END_OF(CURRENT_EL);
76
254
if (isStartElement()) {
77
255
// twoCellAnchor does define the 'from' and 'to' elements which do define the anchor-points
79
257
ELSE_TRY_READ_IF(to)
80
// the reference to a chart
81
ELSE_TRY_READ_IF_NS(c, chart)
260
// the reference to a picture
261
ELSE_TRY_READ_IF(pic)
263
ELSE_TRY_READ_IF(graphicFrame)
267
if (m_currentDrawingObject->m_type != XlsxDrawingObject::Unknown) {
268
if (m_currentDrawingObject->m_positions.contains(XlsxDrawingObject::FromAnchor)) {
269
XlsxDrawingObject::Position pos = m_currentDrawingObject->m_positions[XlsxDrawingObject::FromAnchor];
270
Cell* cell = m_context->sheet->cell(pos.m_col, pos.m_row, true);
271
cell->drawings.append(m_currentDrawingObject);
272
m_currentDrawingObject = 0;
154
347
#define CURRENT_EL rowOff
155
348
KoFilter::ConversionStatus XlsxXmlDrawingReader::read_rowOff()
157
m_context->m_positions[m_anchorType].m_rowOff = readElementText().toInt(); // default value is zero
350
m_currentDrawingObject->m_positions[m_anchorType].m_rowOff = readElementText().toInt(); // default value is zero
158
351
return KoFilter::OK;
161
354
#undef CURRENT_EL
162
#define CURRENT_EL chart
163
KoFilter::ConversionStatus XlsxXmlDrawingReader::read_chart()
166
Q_ASSERT(m_context->worksheetReaderContext);
167
Q_ASSERT(m_context->worksheetReaderContext->import);
355
#define CURRENT_EL graphicFrame
358
This element specifies the existence of a graphics frame. This frame contains a graphic that was generated
359
by an external source and needs a container in which to be displayed on the slide surface.
362
- grpSp (§4.4.1.19); spTree (§4.4.1.42)
364
- extLst (Extension List with Modification Flag) (§4.2.4)
365
- graphic (Graphic Object) (§5.1.2.1.16)
366
- nvGraphicFramePr (Non-Visual Properties for a Graphic Frame) (§4.4.1.27)
367
- xfrm (2D Transform for Graphic Frame)
369
KoFilter::ConversionStatus XlsxXmlDrawingReader::read_graphicFrame()
374
BREAK_IF_END_OF(CURRENT_EL);
375
if (isStartElement()) {
376
if (qualifiedName() == "a:graphic") {
384
#define blipFill_NS "a"
385
#undef MSOOXML_CURRENT_NS
386
#define MSOOXML_CURRENT_NS "a"
389
#define CURRENT_EL graphic
390
//! graphic handler (Graphic Object)
391
KoFilter::ConversionStatus XlsxXmlDrawingReader::read_graphic2()
396
BREAK_IF_END_OF(CURRENT_EL);
397
if (isStartElement()) {
398
if (qualifiedName() == "a:graphicData") {
407
#define CURRENT_EL graphicData
408
//! graphicData handler (Graphic Object Data)
409
KoFilter::ConversionStatus XlsxXmlDrawingReader::read_graphicData2()
414
BREAK_IF_END_OF(CURRENT_EL);
415
if (isStartElement()) {
416
//TRY_READ_IF_NS(pic, pic)
417
TRY_READ_IF_NS(pic, pic)
418
if (qualifiedName() == "c:chart") {
421
else if (qualifiedName() == QLatin1String("dgm:relIds")) {
422
read_diagram(); // DrawingML diagram
430
#define CURRENT_EL diagram
431
//! 5.9 DrawingML - Diagrams
433
A DrawingML diagram allows the definition of diagrams using DrawingML objects and constructs. This
434
namespace defines the contents of a DrawingML diagram.
436
KoFilter::ConversionStatus XlsxXmlDrawingReader::read_diagram()
169
439
const QXmlStreamAttributes attrs(attributes());
170
TRY_READ_ATTR_WITH_NS(r, id)
171
if(!r_id.isEmpty()) {
172
//! @todo use MSOOXML::MsooXmlRelationships
174
const QString path = "/xl/charts";
175
const QString file = QString("chart%1.xml").arg(++m_chartNumber);
176
const QString filepath = path + "/" + file;
178
XlsxXmlChartReaderContext* context = new XlsxXmlChartReaderContext(m_context);
180
XlsxXmlChartReader reader(this);
181
const KoFilter::ConversionStatus result = m_context->worksheetReaderContext->import->loadAndParseDocument(&reader, filepath, context);
182
if (result != KoFilter::OK) {
183
raiseError(reader.errorString());
188
m_context->charts << context;
441
TRY_READ_ATTR_WITH_NS(r, cs) // colors
442
TRY_READ_ATTR_WITH_NS(r, dm) // data
443
TRY_READ_ATTR_WITH_NS(r, lo) // layout
444
TRY_READ_ATTR_WITH_NS(r, qs) // quickStyle
446
//const QString colorsfile = r_cs.isEmpty() ? QString() : m_context->relationships->target(m_context->path, m_context->file, r_cs);
447
const QString datafile = r_dm.isEmpty() ? QString() : m_context->relationships->target(m_context->path, m_context->file, r_dm);
448
const QString layoutfile = r_lo.isEmpty() ? QString() : m_context->relationships->target(m_context->path, m_context->file, r_lo);
449
//const QString quickstylefile = r_qs.isEmpty() ? QString() : m_context->relationships->target(m_context->path, m_context->file, r_qs);
451
//kDebug()<<"colorsfile="<<colorsfile<<"datafile="<<datafile<<"layoutfile="<<layoutfile<<"quickstylefile="<<quickstylefile;
453
//KoStore* storeout = m_context->import->outputStore();
454
MSOOXML::MsooXmlDiagramReaderContext* context = new MSOOXML::MsooXmlDiagramReaderContext(mainStyles);
456
// first read the data-model
457
MSOOXML::MsooXmlDiagramReader dataReader(this);
458
const KoFilter::ConversionStatus dataReaderResult = m_context->import->loadAndParseDocument(&dataReader, datafile, context);
459
if (dataReaderResult != KoFilter::OK) {
460
raiseError(dataReader.errorString());
462
return dataReaderResult;
465
// then read the layout definition
466
MSOOXML::MsooXmlDiagramReader layoutReader(this);
467
const KoFilter::ConversionStatus layoutReaderResult = m_context->import->loadAndParseDocument(&layoutReader, layoutfile, context);
468
if (layoutReaderResult != KoFilter::OK) {
469
raiseError(layoutReader.errorString());
471
return layoutReaderResult;
474
m_context->diagrams << context;
191
476
return KoFilter::OK;
479
XlsxXmlEmbeddedPicture::XlsxXmlEmbeddedPicture()
484
void XlsxXmlEmbeddedPicture::setImageXml(const QString imageXml)
486
m_imageXml = imageXml;
489
bool XlsxXmlEmbeddedPicture::saveXml(KoXmlWriter *xmlWriter) // save all needed attributes to .ods
491
xmlWriter->addCompleteElement(m_imageXml.toUtf8());
496
// in PPTX we do not have pPr, so p@text:style-name should be added earlier
497
//#define SETUP_PARA_STYLE_IN_READ_P
498
#include <MsooXmlCommonReaderImpl.h> // this adds a:p, a:pPr, a:t, a:r, etc.
499
#define DRAWINGML_NS "a"
500
#define DRAWINGML_PIC_NS "xdr" // DrawingML/Picture
501
#define DRAWINGML_TXBODY_NS "xdr" // DrawingML/Picture
502
#define XLSXXMLDRAWINGREADER_CPP
503
#include <MsooXmlCommonReaderDrawingMLImpl.h> // this adds p:pic, etc.
504
//#include <MsooXmlDrawingReaderTableImpl.h> //this adds a:tbl