Hi,
One of my goals when I started Excel::Reader::XLSX was to have a fast and memory efficient solution and avoid the flaws in Spreadsheet::ParseExcel. As such the basic design was to read a row at a time and to only store that row in memory. I figured that once the basic framework was in place I could create a ParseExcel style wrapper around it (but only as an option, the main interface was going to be different).
My first pass was a "sparse" reader when next_row() got the next row that had data (and skipped any non-existent rows in between). And the same for cells within the row.
While this was useful as a back-end parser I realised after it was finished that this wasn't a good interface to expose to the end-user and started writing a "sequential" reader where next_row() returned the next sequential row whether it had data or not (up until the last row). I got some of the way through that when one or more real life activities intervened to soak up my free time and I had to drop it.
So that is where it is at the moment. A deconstructed engine in pieces on the floor waiting to be rebuilt.
However, I've lost interest. I have about 10 repos on Github (as well as some forks) of which 2 or 3 of them are reasonably active and take up any free time I have.
All I can suggest is to take any useful parts and start your own module. The efficient use of XML::LibXML took a while to figure out and might be helpful. I'd suggest using a similar test suite but to avoid the JSON step (that was to make the tests shareable if I wanted to rewrite it in another language but they were a pain to generate and maintain and I as going to revert to something simpler).
Apart from that the test suite is probably the best place to start to understand what is going on.
Regards,
John