[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: koffice/filters/kspread/excel
From: Marijn Kruisselbrink <m.kruisselbrink () student ! tue ! nl>
Date: 2010-06-21 20:48:23
Message-ID: 20100621204823.7F1DCAC8DA () svn ! kde ! org
[Download RAW message or body]
SVN commit 1140938 by mkruisselbrink:
add support for grouped rows and columns to the xls filter; kspread itself does not \
support this yet
M +42 -6 import/excelimport.cc
M +6 -2 sidewinder/records.xml
M +52 -2 sidewinder/sheet.cpp
M +10 -0 sidewinder/sheet.h
M +4 -0 sidewinder/worksheetsubstreamhandler.cpp
--- trunk/koffice/filters/kspread/excel/import/excelimport.cc #1140937:1140938
@@ -185,9 +185,9 @@
void processSheetForStyle(Sheet* sheet, KoXmlWriter* xmlWriter);
void processSheetForHeaderFooter ( Sheet* sheet, KoXmlWriter* writer);
void processHeaderFooterStyle (UString text, KoXmlWriter* xmlWriter);
- void processColumnForBody(Sheet* sheet, int columnIndex, KoXmlWriter* \
xmlWriter); + void processColumnForBody(Sheet* sheet, int columnIndex, \
KoXmlWriter* xmlWriter, unsigned& outlineLevel);
void processColumnForStyle(Sheet* sheet, int columnIndex, KoXmlWriter* \
xmlWriter);
- int processRowForBody(KoOdfWriteStore* store, Sheet* sheet, int rowIndex, \
KoXmlWriter* xmlWriter); + int processRowForBody(KoOdfWriteStore* store, Sheet* \
sheet, int rowIndex, KoXmlWriter* xmlWriter, unsigned& outlineLevel);
int processRowForStyle(Sheet* sheet, int rowIndex, KoXmlWriter* xmlWriter);
void processCellForBody(KoOdfWriteStore* store, Cell* cell, int rowsRepeat, \
KoXmlWriter* xmlWriter); void processCellForStyle(Cell* cell, KoXmlWriter* \
xmlWriter); @@ -752,9 +752,14 @@
}
const unsigned columnCount = qMin(maximalColumnCount, sheet->maxColumn());
+ unsigned outlineLevel = 0;
for (unsigned i = 0; i <= columnCount; ++i) {
- processColumnForBody(sheet, i, xmlWriter);
+ processColumnForBody(sheet, i, xmlWriter, outlineLevel);
}
+ while (outlineLevel > 0) {
+ xmlWriter->endElement(); // table:table-column-group
+ outlineLevel--;
+ }
// in odf default-cell-style's only apply to cells/rows/columns that are present \
in the file while in Excel
// row/column styles should apply to all cells in that row/column. So, try to \
fake that behavior by writting @@ -769,8 +774,12 @@
// add rows
const unsigned rowCount = qMin(maximalRowCount, sheet->maxRow());
for (unsigned i = 0; i <= rowCount;) {
- i += processRowForBody(store, sheet, i, xmlWriter);
+ i += processRowForBody(store, sheet, i, xmlWriter, outlineLevel);
}
+ while (outlineLevel > 0) {
+ xmlWriter->endElement(); // table:table-row-group
+ outlineLevel--;
+ }
// same we did above with columns is also needed for rows.
if(rowCount < maximalRowCount-1) {
@@ -930,11 +939,24 @@
}
// Processes a column in a sheet.
-void ExcelImport::Private::processColumnForBody(Sheet* sheet, int columnIndex, \
KoXmlWriter* xmlWriter) +void ExcelImport::Private::processColumnForBody(Sheet* \
sheet, int columnIndex, KoXmlWriter* xmlWriter, unsigned& outlineLevel) {
Column* column = sheet->column(columnIndex, false);
if (!xmlWriter) return;
+
+ int newOutlineLevel = column ? column->outlineLevel() : 0;
+ while (newOutlineLevel > outlineLevel) {
+ xmlWriter->startElement("table:table-column-group");
+ outlineLevel++;
+ if (outlineLevel == newOutlineLevel && column->collapsed())
+ xmlWriter->addAttribute("table:display", "false");
+ }
+ while (newOutlineLevel < outlineLevel) {
+ xmlWriter->endElement(); // table:table-column-group
+ outlineLevel--;
+ }
+
if (!column) {
xmlWriter->startElement("table:table-column");
Q_ASSERT(defaultColumnStyleIndex < defaultColumnStyles.count());
@@ -977,12 +999,26 @@
}
// Processes a row in a sheet.
-int ExcelImport::Private::processRowForBody(KoOdfWriteStore* store, Sheet* sheet, \
int rowIndex, KoXmlWriter* xmlWriter) +int \
ExcelImport::Private::processRowForBody(KoOdfWriteStore* store, Sheet* sheet, int \
rowIndex, KoXmlWriter* xmlWriter, unsigned& outlineLevel) {
int repeat = 1;
if (!xmlWriter) return repeat;
Row *row = sheet->row(rowIndex, false);
+
+ int newOutlineLevel = row ? row->outlineLevel() : 0;
+ while (newOutlineLevel > outlineLevel) {
+ xmlWriter->startElement("table:table-row-group");
+ outlineLevel++;
+ if (outlineLevel == newOutlineLevel && row->collapsed())
+ xmlWriter->addAttribute("table:display", "false");
+ }
+ while (newOutlineLevel < outlineLevel) {
+ xmlWriter->endElement(); // table:table-row-group
+ outlineLevel--;
+ }
+
+
if (!row) {
xmlWriter->startElement("table:table-row");
xmlWriter->endElement();
--- trunk/koffice/filters/kspread/excel/sidewinder/records.xml #1140937:1140938
@@ -162,10 +162,12 @@
<field name="reserved0" size="7" />
<field name="outlineLevel" type="unsigned" size="3" />
<field name="reserved1" size="1" />
- <field name="collapsed" type="bool" size="1" />
+ <field name="notCollapsed" type="bool" size="1" />
<field name="reserved2" size="3" />
<field name="reserved3" size="16" />
+
+ <computedField name="isCollapsed" ctype="bool" value="!isNotCollapsed()" />
</record>
<record name="DataTable" id="0x0236">
@@ -381,12 +383,14 @@
<field name="reserved1" size="16" />
<field name="outlineLevel" type="unsigned" size="3" />
<field name="reserved2" size="1" />
- <field name="collapsed" type="bool" size="1" />
+ <field name="notCollapsed" type="bool" size="1" />
<field name="hidden" type="bool" size="1" />
<field name="reserved3" size="2" />
<field name="reserved4" size="8" />
<field name="xfIndex" type="unsigned" size="12" />
<field name="reserved5" size="4" />
+
+ <computedField name="isCollapsed" ctype="bool" value="!isNotCollapsed()" />
</record>
<!-- TODO: RString -->
--- trunk/koffice/filters/kspread/excel/sidewinder/sheet.cpp #1140937:1140938
@@ -477,6 +477,8 @@
double width;
Format format;
bool visible;
+ unsigned outlineLevel;
+ bool collapsed;
};
Column::Column(Sheet* sheet, unsigned index)
@@ -486,6 +488,8 @@
d->index = index;
d->width = 0.0;
d->visible = true;
+ d->outlineLevel = 0;
+ d->collapsed = false;
}
Column::~Column()
@@ -536,11 +540,32 @@
d->visible = b;
}
+unsigned Column::outlineLevel() const
+{
+ return d->outlineLevel;
+}
+
+void Column::setOutlineLevel(unsigned level)
+{
+ d->outlineLevel = level;
+}
+
+bool Column::collapsed() const
+{
+ return d->collapsed;
+}
+
+void Column::setCollapsed(bool collapsed)
+{
+ d->collapsed = collapsed;
+}
+
bool Column::operator==(const Column &other) const
{
return width() == other.width() &&
visible() == other.visible() &&
- format() == other.format();
+ format() == other.format() &&
+ outlineLevel() == other.outlineLevel();
}
bool Column::operator!=(const Column &other) const
@@ -575,6 +600,8 @@
double height;
Format format;
bool visible;
+ unsigned outlineLevel;
+ bool collapsed;
};
Row::Row(Sheet* sheet, unsigned index)
@@ -584,6 +611,8 @@
d->index = index;
d->height = 12;
d->visible = true;
+ d->outlineLevel = 0;
+ d->collapsed = false;
}
Row::~Row()
@@ -631,11 +660,32 @@
d->visible = b;
}
+unsigned Row::outlineLevel() const
+{
+ return d->outlineLevel;
+}
+
+void Row::setOutlineLevel(unsigned level)
+{
+ d->outlineLevel = level;
+}
+
+bool Row::collapsed() const
+{
+ return d->collapsed;
+}
+
+void Row::setCollapsed(bool collapsed)
+{
+ d->collapsed = collapsed;
+}
+
bool Row::operator==(const Row &other) const
{
return height() == other.height() &&
visible() == other.visible() &&
- format() == other.format();
+ format() == other.format() &&
+ outlineLevel() == other.outlineLevel();
}
bool Row::operator!=(const Row &other) const
--- trunk/koffice/filters/kspread/excel/sidewinder/sheet.h #1140937:1140938
@@ -218,6 +218,11 @@
bool visible() const;
void setVisible(bool v);
+ unsigned outlineLevel() const;
+ void setOutlineLevel(unsigned level);
+ bool collapsed() const;
+ void setCollapsed(bool collapsed);
+
bool operator==(const Column &other) const;
bool operator!=(const Column &other) const;
@@ -251,6 +256,11 @@
bool visible() const;
void setVisible(bool v);
+ unsigned outlineLevel() const;
+ void setOutlineLevel(unsigned level);
+ bool collapsed() const;
+ void setCollapsed(bool collapsed);
+
bool operator==(const Row &other) const;
bool operator!=(const Row &other) const;
--- trunk/koffice/filters/kspread/excel/sidewinder/worksheetsubstreamhandler.cpp \
#1140937:1140938 @@ -446,6 +446,8 @@
column->setWidth( Column::columnUnitsToPts((double)width) );
column->setFormat(d->globals->convertedFormat(xfIndex));
column->setVisible(!hidden);
+ column->setOutlineLevel(record->outlineLevel());
+ column->setCollapsed(record->isCollapsed());
}
}
}
@@ -797,6 +799,8 @@
row->setHeight(height / 20.0);
row->setFormat(d->globals->convertedFormat(xfIndex));
row->setVisible(!hidden);
+ row->setOutlineLevel(record->outlineLevel());
+ row->setCollapsed(record->isCollapsed());
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic