Only the last part of each cell is read by ods->parse(). If there is no non-ASCII data in the cell, everything is fine but if there is non-ASCII data, only the last part begining with the last non-ASCII char is read.
This happens because xml_set_character_data_handler can be called several times for the same cell when it contains non-ASCII data as per <http://www.php.net/xml_set_character_data_handler>.
I believe the attached patch is the proper fix for this issue.
To verify this issue create an .ods file with the following content in a cell: descrição
Try to read this file with and without the patch to see that only with this patch you will get the full text on the parsed ods object.
Fixes partial read of non-ASCII data.
The same change also needs to be applied to line 188. 4 rows under the one in this patch.
The following tracker item also suggests this: https://sourceforge.net/tracker/index.php?func=detail&aid=2676844&group_id=217830&atid=1041671