#include "xlsxdrawing_p.h" #include "xlsxxmlwriter_p.h" namespace QXlsx { Drawing::Drawing(QObject *parent) : QObject(parent) { embedded = false; orientation = 0; } void Drawing::saveToXmlFile(QIODevice *device) { XmlStreamWriter writer(device); writer.writeStartDocument(QStringLiteral("1.0"), true); writer.writeStartElement(QStringLiteral("xdr:wsDr")); writer.writeAttribute(QStringLiteral("xmlns:xdr"), QStringLiteral("http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing")); writer.writeAttribute(QStringLiteral("xmlns:a"), QStringLiteral("http://schemas.openxmlformats.org/drawingml/2006/main")); if (embedded) { int index = 1; foreach (XlsxDrawingDimensionData *dimension, dimensionList) { writeTwoCellAnchor(writer, index, dimension); index++; } } else { //write the xdr:absoluteAnchor element writeAbsoluteAnchor(writer, 1); } writer.writeEndElement();//xdr:wsDr writer.writeEndDocument(); } void Drawing::writeTwoCellAnchor(XmlStreamWriter &writer, int index, XlsxDrawingDimensionData *data) { writer.writeStartElement(QStringLiteral("xdr:twoCellAnchor")); if (data->drawing_type == 2) writer.writeAttribute(QStringLiteral("editAs"), QStringLiteral("oneCell")); // if (shape) // writer.writeAttribute(QStringLiteral("editAs"), ); writer.writeStartElement(QStringLiteral("xdr:from")); writer.writeTextElement(QStringLiteral("xdr:col"), QString::number(data->col_from)); writer.writeTextElement(QStringLiteral("xdr:colOff"), QString::number((int)data->col_from_offset)); writer.writeTextElement(QStringLiteral("xdr:row"), QString::number(data->row_from)); writer.writeTextElement(QStringLiteral("xdr:rowOff"), QString::number((int)data->row_from_offset)); writer.writeEndElement(); //xdr:from writer.writeStartElement(QStringLiteral("xdr:to")); writer.writeTextElement(QStringLiteral("xdr:col"), QString::number(data->col_to)); writer.writeTextElement(QStringLiteral("xdr:colOff"), QString::number((int)data->col_to_offset)); writer.writeTextElement(QStringLiteral("xdr:row"), QString::number(data->row_to)); writer.writeTextElement(QStringLiteral("xdr:rowOff"), QString::number((int)data->row_to_offset)); writer.writeEndElement(); //xdr:to if (data->drawing_type == 1) { //Graphics frame, xdr:graphicFrame writeGraphicFrame(writer, index, data->description); } else if (data->drawing_type == 2) { //Image, xdr:pic writePicture(writer, index, data->col_absolute, data->row_absolute, data->width, data->height, data->description); } else { //Shape, xdr:sp } writer.writeEmptyElement(QStringLiteral("xdr:clientData")); writer.writeEndElement(); //xdr:twoCellAnchor } void Drawing::writeAbsoluteAnchor(XmlStreamWriter &writer, int index) { writer.writeStartElement(QStringLiteral("xdr:absoluteAnchor")); if (orientation == 0) { writePos(writer, 0, 0); writeExt(writer, 9308969, 6078325); } else { writePos(writer, 0, -47625); writeExt(writer, 6162675, 6124575); } writeGraphicFrame(writer, index); writer.writeEmptyElement(QStringLiteral("xdr:clientData")); writer.writeEndElement(); //xdr:absoluteAnchor } void Drawing::writePos(XmlStreamWriter &writer, int x, int y) { writer.writeEmptyElement(QStringLiteral("xdr:pos")); writer.writeAttribute(QStringLiteral("x"), QString::number(x)); writer.writeAttribute(QStringLiteral("y"), QString::number(y)); } void Drawing::writeExt(XmlStreamWriter &writer, int cx, int cy) { writer.writeStartElement(QStringLiteral("xdr:ext")); writer.writeAttribute(QStringLiteral("cx"), QString::number(cx)); writer.writeAttribute(QStringLiteral("cy"), QString::number(cy)); } void Drawing::writeGraphicFrame(XmlStreamWriter &writer, int index, const QString &name) { writer.writeStartElement(QStringLiteral("xdr:graphicFrame")); writer.writeAttribute(QStringLiteral("macro"), QString()); writer.writeStartElement(QStringLiteral("xdr:nvGraphicFramePr")); writer.writeEmptyElement(QStringLiteral("xdr:cNvPr")); writer.writeAttribute(QStringLiteral("id"), QString::number(index+1)); writer.writeAttribute(QStringLiteral("name"), name.isEmpty() ? QStringLiteral("Chart%1").arg(index): name); if (embedded) { writer.writeEmptyElement(QStringLiteral("xdr:cNvGraphicFramePr")); } else { writer.writeStartElement(QStringLiteral("xdr:cNvGraphicFramePr")); writer.writeEmptyElement(QStringLiteral("a:graphicFrameLocks")); writer.writeAttribute(QStringLiteral("noGrp"), QStringLiteral("1")); writer.writeEndElement(); //xdr:cNvGraphicFramePr } writer.writeEndElement();//xdr:nvGraphicFramePr writer.writeEndElement(); //xdr:graphicFrame } void Drawing::writePicture(XmlStreamWriter &writer, int index, double col_abs, double row_abs, int width, int height, const QString &description) { writer.writeStartElement(QStringLiteral("xdr:pic")); writer.writeStartElement(QStringLiteral("xdr:nvPicPr")); writer.writeEmptyElement(QStringLiteral("xdr:cNvPr")); writer.writeAttribute(QStringLiteral("id"), QString::number(index+1)); writer.writeAttribute(QStringLiteral("name"), QStringLiteral("Picture%1").arg(index)); if (!description.isEmpty()) writer.writeAttribute(QStringLiteral("descr"), description); writer.writeStartElement(QStringLiteral("xdr:cNvPicPr")); writer.writeEmptyElement(QStringLiteral("a:picLocks")); writer.writeAttribute(QStringLiteral("noChangeAspect"), QStringLiteral("1")); writer.writeEndElement(); //xdr:cNvPicPr writer.writeEndElement(); //xdr:nvPicPr writer.writeStartElement(QStringLiteral("xdr:blipFill")); writer.writeEmptyElement(QStringLiteral("a:blip")); writer.writeAttribute(QStringLiteral("xmlns:r"), QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships")); writer.writeAttribute(QStringLiteral("r:embed"), QStringLiteral("rId%1").arg(index)); writer.writeStartElement(QStringLiteral("a:stretch")); writer.writeEmptyElement(QStringLiteral("a:fillRect")); writer.writeEndElement(); //a:stretch writer.writeEndElement();//xdr:blipFill writer.writeStartElement(QStringLiteral("xdr:spPr")); writer.writeStartElement(QStringLiteral("a:xfrm")); writer.writeEmptyElement(QStringLiteral("a:off")); writer.writeAttribute(QStringLiteral("x"), QString::number((int)col_abs)); writer.writeAttribute(QStringLiteral("y"), QString::number((int)row_abs)); writer.writeEmptyElement(QStringLiteral("a:ext")); writer.writeAttribute(QStringLiteral("cx"), QString::number(width)); writer.writeAttribute(QStringLiteral("cy"), QString::number(height)); writer.writeEndElement(); //a:xfrm writer.writeStartElement(QStringLiteral("a:prstGeom")); writer.writeAttribute(QStringLiteral("prst"), QStringLiteral("rect")); writer.writeEmptyElement(QStringLiteral("a:avLst")); writer.writeEndElement(); //a:prstGeom writer.writeEndElement(); //xdr:spPr writer.writeEndElement(); //xdr:pic } } // namespace QXlsx