You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
7.1 KiB

#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