Even with 2.0.3? and you'll need to differentiate between the sheets and rows and columns as they're handled by completely different bits of code. A file with empty sheets would be a great help in pinning down exactly what is not working as expected.
I used sheet.sheet_state != 'visible' to determine whether a sheet was hidden and row.row_dimension.visible for rows. For testing, I created a new Excel spreadsheet (.xlsx), made Sheet2 and Sheet3 hidden, and made the second line on Sheet1 hidden. I had the program print out sheet.sheet_state, and I got 'visible' for all three
Just pushed to 2.1 fixes for hidden rows and columns. Hidden sheets will take a bit more work - essentially refactor the related class to use descriptors to match the specification and add a parser for the sheet_state.
I pulled version 2.1 via mercurial, created a spreadsheet with hidden rows, tested for hidden rows by calling worksheet.row_dimensions[idx].hidden, and it still says hidden and visible rows alike are visible. The worksheet call, worksheet.sheet_state, also displays 'visible' for hidden worksheets. Would you be able to look into these issues?