From f758c0c7097e197d7b6fb9bb3c3d9d6e9138e0a7 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Sun, 6 Jan 2013 19:14:32 +0100 Subject: [PATCH] Fixed a bug reading gnumeric files. Some gnumeric files use tags for miscellaneous purposes. Our code had always assumed that it represented the name of the Sheet. Hence these files would read the wrong sheet of a workbook. This change fixes it. Closes 38028 --- src/data/gnumeric-reader.c | 13 +- .../language/data-io/get-data-spreadsheet.at | 147 ++++++++++++++++++ 2 files changed, 152 insertions(+), 8 deletions(-) diff --git a/src/data/gnumeric-reader.c b/src/data/gnumeric-reader.c index 1904dabc12..4ddd80be00 100644 --- a/src/data/gnumeric-reader.c +++ b/src/data/gnumeric-reader.c @@ -145,6 +145,7 @@ process_node (struct gnumeric_reader *r) if (0 == xmlStrcasecmp (name, _xml("gnm:Sheet")) && XML_READER_TYPE_ELEMENT == r->node_type) { + ++r->sheet_index; r->state = STATE_SHEET_START; } break; @@ -154,21 +155,15 @@ process_node (struct gnumeric_reader *r) { r->state = STATE_SHEET_NAME; } - else if (0 == xmlStrcasecmp (name, _xml("gnm:Name")) && - XML_READER_TYPE_END_ELEMENT == r->node_type) - { - r->state = STATE_INIT; - } break; case STATE_SHEET_NAME: if (0 == xmlStrcasecmp (name, _xml("gnm:Name")) && XML_READER_TYPE_END_ELEMENT == r->node_type) { - r->state = STATE_SHEET_START; + r->state = STATE_INIT; } else if (XML_READER_TYPE_TEXT == r->node_type) { - ++r->sheet_index; if ( r->target_sheet != NULL) { xmlChar *value = xmlTextReaderValue (r->xtr); @@ -229,7 +224,9 @@ process_node (struct gnumeric_reader *r) case STATE_CELL: if (0 == xmlStrcasecmp (name, _xml("gnm:Cell")) && XML_READER_TYPE_END_ELEMENT == r->node_type) - r->state = STATE_CELLS_START; + { + r->state = STATE_CELLS_START; + } break; default: break; diff --git a/tests/language/data-io/get-data-spreadsheet.at b/tests/language/data-io/get-data-spreadsheet.at index 19b8964dca..c9060aef5f 100644 --- a/tests/language/data-io/get-data-spreadsheet.at +++ b/tests/language/data-io/get-data-spreadsheet.at @@ -175,6 +175,153 @@ AT_BANNER([GET DATA Spreadsheet /TYPE=GNM]) CHECK_SPREADSHEET_READER([GNM]) +dnl Check for a bug where gnumeric files were interpreted incorrectly +AT_SETUP([GET DATA /TYPE=GNM sheet index bug]) +AT_DATA([minimal3.gnumeric],[dnl + + + + + Sheet1 + Sheet2 + Sheet3 + + + + Sheet1 + 2 + 3 + + + Print_Area + #REF! + A1 + + + Sheet_Title + "Sheet1" + A1 + + + + + + + + + + + Name + x + y + Sheet One + 1 + 2 + foo + 3 + 4 + bar + 5 + 6 + + + + Sheet2 + 2 + 2 + + + Print_Area + #REF! + A1 + + + Sheet_Title + "Sheet2" + A1 + + + + + + + + + + + + Comment + DOB + wealth + Sheet Two + 24/5/1966 + 0.02 + wee + 37145 + 3000 + + + + Sheet3 + 2 + 2 + + + Print_Area + #REF! + A1 + + + Sheet_Title + "Sheet3" + A1 + + + + + + + + + + + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + + + + +]) + +AT_DATA([gnum.sps], [dnl +GET DATA + /TYPE=GNM + /FILE='minimal3.gnumeric' + /SHEET=index 3 + /READNAMES=off + . + +LIST. +]) + +AT_CHECK([pspp -O format=csv gnum.sps], [0], [dnl +Table: Data List +VAR001,VAR002,VAR003 +3 ,4.00,5.00 +6 ,7.00,8.00 +9 ,10.00,11.00 +]) + + +AT_CLEANUP + AT_BANNER([GET DATA Spreadsheet /TYPE=ODS]) CHECK_SPREADSHEET_READER([ODS]) -- 2.30.2