Browse Source

Chartsheet works now

master
Debao Zhang 11 years ago
parent
commit
f1f3b5f931
  1. 9
      examples/xlsx/chartsheet/chartsheet.pro
  2. 32
      examples/xlsx/chartsheet/main.cpp
  3. 1
      examples/xlsx/xlsx.pro
  4. 6
      src/xlsx/xlsxchart.cpp
  5. 2
      src/xlsx/xlsxchart.h
  6. 19
      src/xlsx/xlsxchartsheet.cpp
  7. 26
      src/xlsx/xlsxdocument.cpp
  8. 84
      src/xlsx/xlsxworkbook.cpp
  9. 1
      src/xlsx/xlsxworkbook.h
  10. 3
      src/xlsx/xlsxworkbook_p.h

9
examples/xlsx/chartsheet/chartsheet.pro

@ -0,0 +1,9 @@
TARGET = chartsheet
#include(../../../src/xlsx/qtxlsx.pri)
QT+=xlsx
CONFIG += console
CONFIG -= app_bundle
SOURCES += main.cpp

32
examples/xlsx/chartsheet/main.cpp

@ -0,0 +1,32 @@
#include <QtCore>
#include "xlsxdocument.h"
#include "xlsxchartsheet.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
using namespace QXlsx;
int main()
{
//![0]
Document xlsx;
for (int i=1; i<10; ++i)
xlsx.write(i, 1, i*i);
//![0]
//![1]
xlsx.addSheet("Chart1", AbstractSheet::ST_ChartSheet);
Chartsheet *sheet = static_cast<Chartsheet*>(xlsx.currentSheet());
Chart *barChart = sheet->chart();
barChart->setChartType(Chart::CT_Bar);
barChart->addSeries(CellRange("A1:A9"), xlsx.sheet("Sheet1"));
//![1]
//![2]
xlsx.saveAs("Book1.xlsx");
//![2]
Document xlsx2("Book1.xlsx");
xlsx2.saveAs("Book2.xlsx");
return 0;
}

1
examples/xlsx/xlsx.pro

@ -15,6 +15,7 @@ SUBDIRS = hello \
worksheetoperations \ worksheetoperations \
hyperlinks \ hyperlinks \
chart \ chart \
chartsheet \
demo demo
qtHaveModule(widgets): SUBDIRS += xlsxwidget qtHaveModule(widgets): SUBDIRS += xlsxwidget

6
src/xlsx/xlsxchart.cpp

