diff --git a/hs-excelx.cabal b/hs-excelx.cabal
--- a/hs-excelx.cabal
+++ b/hs-excelx.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                hs-excelx
-version:             0.5.2.1
+version:             0.6.0.0
 synopsis:            HS-Excelx provides basic read-only access to Excel 2007 and 2010 documents in XLSX format.
 -- description:         
 license:             BSD3
diff --git a/src/Data/Excelx.hs b/src/Data/Excelx.hs
--- a/src/Data/Excelx.hs
+++ b/src/Data/Excelx.hs
@@ -174,42 +174,46 @@
 
 type Sheet = (Excelx, Cursor)
 type Row = [Cell]
+type ExcelReader a = ReaderT (Excelx, Cursor) Maybe a
 
-sheet :: MonadReader Excelx m => T.Text -> m (Maybe Sheet)
+sheet :: MonadReader Excelx m => T.Text -> m (Maybe (Excelx, Cursor))
 sheet name = do
   xlsx <- ask
   let sheetx = extractSheet name xlsx
   return $ fmap (\sheetxml -> (xlsx, sheetxml)) sheetx
 
-row :: MonadReader Sheet m => Int -> m Row
+row :: MonadReader (Excelx, Cursor) m => Int -> m [Cell]
 row num = do
   (xlsx, sheetx) <- ask
   return $ parseRow xlsx sheetx num
 
-rows :: MonadReader Sheet m => m [Row]
+rows :: MonadReader (Excelx, Cursor) m => m [Row]
 rows = do
   (_, sheetx) <- ask
   mapM row [1 .. maxRow sheetx]
 
-cell :: MonadReader Sheet m => Position -> m (Cell)  
+cell :: MonadReader (Excelx, Cursor) m => Position -> m Cell
 cell cellpos = do
   (xlsx, sheetx) <- ask
   return $ parseCell xlsx sheetx cellpos
 
-column :: MonadReader Sheet m => Int -> m [Cell]
-column colidx = do
+sparseColumn :: MonadReader (Excelx, Cursor) m => Int -> m [Cell]
+sparseColumn colidx = do
   (_, sheetx) <- ask
-  liftM catCells $ mapM cell $ map (flip R1C1 colidx) [1 .. maxRow sheetx]
+  mapM cell $ map (flip R1C1 colidx) [1 .. maxRow sheetx]
 
-inExcel :: b -> Reader b c -> c
-inExcel = flip runReader
+column :: MonadReader (Excelx, Cursor) m => Int -> m [Cell]
+column colidx = liftM catCells (sparseColumn colidx)
 
-inSheet :: MonadReader Excelx m => T.Text -> Reader Sheet a -> m (Maybe a)
+inExcel :: b -> ReaderT b m a -> m a
+inExcel = flip runReaderT
+
+inSheet :: MonadReader Excelx m => T.Text -> ReaderT (Excelx, Cursor) m b -> m b
 inSheet name action = do
   maybeSheet <- sheet name
   case maybeSheet of
-    Just sheetx -> return $ Just $ runReader action sheetx
-    Nothing -> return Nothing
+    Just sheetx -> runReaderT action sheetx
+    Nothing -> fail "Sheet not found."
 
-inExcelSheet :: Excelx -> T.Text -> Reader Sheet a -> Maybe a
+inExcelSheet :: Monad m => Excelx -> T.Text -> ReaderT (Excelx, Cursor) (ReaderT Excelx m) a -> m a
 inExcelSheet xlsx name action = inExcel xlsx $ inSheet name action
