File indexing completed on 2025-03-16 03:35:10
0001 // xlsxchartsheet.cpp 0002 0003 #include <QtGlobal> 0004 #include <QXmlStreamReader> 0005 #include <QXmlStreamWriter> 0006 #include <QDir> 0007 0008 #include "xlsxchartsheet.h" 0009 #include "xlsxchartsheet_p.h" 0010 #include "xlsxworkbook.h" 0011 #include "xlsxutility_p.h" 0012 #include "xlsxdrawing_p.h" 0013 #include "xlsxdrawinganchor_p.h" 0014 #include "xlsxchart.h" 0015 0016 QT_BEGIN_NAMESPACE_XLSX 0017 0018 ChartsheetPrivate::ChartsheetPrivate(Chartsheet *p, Chartsheet::CreateFlag flag) 0019 : AbstractSheetPrivate(p, flag), chart(nullptr) 0020 { 0021 0022 } 0023 0024 ChartsheetPrivate::~ChartsheetPrivate() 0025 { 0026 } 0027 0028 /*! 0029 \class Chartsheet 0030 \inmodule QtXlsx 0031 \brief Represent one chartsheet in the workbook. 0032 */ 0033 0034 /*! 0035 * \internal 0036 */ 0037 Chartsheet::Chartsheet(const QString &name, int id, Workbook *workbook, CreateFlag flag) 0038 : AbstractSheet( name, id, workbook, new ChartsheetPrivate(this, flag) ) 0039 { 0040 setSheetType(ST_ChartSheet); 0041 0042 if (flag == Chartsheet::F_NewFromScratch) 0043 { 0044 d_func()->drawing = std::make_shared<Drawing>(this, flag); 0045 0046 DrawingAbsoluteAnchor *anchor = new DrawingAbsoluteAnchor(drawing(), DrawingAnchor::Picture); 0047 0048 anchor->pos = QPoint(0, 0); 0049 anchor->ext = QSize(9293679, 6068786); 0050 0051 QSharedPointer<Chart> chart = QSharedPointer<Chart>(new Chart(this, flag)); 0052 chart->setChartType(Chart::CT_BarChart); 0053 anchor->setObjectGraphicFrame(chart); 0054 0055 d_func()->chart = chart.data(); 0056 } 0057 } 0058 0059 /*! 0060 * \internal 0061 * 0062 * Make a copy of this sheet. 0063 */ 0064 0065 Chartsheet *Chartsheet::copy(const QString &distName, int distId) const 0066 { 0067 //:Todo 0068 Q_UNUSED(distName) 0069 Q_UNUSED(distId) 0070 return nullptr; 0071 } 0072 0073 /*! 0074 * Destroys this workssheet. 0075 */ 0076 Chartsheet::~Chartsheet() 0077 { 0078 } 0079 0080 /*! 0081 * Returns the chart object of the sheet. 0082 */ 0083 Chart *Chartsheet::chart() 0084 { 0085 Q_D(Chartsheet); 0086 0087 return d->chart; 0088 } 0089 0090 void Chartsheet::saveToXmlFile(QIODevice *device) const 0091 { 0092 Q_D(const Chartsheet); 0093 d->relationships->clear(); 0094 0095 QXmlStreamWriter writer(device); 0096 0097 writer.writeStartDocument(QStringLiteral("1.0"), true); 0098 writer.writeDefaultNamespace(QStringLiteral("http://schemas.openxmlformats.org/spreadsheetml/2006/main")); 0099 writer.writeNamespace(QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), QStringLiteral("r")); 0100 writer.writeStartElement(QStringLiteral("chartsheet")); 0101 0102 writer.writeStartElement(QStringLiteral("sheetViews")); 0103 writer.writeEmptyElement(QStringLiteral("sheetView")); 0104 writer.writeAttribute(QStringLiteral("workbookViewId"), QString::number(0)); 0105 writer.writeAttribute(QStringLiteral("zoomToFit"), QStringLiteral("1")); 0106 writer.writeEndElement(); //sheetViews 0107 0108 int idx = d->workbook->drawings().indexOf(d->drawing.get()); 0109 d->relationships->addWorksheetRelationship(QStringLiteral("/drawing"), QStringLiteral("../drawings/drawing%1.xml").arg(idx+1)); 0110 0111 writer.writeEmptyElement(QStringLiteral("drawing")); 0112 writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(d->relationships->count())); 0113 0114 writer.writeEndElement();//chartsheet 0115 writer.writeEndDocument(); 0116 } 0117 0118 bool Chartsheet::loadFromXmlFile(QIODevice *device) 0119 { 0120 Q_D(Chartsheet); 0121 0122 QXmlStreamReader reader(device); 0123 while (!reader.atEnd()) { 0124 reader.readNextStartElement(); 0125 if (reader.tokenType() == QXmlStreamReader::StartElement) { 0126 if (reader.name() == QLatin1String("drawing")) { 0127 QString rId = reader.attributes().value(QStringLiteral("r:id")).toString(); 0128 QString name = d->relationships->getRelationshipById(rId).target; 0129 0130 const auto parts = splitPath(filePath()); 0131 QString path = QDir::cleanPath(parts.first() + QLatin1String("/") + name); 0132 0133 d->drawing = std::make_shared<Drawing>(this, F_LoadFromExists); 0134 d->drawing->setFilePath(path); 0135 } 0136 } 0137 } 0138 0139 return true; 0140 } 0141 0142 QT_END_NAMESPACE_XLSX