@ -93,9 +93,13 @@ Chart::~Chart()
/*! /*!
* Add the data series which is in the range \a range of the \a sheet. * Add the data series which is in the range \a range of the \a sheet.
*/ */
void Chart::addSeries(const CellRange &range, Worksheet *sheet) void Chart::addSeries(const CellRange &range, AbstractSheet *sheet)
{ {
Q_D(Chart); Q_D(Chart);
if (sheet && sheet->sheetType() != AbstractSheet::ST_WorkSheet)
return;
if (!sheet && d->sheet->sheetType() != AbstractSheet::ST_WorkSheet)
return;
QString serRef = sheet ? sheet->sheetName() : d->sheet->sheetName(); QString serRef = sheet ? sheet->sheetName() : d->sheet->sheetName();

2
src/xlsx/xlsxchart.h

@ -67,7 +67,7 @@ public:
~Chart(); ~Chart();
void addSeries(const CellRange &range, Worksheet *sheet=0); void addSeries(const CellRange &range, AbstractSheet *sheet=0);
void setChartType(ChartType type); void setChartType(ChartType type);
void setChartStyle(int id); void setChartStyle(int id);

19
src/xlsx/xlsxchartsheet.cpp

@ -28,6 +28,7 @@
#include "xlsxutility_p.h" #include "xlsxutility_p.h"
#include "xlsxdrawing_p.h" #include "xlsxdrawing_p.h"
#include "xlsxdrawinganchor_p.h" #include "xlsxdrawinganchor_p.h"
#include "xlsxchart.h"
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <QXmlStreamWriter> #include <QXmlStreamWriter>
@ -36,8 +37,9 @@
QT_BEGIN_NAMESPACE_XLSX QT_BEGIN_NAMESPACE_XLSX
ChartsheetPrivate::ChartsheetPrivate(Chartsheet *p, Chartsheet::CreateFlag flag) ChartsheetPrivate::ChartsheetPrivate(Chartsheet *p, Chartsheet::CreateFlag flag)
: AbstractSheetPrivate(p, flag) : AbstractSheetPrivate(p, flag), chart(0)
{ {
} }
ChartsheetPrivate::~ChartsheetPrivate() ChartsheetPrivate::~ChartsheetPrivate()
@ -57,6 +59,21 @@ Chartsheet::Chartsheet(const QString &name, int id, Workbook *workbook, CreateFl
:AbstractSheet(name, id, workbook, new ChartsheetPrivate(this, flag)) :AbstractSheet(name, id, workbook, new ChartsheetPrivate(this, flag))
{ {
setSheetType(ST_ChartSheet); setSheetType(ST_ChartSheet);
if (flag == Chartsheet::F_NewFromScratch) {
d_func()->drawing = QSharedPointer<Drawing>(new Drawing(this, flag));
DrawingAbsoluteAnchor *anchor = new DrawingAbsoluteAnchor(drawing(), DrawingAnchor::Picture);
anchor->pos = QPoint(0, 0);
anchor->ext = QSize(9293679, 6068786);
QSharedPointer<Chart> chart = QSharedPointer<Chart>(new Chart(this, flag));
chart->setChartType(Chart::CT_Bar);
anchor->setObjectGraphicFrame(chart);
d_func()->chart = chart.data();
}
} }
/*! /*!

26
src/xlsx/xlsxdocument.cpp

@ -246,10 +246,12 @@ bool DocumentPrivate::savePackage(QIODevice *device) const
DocPropsApp docPropsApp(DocPropsApp::F_NewFromScratch); DocPropsApp docPropsApp(DocPropsApp::F_NewFromScratch);
DocPropsCore docPropsCore(DocPropsCore::F_NewFromScratch); DocPropsCore docPropsCore(DocPropsCore::F_NewFromScratch);
// save sheet xml files // save worksheet xml files
for (int i=0; i<workbook->sheetCount(); ++i) { QList<QSharedPointer<AbstractSheet> > worksheets = workbook->getSheetsByTypes(AbstractSheet::ST_WorkSheet);
AbstractSheet *sheet = workbook->sheet(i); if (!worksheets.isEmpty())
if (sheet->sheetType() == AbstractSheet::ST_WorkSheet) { docPropsApp.addHeadingPair(QStringLiteral("Worksheets"), worksheets.size());
for (int i=0; i<worksheets.size(); ++i) {
QSharedPointer<AbstractSheet> sheet = worksheets[i];
contentTypes->addWorksheetName(QStringLiteral("sheet%1").arg(i+1)); contentTypes->addWorksheetName(QStringLiteral("sheet%1").arg(i+1));
docPropsApp.addPartTitle(sheet->sheetName()); docPropsApp.addPartTitle(sheet->sheetName());
@ -258,6 +260,20 @@ bool DocumentPrivate::savePackage(QIODevice *device) const
if (!rel->isEmpty()) if (!rel->isEmpty())
zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rel->saveToXmlData()); zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rel->saveToXmlData());
} }
//save chartsheet xml files
QList<QSharedPointer<AbstractSheet> > chartsheets = workbook->getSheetsByTypes(AbstractSheet::ST_ChartSheet);
if (!chartsheets.isEmpty())
docPropsApp.addHeadingPair(QStringLiteral("Chartsheets"), chartsheets.size());
for (int i=0; i<chartsheets.size(); ++i) {
QSharedPointer<AbstractSheet> sheet = chartsheets[i];
contentTypes->addWorksheetName(QStringLiteral("sheet%1").arg(i+1));
docPropsApp.addPartTitle(sheet->sheetName());
zipWriter.addFile(QStringLiteral("xl/chartsheets/sheet%1.xml").arg(i+1), sheet->saveToXmlData());
Relationships *rel = sheet->relationships();
if (!rel->isEmpty())
zipWriter.addFile(QStringLiteral("xl/chartsheets/_rels/sheet%1.xml.rels").arg(i+1), rel->saveToXmlData());
} }
// save external links xml files // save external links xml files
@ -291,8 +307,6 @@ bool DocumentPrivate::savePackage(QIODevice *device) const
docPropsApp.setProperty(name, q->documentProperty(name)); docPropsApp.setProperty(name, q->documentProperty(name));
docPropsCore.setProperty(name, q->documentProperty(name)); docPropsCore.setProperty(name, q->documentProperty(name));
} }
if (workbook->sheetCount())
docPropsApp.addHeadingPair(QStringLiteral("Worksheets"), workbook->sheetCount());
contentTypes->addDocPropApp(); contentTypes->addDocPropApp();
contentTypes->addDocPropCore(); contentTypes->addDocPropCore();
zipWriter.addFile(QStringLiteral("docProps/app.xml"), docPropsApp.saveToXmlData()); zipWriter.addFile(QStringLiteral("docProps/app.xml"), docPropsApp.saveToXmlData());

84
src/xlsx/xlsxworkbook.cpp

@ -26,6 +26,7 @@
#include "xlsxworkbook_p.h" #include "xlsxworkbook_p.h"
#include "xlsxsharedstrings_p.h" #include "xlsxsharedstrings_p.h"
#include "xlsxworksheet.h" #include "xlsxworksheet.h"
#include "xlsxchartsheet.h"
#include "xlsxstyles_p.h" #include "xlsxstyles_p.h"
#include "xlsxformat.h" #include "xlsxformat.h"
#include "xlsxworksheet_p.h" #include "xlsxworksheet_p.h"
@ -61,7 +62,8 @@ WorkbookPrivate::WorkbookPrivate(Workbook *q, Workbook::CreateFlag flag) :
firstsheet = 0; firstsheet = 0;
table_count = 0; table_count = 0;
last_sheet_index = 0; last_worksheet_index = 0;
last_chartsheet_index = 0;
last_sheet_id = 0; last_sheet_id = 0;
} }
@ -195,9 +197,16 @@ AbstractSheet *Workbook::addSheet(const QString &name, int sheetId, AbstractShee
Q_D(Workbook); Q_D(Workbook);
if (sheetId > d->last_sheet_id) if (sheetId > d->last_sheet_id)
d->last_sheet_id = sheetId; d->last_sheet_id = sheetId;
AbstractSheet *sheet=0;
Worksheet *sheet = new Worksheet(name, sheetId, this, F_LoadFromExists); if (type == AbstractSheet::ST_WorkSheet) {
d->sheets.append(QSharedPointer<Worksheet>(sheet)); sheet = new Worksheet(name, sheetId, this, F_LoadFromExists);
} else if (type == AbstractSheet::ST_ChartSheet) {
sheet = new Chartsheet(name, sheetId, this, F_LoadFromExists);
} else {
qWarning("unsupported sheet type.");
Q_ASSERT(false);
}
d->sheets.append(QSharedPointer<AbstractSheet>(sheet));
d->sheetNames.append(name); d->sheetNames.append(name);
return sheet; return sheet;
} }
@ -205,22 +214,37 @@ AbstractSheet *Workbook::addSheet(const QString &name, int sheetId, AbstractShee
AbstractSheet *Workbook::insertSheet(int index, const QString &name, AbstractSheet::SheetType type) AbstractSheet *Workbook::insertSheet(int index, const QString &name, AbstractSheet::SheetType type)
{ {
Q_D(Workbook); Q_D(Workbook);
QString worksheetName = createSafeSheetName(name); QString sheetName = createSafeSheetName(name);
if (!worksheetName.isEmpty()) { if (!sheetName.isEmpty()) {
//If user given an already in-used name, we should not continue any more! //If user given an already in-used name, we should not continue any more!
if (d->sheetNames.contains(worksheetName)) if (d->sheetNames.contains(sheetName))
return 0; return 0;
} else { } else {
if (type == AbstractSheet::ST_WorkSheet) {
do { do {
++d->last_sheet_index; ++d->last_worksheet_index;
worksheetName = QStringLiteral("Sheet%1").arg(d->last_sheet_index); sheetName = QStringLiteral("Sheet%1").arg(d->last_worksheet_index);
} while (d->sheetNames.contains(worksheetName)); } while (d->sheetNames.contains(sheetName));
} else if (type == AbstractSheet::ST_ChartSheet) {
do {
++d->last_chartsheet_index;
sheetName = QStringLiteral("Chart%1").arg(d->last_chartsheet_index);
} while (d->sheetNames.contains(sheetName));
} else {
qWarning("unsupported sheet type.");
return 0;
}
} }
++d->last_sheet_id; ++d->last_sheet_id;
Worksheet *sheet = new Worksheet(worksheetName, d->last_sheet_id, this, F_NewFromScratch); AbstractSheet *sheet;
d->sheets.insert(index, QSharedPointer<Worksheet>(sheet)); if (type == AbstractSheet::ST_WorkSheet)
d->sheetNames.insert(index, worksheetName); sheet = new Worksheet(sheetName, d->last_sheet_id, this, F_NewFromScratch);
else
sheet = new Chartsheet(sheetName, d->last_sheet_id, this, F_NewFromScratch);
d->sheets.insert(index, QSharedPointer<AbstractSheet>(sheet));
d->sheetNames.insert(index, sheetName);
d->activesheetIndex = index; d->activesheetIndex = index;
return sheet; return sheet;
} }
@ -384,6 +408,20 @@ QList<Drawing *> Workbook::drawings()
return ds; return ds;
} }
/*!
* \internal
*/
QList<QSharedPointer<AbstractSheet> > Workbook::getSheetsByTypes(AbstractSheet::SheetType type) const
{
Q_D(const Workbook);
QList<QSharedPointer<AbstractSheet> > list;
for (int i=0; i<d->sheets.size(); ++i) {
if (d->sheets[i]->sheetType() == type)
list.append(d->sheets[i]);
}
return list;
}
void Workbook::saveToXmlFile(QIODevice *device) const void Workbook::saveToXmlFile(QIODevice *device) const
{ {
Q_D(const Workbook); Q_D(const Workbook);
@ -424,8 +462,10 @@ void Workbook::saveToXmlFile(QIODevice *device) const
writer.writeEndElement();//bookViews writer.writeEndElement();//bookViews
writer.writeStartElement(QStringLiteral("sheets")); writer.writeStartElement(QStringLiteral("sheets"));
for (int i=0; i<d->sheets.size(); ++i) { //work sheets
QSharedPointer<AbstractSheet> sheet = d->sheets[i]; QList<QSharedPointer<AbstractSheet> > worksheets = getSheetsByTypes(AbstractSheet::ST_WorkSheet);
for (int i=0; i<worksheets.size(); ++i) {
QSharedPointer<AbstractSheet> sheet = worksheets[i];
writer.writeEmptyElement(QStringLiteral("sheet")); writer.writeEmptyElement(QStringLiteral("sheet"));
writer.writeAttribute(QStringLiteral("name"), sheet->sheetName()); writer.writeAttribute(QStringLiteral("name"), sheet->sheetName());
writer.writeAttribute(QStringLiteral("sheetId"), QString::number(sheet->sheetId())); writer.writeAttribute(QStringLiteral("sheetId"), QString::number(sheet->sheetId()));
@ -435,6 +475,20 @@ void Workbook::saveToXmlFile(QIODevice *device) const
d->relationships->addDocumentRelationship(QStringLiteral("/worksheet"), QStringLiteral("worksheets/sheet%1.xml").arg(i+1)); d->relationships->addDocumentRelationship(QStringLiteral("/worksheet"), QStringLiteral("worksheets/sheet%1.xml").arg(i+1));
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(d->relationships->count())); writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(d->relationships->count()));
} }
//chart sheets
QList<QSharedPointer<AbstractSheet> > chartsheets = getSheetsByTypes(AbstractSheet::ST_ChartSheet);
for (int i=0; i<chartsheets.size(); ++i) {
QSharedPointer<AbstractSheet> sheet = chartsheets[i];
writer.writeEmptyElement(QStringLiteral("sheet"));
writer.writeAttribute(QStringLiteral("name"), sheet->sheetName());
writer.writeAttribute(QStringLiteral("sheetId"), QString::number(sheet->sheetId()));
if (sheet->isHidden())
writer.writeAttribute(QStringLiteral("state"), QStringLiteral("hidden"));
d->relationships->addDocumentRelationship(QStringLiteral("/chartsheet"), QStringLiteral("chartsheets/sheet%1.xml").arg(i+1));
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(d->relationships->count()));
}
writer.writeEndElement();//sheets writer.writeEndElement();//sheets
if (d->externalLinks.size() > 0) { if (d->externalLinks.size() > 0) {

1
src/xlsx/xlsxworkbook.h

@ -102,6 +102,7 @@ private:
Theme *theme(); Theme *theme();
QList<QImage> images(); QList<QImage> images();
QList<Drawing *> drawings(); QList<Drawing *> drawings();
QList<QSharedPointer<AbstractSheet> > getSheetsByTypes(AbstractSheet::SheetType type) const;
QStringList worksheetNames() const; QStringList worksheetNames() const;
AbstractSheet *addSheet(const QString &name, int sheetId, AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet); AbstractSheet *addSheet(const QString &name, int sheetId, AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet);
}; };

3
src/xlsx/xlsxworkbook_p.h

@ -96,7 +96,8 @@ public:
int table_count; int table_count;
//Used to generate new sheet name and id //Used to generate new sheet name and id
int last_sheet_index; int last_worksheet_index;
int last_chartsheet_index;
int last_sheet_id; int last_sheet_id;
}; };

Loading…
Cancel
Save