diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,15 @@
+0.6.0
+-----
+* fixed reading files with optional table name (thanks Aleksey Khudyakov
+  <alexey.skladnoy@gmail.com> for reporting)
+* removed unnecessary 10cm offset from `simpleAnchorXY`
+* `customRowHeight` added to row properties (thanks Aleksey Khudyakov
+  <alexey.skladnoy@gmail.com>)
+* added `Generic` instances for library types (thanks Remy Goldschmidt
+  <taktoa@gmail.com>)
+* `hidden` property added for rows (thanks Aleksey Khudyakov
+  <alexey.skladnoy@gmail.com>)
+
 0.5.0
 -----
 * renamed `ColumnsWidth` to more intuitive `ColumnsProperties` and
diff --git a/src/Codec/Xlsx/Formatted.hs b/src/Codec/Xlsx/Formatted.hs
--- a/src/Codec/Xlsx/Formatted.hs
+++ b/src/Codec/Xlsx/Formatted.hs
@@ -3,8 +3,9 @@
 {-# LANGUAGE RankNTypes      #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
-module Codec.Xlsx.Formatted (
-    FormattedCell(..)
+{-# LANGUAGE DeriveGeneric #-}
+module Codec.Xlsx.Formatted
+  ( FormattedCell(..)
   , Formatted(..)
   , formatted
   , toFormattedCells
@@ -32,26 +33,27 @@
   , condfmtStopIfTrue
   ) where
 
-import           Control.Lens
-import           Control.Monad.State hiding (forM_, mapM)
-import           Data.Default
-import           Data.Foldable       (asum, forM_)
-import           Data.Function       (on)
-import           Data.List           (foldl', groupBy, sortBy, sortBy)
-import           Data.Map            (Map)
-import qualified Data.Map            as M
-import           Data.Ord            (comparing)
-import           Data.Text           (Text)
-import           Data.Traversable    (mapM)
-import           Data.Tuple          (swap)
-import           Prelude             hiding (mapM)
-import           Safe                (headNote, fromJustNote)
+import Control.Lens
+import Control.Monad.State hiding (forM_, mapM)
+import Data.Default
+import Data.Foldable (asum, forM_)
+import Data.Function (on)
+import Data.List (foldl', groupBy, sortBy, sortBy)
+import Data.Map (Map)
+import qualified Data.Map as M
+import Data.Ord (comparing)
+import Data.Text (Text)
+import Data.Traversable (mapM)
+import Data.Tuple (swap)
+import GHC.Generics (Generic)
+import Prelude hiding (mapM)
+import Safe (headNote, fromJustNote)
 
 #if !MIN_VERSION_base(4,8,0)
-import           Control.Applicative
+import Control.Applicative
 #endif
 
-import           Codec.Xlsx.Types
+import Codec.Xlsx.Types
 
 {-------------------------------------------------------------------------------
   Internal: formatting state
@@ -118,7 +120,7 @@
     , _condfmtDxf        :: Dxf
     , _condfmtPriority   :: Int
     , _condfmtStopIfTrue :: Maybe Bool
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 makeLenses ''FormattedCondFmt
 
@@ -141,7 +143,7 @@
     , _formatProtection   :: Maybe Protection
     , _formatPivotButton  :: Maybe Bool
     , _formatQuotePrefix  :: Maybe Bool
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 makeLenses ''Format
 
@@ -153,7 +155,7 @@
     , _formattedFormat  :: Format
     , _formattedColSpan :: Int
     , _formattedRowSpan :: Int
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 makeLenses ''FormattedCell
 
@@ -200,7 +202,7 @@
 
     -- | The final list of cell merges; see '_wsMerges'
   , formattedMerges     :: [Range]
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Higher level API for creating formatted documents
 --
@@ -289,7 +291,7 @@
     condformattedStyleSheet    :: StyleSheet
     -- | The final map of conditional formatting rules applied to ranges
     , condformattedFormattings :: Map SqRef ConditionalFormatting
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 conditionallyFormatted :: Map CellRef [FormattedCondFmt] -> StyleSheet -> CondFormatted
 conditionallyFormatted cfs styleSheet = CondFormatted
diff --git a/src/Codec/Xlsx/Lens.hs b/src/Codec/Xlsx/Lens.hs
--- a/src/Codec/Xlsx/Lens.hs
+++ b/src/Codec/Xlsx/Lens.hs
@@ -1,36 +1,38 @@
 {-# LANGUAGE CPP          #-}
 {-# LANGUAGE RankNTypes   #-}
 {-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE DeriveGeneric #-}
 
 -- | lenses to access sheets, cells and values of 'Xlsx'
 
 module Codec.Xlsx.Lens
-    ( ixSheet
-    , atSheet
-    , ixCell
-    , ixCellRC
-    , ixCellXY
-    , atCell
-    , atCellRC
-    , atCellXY
-    , cellValueAt
-    , cellValueAtRC
-    , cellValueAtXY
- ) where
+  ( ixSheet
+  , atSheet
+  , ixCell
+  , ixCellRC
+  , ixCellXY
+  , atCell
+  , atCellRC
+  , atCellXY
+  , cellValueAt
+  , cellValueAtRC
+  , cellValueAtXY
+  ) where
 
-import           Codec.Xlsx.Types
-import           Control.Lens
-import           Data.Function       (on)
-import           Data.List           (deleteBy)
-import           Data.Text
-import           Data.Tuple          (swap)
+import Codec.Xlsx.Types
+import Control.Lens
+import Data.Function (on)
+import Data.List (deleteBy)
+import Data.Text
+import Data.Tuple (swap)
+import GHC.Generics (Generic)
 
 #if !MIN_VERSION_base(4,8,0)
-import           Control.Applicative
+import Control.Applicative
 #endif
 
 newtype SheetList = SheetList{ unSheetList :: [(Text, Worksheet)] }
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic)
 
 type instance IxValue (SheetList) = Worksheet
 type instance Index (SheetList) = Text
diff --git a/src/Codec/Xlsx/Parser.hs b/src/Codec/Xlsx/Parser.hs
--- a/src/Codec/Xlsx/Parser.hs
+++ b/src/Codec/Xlsx/Parser.hs
@@ -3,6 +3,7 @@
 {-# LANGUAGE RecordWildCards           #-}
 {-# LANGUAGE ScopedTypeVariables       #-}
 {-# LANGUAGE TupleSections             #-}
+{-# LANGUAGE DeriveGeneric #-}
 
 -- | This module provides a function for reading .xlsx files
 module Codec.Xlsx.Parser
@@ -12,6 +13,7 @@
   , Parser
   ) where
 
+
 import qualified Codec.Archive.Zip as Zip
 import Control.Applicative
 import Control.Arrow (left)
@@ -29,6 +31,7 @@
 import qualified Data.Text as T
 import qualified Data.Text.Read as T
 import Data.Traversable
+import GHC.Generics (Generic)
 import Prelude hiding (sequence)
 import System.FilePath.Posix
 import Text.XML as X
@@ -57,7 +60,7 @@
                 | InvalidFile FilePath
                 | InvalidRef FilePath RefId
                 | InconsistentXlsx Text
-                deriving (Show, Eq)
+                deriving (Eq, Show, Generic)
 
 type Parser = Either ParseError
 
@@ -77,7 +80,7 @@
 data WorksheetFile = WorksheetFile { wfName :: Text
                                    , wfPath :: FilePath
                                    }
-                   deriving Show
+                   deriving (Show, Generic)
 
 type Caches = [(CacheId, (Text, CellRef, [CacheField]))]
 
@@ -117,15 +120,22 @@
       (rowProps, cells0) = collect $ cur $/ element (n_ "sheetData") &/ element (n_ "row") >=> parseRow
       parseRow :: Cursor -> [(Int, Maybe RowProperties, [(Int, Int, Cell)])]
       parseRow c = do
-        r <- c $| attribute "r" >=> decimal
-        let ht = if attribute "customHeight" c == ["true"]
-                 then listToMaybe $ c $| attribute "ht" >=> rational
-                 else Nothing
-        let s = listToMaybe $ decimal =<< attribute "s" c :: Maybe Int
-        let rp = if isNothing s && isNothing ht
-                 then  Nothing
-                 else  Just (RowProps ht s)
-        return (r, rp, c $/ element (n_ "c") >=> parseCell)
+        r <- fromAttribute "r" c
+        let prop = RowProps
+              { rowHeight = do h <- listToMaybe $ fromAttribute "ht" c
+                               case fromAttribute "customHeight" c of
+                                 [True] -> return $ CustomHeight    h
+                                 _      -> return $ AutomaticHeight h
+              , rowStyle  = listToMaybe $ fromAttribute "s" c
+              , rowHidden =
+                  case fromAttribute "hidden" c of
+                    []  -> False
+                    f:_ -> f
+              }
+        return ( r
+               , if prop == def then Nothing else Just prop
+               , c $/ element (n_ "c") >=> parseCell
+               )
       parseCell :: Cursor -> [(Int, Int, Cell)]
       parseCell cell = do
         ref <- fromAttribute "r" cell
diff --git a/src/Codec/Xlsx/Parser/Internal.hs b/src/Codec/Xlsx/Parser/Internal.hs
--- a/src/Codec/Xlsx/Parser/Internal.hs
+++ b/src/Codec/Xlsx/Parser/Internal.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE OverloadedStrings  #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Parser.Internal
     ( ParseException(..)
     , n_
@@ -27,21 +28,22 @@
     , rational
     ) where
 
-import           Control.Exception       (Exception)
-import           Data.Maybe
-import           Data.Text               (Text)
-import qualified Data.Text               as T
-import qualified Data.Text.Read          as T
-import           Data.Typeable           (Typeable)
-import           Text.XML
-import           Text.XML.Cursor
+import Control.Exception (Exception)
+import Data.Maybe
+import Data.Text (Text)
+import qualified Data.Text as T
+import qualified Data.Text.Read as T
+import Data.Typeable (Typeable)
+import GHC.Generics (Generic)
+import Text.XML
+import Text.XML.Cursor
 
 #if !MIN_VERSION_base(4,8,0)
-import           Control.Applicative
+import Control.Applicative
 #endif
 
 data ParseException = ParseException String
-                    deriving (Show, Typeable)
+                    deriving (Show, Typeable, Generic)
 
 instance Exception ParseException
 
diff --git a/src/Codec/Xlsx/Parser/Internal/PivotTable.hs b/src/Codec/Xlsx/Parser/Internal/PivotTable.hs
--- a/src/Codec/Xlsx/Parser/Internal/PivotTable.hs
+++ b/src/Codec/Xlsx/Parser/Internal/PivotTable.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Parser.Internal.PivotTable
   ( parsePivotTable
   , parseCache
diff --git a/src/Codec/Xlsx/Types.hs b/src/Codec/Xlsx/Types.hs
--- a/src/Codec/Xlsx/Types.hs
+++ b/src/Codec/Xlsx/Types.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types (
     -- * The main types
     Xlsx(..)
@@ -14,6 +15,7 @@
     , CellValue(..)
     , CellFormula(..)
     , Cell(..)
+    , RowHeight(..)
     , RowProperties (..)
     -- * Lenses
     -- ** Workbook
@@ -52,43 +54,64 @@
     , module X
     ) where
 
-import           Control.Exception                      (SomeException,
-                                                         toException)
-import           Control.Lens.TH
-import qualified Data.ByteString.Lazy                   as L
-import           Data.Default
-import           Data.Function                          (on)
-import           Data.List                              (groupBy)
-import           Data.Map                               (Map)
-import qualified Data.Map                               as M
-import           Data.Maybe                             (catMaybes, isJust)
-import           Data.Text                              (Text)
-import           Text.XML                               (parseLBS, renderLBS)
-import           Text.XML.Cursor
+import Control.Exception (SomeException, toException)
+import Control.Lens.TH
+import qualified Data.ByteString.Lazy as L
+import Data.Default
+import Data.Function (on)
+import Data.List (groupBy)
+import Data.Map (Map)
+import qualified Data.Map as M
+import Data.Maybe (catMaybes, isJust)
+import Data.Text (Text)
+import GHC.Generics (Generic)
+import Text.XML (parseLBS, renderLBS)
+import Text.XML.Cursor
 
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Types.AutoFilter            as X
-import           Codec.Xlsx.Types.Cell                  as Cell
-import           Codec.Xlsx.Types.Comment               as X
-import           Codec.Xlsx.Types.Common                as X
-import           Codec.Xlsx.Types.ConditionalFormatting as X
-import           Codec.Xlsx.Types.DataValidation        as X
-import           Codec.Xlsx.Types.Drawing               as X
-import           Codec.Xlsx.Types.Drawing.Chart         as X
-import           Codec.Xlsx.Types.Drawing.Common        as X
-import           Codec.Xlsx.Types.PageSetup             as X
-import           Codec.Xlsx.Types.PivotTable            as X
-import           Codec.Xlsx.Types.Protection            as X
-import           Codec.Xlsx.Types.RichText              as X
-import           Codec.Xlsx.Types.SheetViews            as X
-import           Codec.Xlsx.Types.StyleSheet            as X
-import           Codec.Xlsx.Types.Table                 as X
-import           Codec.Xlsx.Types.Variant               as X
-import           Codec.Xlsx.Writer.Internal
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Types.AutoFilter as X
+import Codec.Xlsx.Types.Cell as Cell
+import Codec.Xlsx.Types.Comment as X
+import Codec.Xlsx.Types.Common as X
+import Codec.Xlsx.Types.ConditionalFormatting as X
+import Codec.Xlsx.Types.DataValidation as X
+import Codec.Xlsx.Types.Drawing as X
+import Codec.Xlsx.Types.Drawing.Chart as X
+import Codec.Xlsx.Types.Drawing.Common as X
+import Codec.Xlsx.Types.PageSetup as X
+import Codec.Xlsx.Types.PivotTable as X
+import Codec.Xlsx.Types.Protection as X
+import Codec.Xlsx.Types.RichText as X
+import Codec.Xlsx.Types.SheetViews as X
+import Codec.Xlsx.Types.StyleSheet as X
+import Codec.Xlsx.Types.Table as X
+import Codec.Xlsx.Types.Variant as X
+import Codec.Xlsx.Writer.Internal
 
-data RowProperties = RowProps { rowHeight :: Maybe Double, rowStyle::Maybe Int}
-                   deriving (Read,Eq,Show,Ord)
+-- | Height of a row in points (1/72in)
+data RowHeight
+  = CustomHeight    !Double
+    -- ^ Row height is set by the user
+  | AutomaticHeight !Double
+    -- ^ Row height is set automatically by the program
+  deriving (Eq, Ord, Show, Read, Generic)
 
+-- | Properties of a row. See §18.3.1.73 "row (Row)" for more details
+data RowProperties = RowProps
+  { rowHeight       :: Maybe RowHeight
+    -- ^ Row height in points
+  , rowStyle        :: Maybe Int
+    -- ^ Style to be applied to row
+  , rowHidden       :: Bool
+    -- ^ Whether row is visible or not
+  } deriving (Eq, Ord, Show, Read, Generic)
+
+instance Default RowProperties where
+  def = RowProps { rowHeight       = Nothing
+                 , rowStyle        = Nothing
+                 , rowHidden       = False
+                 }
+
 -- | Column range (from cwMin to cwMax) properties
 data ColumnsProperties = ColumnsProperties
   { cpMin :: Int
@@ -115,7 +138,7 @@
   , cpBestFit :: Bool
   -- ^ Flag indicating if the specified column(s) is set to 'best
   -- fit'.
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 instance FromCursor ColumnsProperties where
   fromCursor c = do
@@ -143,7 +166,7 @@
   , _wsAutoFilter :: Maybe AutoFilter
   , _wsTables :: [Table]
   , _wsProtection :: Maybe SheetProtection
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 makeLenses ''Worksheet
 
@@ -166,7 +189,7 @@
     }
 
 newtype Styles = Styles {unStyles :: L.ByteString}
-            deriving (Eq, Show)
+            deriving (Eq, Show, Generic)
 
 -- | Structured representation of Xlsx file (currently a subset of its contents)
 data Xlsx = Xlsx
@@ -174,7 +197,7 @@
     , _xlStyles           :: Styles
     , _xlDefinedNames     :: DefinedNames
     , _xlCustomProperties :: Map Text Variant
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 -- | Defined names
 --
@@ -198,7 +221,7 @@
 --
 -- NOTE: Right now this is only a minimal implementation of defined names.
 newtype DefinedNames = DefinedNames [(Text, Maybe Text, Text)]
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 makeLenses ''Xlsx
 
diff --git a/src/Codec/Xlsx/Types/AutoFilter.hs b/src/Codec/Xlsx/Types/AutoFilter.hs
--- a/src/Codec/Xlsx/Types/AutoFilter.hs
+++ b/src/Codec/Xlsx/Types/AutoFilter.hs
@@ -1,8 +1,11 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.AutoFilter where
 
+import GHC.Generics (Generic)
+
 import Control.Lens (makeLenses)
 import Data.Default
 import Data.Map (Map)
@@ -30,12 +33,12 @@
                     CustomFilter
   | CustomFiltersAnd CustomFilter
                      CustomFilter
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 data CustomFilter = CustomFilter
   { cfltOperator :: CustomFilterOperator
   , cfltValue :: Text
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 data CustomFilterOperator
   = FltrEqual
@@ -50,7 +53,7 @@
     -- ^ Show results which are less than or equal to criteria.
   | FltrNotEqual
     -- ^ Show results which are not equal to criteria.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | AutoFilter temporarily hides rows based on a filter criteria,
 -- which is applied column by column to a table of datain the
@@ -62,7 +65,7 @@
 data AutoFilter = AutoFilter
   { _afRef :: Maybe CellRef
   , _afFilterColumns :: Map Int FilterColumn
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 makeLenses ''AutoFilter
 
diff --git a/src/Codec/Xlsx/Types/Cell.hs b/src/Codec/Xlsx/Types/Cell.hs
--- a/src/Codec/Xlsx/Types/Cell.hs
+++ b/src/Codec/Xlsx/Types/Cell.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Cell
   ( CellFormula(..)
   , simpleCellFormula
@@ -18,6 +19,7 @@
 import qualified Data.Map as M
 import Data.Maybe (catMaybes)
 import Data.Text (Text)
+import GHC.Generics (Generic)
 import Text.XML
 import Text.XML.Cursor
 
@@ -41,7 +43,7 @@
       -- the next time calculation is performed.
       -- [/Example/: This is always set on volatile functions,
       -- like =RAND(), and circular references. /end example/]
-      } deriving (Eq, Show)
+      } deriving (Eq, Show, Generic)
 
 simpleCellFormula :: Text -> CellFormula
 simpleCellFormula expr = NormalCellFormula
@@ -57,7 +59,7 @@
     , _cellValue   :: Maybe CellValue
     , _cellComment :: Maybe Comment
     , _cellFormula :: Maybe CellFormula
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 instance Default Cell where
     def = Cell Nothing Nothing Nothing Nothing
diff --git a/src/Codec/Xlsx/Types/Comment.hs b/src/Codec/Xlsx/Types/Comment.hs
--- a/src/Codec/Xlsx/Types/Comment.hs
+++ b/src/Codec/Xlsx/Types/Comment.hs
@@ -1,8 +1,10 @@
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Comment where
 
-import           Data.Text               (Text)
+import Data.Text (Text)
+import GHC.Generics (Generic)
 
-import           Codec.Xlsx.Types.Common
+import Codec.Xlsx.Types.Common
 
 -- | User comment for a cell
 --
@@ -17,4 +19,4 @@
     , _commentAuthor  :: Text
     -- ^ comment author
     , _commentVisible :: Bool
-    } deriving (Show, Eq)
+    } deriving (Eq, Show, Generic)
diff --git a/src/Codec/Xlsx/Types/Common.hs b/src/Codec/Xlsx/Types/Common.hs
--- a/src/Codec/Xlsx/Types/Common.hs
+++ b/src/Codec/Xlsx/Types/Common.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Common
   ( CellRef(..)
   , singleCellRef
@@ -16,6 +17,8 @@
   , col2int
   ) where
 
+import GHC.Generics (Generic)
+
 import Control.Arrow
 import Control.Monad (guard)
 import Data.Char
@@ -56,7 +59,7 @@
 -- See 18.18.62 @ST_Ref@ (p. 2482)
 newtype CellRef = CellRef
   { unCellRef :: Text
-  } deriving (Eq, Ord, Show)
+  } deriving (Eq, Ord, Show, Generic)
 
 -- | Render position in @(row, col)@ format to an Excel reference.
 --
@@ -107,7 +110,7 @@
 --
 -- See 18.18.76 "ST_Sqref (Reference Sequence)" (p.2488)
 newtype SqRef = SqRef [CellRef]
-    deriving (Eq, Ord, Show)
+    deriving (Eq, Ord, Show, Generic)
 
 -- | Common type containing either simple string or rich formatted text.
 -- Used in @si@, @comment@ and @is@ elements
@@ -129,13 +132,13 @@
 -- See @CT_Rst@, p. 3903
 data XlsxText = XlsxText Text
               | XlsxRichText [RichTextRun]
-              deriving (Show, Eq, Ord)
+              deriving (Eq, Ord, Show, Generic)
 
 -- | A formula
 --
 -- See 18.18.35 "ST_Formula (Formula)" (p. 2457)
 newtype Formula = Formula {unFormula :: Text}
-    deriving (Eq, Ord, Show)
+    deriving (Eq, Ord, Show, Generic)
 
 -- | Cell values include text, numbers and booleans,
 -- standard includes date format also but actually dates
@@ -146,7 +149,7 @@
   | CellDouble Double
   | CellBool Bool
   | CellRich [RichTextRun]
-  deriving (Eq, Ord, Show)
+  deriving (Eq, Ord, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Parsing
diff --git a/src/Codec/Xlsx/Types/ConditionalFormatting.hs b/src/Codec/Xlsx/Types/ConditionalFormatting.hs
--- a/src/Codec/Xlsx/Types/ConditionalFormatting.hs
+++ b/src/Codec/Xlsx/Types/ConditionalFormatting.hs
@@ -1,33 +1,35 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards   #-}
 {-# LANGUAGE TemplateHaskell   #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.ConditionalFormatting
-    ( ConditionalFormatting
-    , CfRule(..)
-    , Condition(..)
-    , OperatorExpression (..)
-    , TimePeriod (..)
+  ( ConditionalFormatting
+  , CfRule(..)
+  , Condition(..)
+  , OperatorExpression(..)
+  , TimePeriod(..)
     -- * Lenses
     -- ** CfRule
-    , cfrCondition
-    , cfrDxfId
-    , cfrPriority
-    , cfrStopIfTrue
+  , cfrCondition
+  , cfrDxfId
+  , cfrPriority
+  , cfrStopIfTrue
     -- * Misc
-    , topCfPriority
-    ) where
+  , topCfPriority
+  ) where
 
-import           Control.Lens               (makeLenses)
-import           Data.Map                   (Map)
-import qualified Data.Map                   as M
-import           Data.Maybe
-import           Data.Text                  (Text)
-import           Text.XML
-import           Text.XML.Cursor
+import Control.Lens (makeLenses)
+import Data.Map (Map)
+import qualified Data.Map as M
+import Data.Maybe
+import Data.Text (Text)
+import GHC.Generics (Generic)
+import Text.XML
+import Text.XML.Cursor
 
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Types.Common
-import           Codec.Xlsx.Writer.Internal
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Types.Common
+import Codec.Xlsx.Writer.Internal
 
 -- | Logical operation used in 'CellIs' condition
 --
@@ -46,7 +48,7 @@
     | OpNotBetween Formula Formula -- ^ 'Not between' operator
     | OpNotContains Formula        -- ^ 'Does not contain' operator
     | OpNotEqual Formula           -- ^ 'Not equal to' operator
-    deriving (Eq, Ord, Show)
+    deriving (Eq, Ord, Show, Generic)
 
 -- | Used in a "contains dates" conditional formatting rule.
 -- These are dynamic time periods, which change based on
@@ -64,7 +66,7 @@
     | PerToday      -- ^ Today's date.
     | PerTomorrow   -- ^ Tomorrow's date.
     | PerYesterday  -- ^ Yesterday's date.
-    deriving (Eq, Ord, Show)
+    deriving (Eq, Ord, Show, Generic)
 
 -- | Conditions which could be used for conditional formatting
 --
@@ -129,7 +131,7 @@
     -- TODO: timePeriod
     -- TODO: top10
     -- TODO: uniqueValues
-    deriving (Eq, Ord, Show)
+    deriving (Eq, Ord, Show, Generic)
 
 -- | This collection represents a description of a conditional formatting rule.
 --
@@ -149,7 +151,7 @@
     -- be applied over this rule, when this rule
     -- evaluates to true.
     , _cfrStopIfTrue :: Maybe Bool
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Ord, Show, Generic)
 
 makeLenses ''CfRule
 
diff --git a/src/Codec/Xlsx/Types/DataValidation.hs b/src/Codec/Xlsx/Types/DataValidation.hs
--- a/src/Codec/Xlsx/Types/DataValidation.hs
+++ b/src/Codec/Xlsx/Types/DataValidation.hs
@@ -1,23 +1,25 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards   #-}
 {-# LANGUAGE TemplateHaskell   #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.DataValidation where
 
-import           Control.Lens.TH            (makeLenses)
-import           Control.Monad              ((>=>))
-import           Data.Char                  (isSpace)
-import           Data.Default
-import qualified Data.Map                   as M
-import           Data.Maybe                 (catMaybes)
-import           Data.Monoid                ((<>))
-import           Data.Text                  (Text)
-import qualified Data.Text                  as T
-import           Text.XML                   (Node (..), Element (..))
-import           Text.XML.Cursor            (Cursor, ($/), element)
+import Control.Lens.TH (makeLenses)
+import Control.Monad ((>=>))
+import Data.Char (isSpace)
+import Data.Default
+import qualified Data.Map as M
+import Data.Maybe (catMaybes)
+import Data.Monoid ((<>))
+import Data.Text (Text)
+import qualified Data.Text as T
+import GHC.Generics (Generic)
+import Text.XML (Node(..), Element(..))
+import Text.XML.Cursor (Cursor, ($/), element)
 
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Types.Common
-import           Codec.Xlsx.Writer.Internal
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Types.Common
+import Codec.Xlsx.Writer.Internal
 
 -- See 18.18.20 "ST_DataValidationOperator (Data Validation Operator)" (p. 2439/2449)
 data ValidationExpression
@@ -29,7 +31,7 @@
     | ValLessThanOrEqual Formula    -- ^ "Less than or equal to" operator
     | ValNotBetween Formula Formula -- ^ "Not between" operator
     | ValNotEqual Formula           -- ^ "Not equal to" operator
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic)
 
 -- See 18.18.21 "ST_DataValidationType (Data Validation Type)" (p. 2440/2450)
 data ValidationType
@@ -41,14 +43,14 @@
     | ValidationTypeTextLength ValidationExpression
     | ValidationTypeTime       ValidationExpression
     | ValidationTypeWhole      ValidationExpression
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic)
 
 -- See 18.18.18 "ST_DataValidationErrorStyle (Data Validation Error Styles)" (p. 2438/2448)
 data ErrorStyle
     = ErrorStyleInformation
     | ErrorStyleStop
     | ErrorStyleWarning
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic)
 
 -- See 18.3.1.32 "dataValidation (Data Validation)" (p. 1614/1624)
 data DataValidation = DataValidation
@@ -62,7 +64,7 @@
     , _dvShowErrorMessage :: Bool
     , _dvShowInputMessage :: Bool
     , _dvValidationType   :: ValidationType
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 makeLenses ''DataValidation
 
diff --git a/src/Codec/Xlsx/Types/Drawing.hs b/src/Codec/Xlsx/Types/Drawing.hs
--- a/src/Codec/Xlsx/Types/Drawing.hs
+++ b/src/Codec/Xlsx/Types/Drawing.hs
@@ -8,6 +8,7 @@
 {-# LANGUAGE TupleSections #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE TypeSynonymInstances #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Drawing where
 
 import Control.Arrow (first)
@@ -18,6 +19,7 @@
 import Data.Maybe (catMaybes, listToMaybe, mapMaybe)
 import Data.Text (Text)
 import qualified Data.Text as T
+import GHC.Generics (Generic)
 import Text.XML
 import Text.XML.Cursor
 
@@ -41,14 +43,14 @@
     -- if interoperability is wanted
     , _fiContents    :: ByteString
     -- ^ image file contents
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 data Marker = Marker
     { _mrkCol    :: Int
     , _mrkColOff :: Coordinate
     , _mrkRow    :: Int
     , _mrkRowOff :: Coordinate
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 unqMarker :: (Int, Int) -> (Int, Int) -> Marker
 unqMarker (col, colOff) (row, rowOff) =
@@ -58,7 +60,7 @@
     = EditAsTwoCell
     | EditAsOneCell
     | EditAsAbsolute
-    deriving (Eq,Show)
+    deriving (Eq, Show, Generic)
 
 data Anchoring
     = AbsoluteAnchor
@@ -74,7 +76,7 @@
       , tcaTo     :: Marker
       , tcaEditAs :: EditAs
       }
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic)
 
 data DrawingObject p g
   = Picture { _picMacro :: Maybe Text
@@ -88,7 +90,7 @@
            ,  _grChartSpace :: g
            ,  _grTransform :: Transform2D}
     -- TODO: sp, grpSp, graphicFrame, cxnSp, contentPart
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | basic function to create picture drawing object
 --
@@ -147,21 +149,21 @@
     , _cldPrintsWithSheet :: Bool
     -- ^ This attribute indicates whether to print drawing elements
     -- when printing the sheet.
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 data PicNonVisual = PicNonVisual
   { _pnvDrawingProps :: NonVisualDrawingProperties
     -- TODO: cNvPicPr
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 data GraphNonVisual = GraphNonVisual
   { _gnvDrawingProps :: NonVisualDrawingProperties
     -- TODO cNvGraphicFramePr
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 newtype DrawingElementId = DrawingElementId
   { unDrawingElementId :: Int
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- see 20.1.2.2.8 "cNvPr (Non-Visual Drawing Properties)" (p. 2731)
 data NonVisualDrawingProperties = NonVisualDrawingProperties
@@ -178,13 +180,13 @@
     -- ^ Alternative Text for Object
     , _nvdpHidden      :: Bool
     , _nvdpTitle       :: Maybe Text
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 data BlipFillProperties a = BlipFillProperties
     { _bfpImageInfo :: Maybe a
     , _bfpFillMode  :: Maybe FillMode
     -- TODO: dpi, rotWithShape, srcRect
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 -- see @a_EG_FillModeProperties@ (p. 4319)
 data FillMode
@@ -192,14 +194,14 @@
     = FillTile    -- TODO: tx, ty, sx, sy, flip, algn
     -- See 20.1.8.56 "stretch (Stretch)" (p. 2879)
     | FillStretch -- TODO: srcRect
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic)
 
 -- See @EG_Anchor@ (p. 4052)
 data Anchor p g = Anchor
     { _anchAnchoring  :: Anchoring
     , _anchObject     :: DrawingObject p g
     , _anchClientData :: ClientData
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 -- | simple drawing object anchoring using one cell as a top lelft
 -- corner and dimensions of that object
@@ -212,14 +214,14 @@
 simpleAnchorXY (x, y) sz obj =
   Anchor
   { _anchAnchoring =
-      OneCellAnchor {onecaFrom = unqMarker (x, fromIntegral $ cm2emu 10) (y, 0), onecaExt = sz}
+      OneCellAnchor {onecaFrom = unqMarker (x, 0) (y, 0), onecaExt = sz}
   , _anchObject = obj
   , _anchClientData = def
   }
 
 data GenericDrawing p g = Drawing
     { _xdrAnchors :: [Anchor p g]
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 -- See 20.5.2.35 "wsDr (Worksheet Drawing)" (p. 3176)
 type Drawing = GenericDrawing FileInfo ChartSpace
diff --git a/src/Codec/Xlsx/Types/Drawing/Chart.hs b/src/Codec/Xlsx/Types/Drawing/Chart.hs
--- a/src/Codec/Xlsx/Types/Drawing/Chart.hs
+++ b/src/Codec/Xlsx/Types/Drawing/Chart.hs
@@ -2,8 +2,11 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Drawing.Chart where
 
+import GHC.Generics (Generic)
+
 import Control.Lens.TH
 import Data.Default
 import Data.Maybe (catMaybes, maybeToList)
@@ -29,14 +32,14 @@
   , _chspLegend :: Maybe Legend
   , _chspPlotVisOnly :: Maybe Bool
   , _chspDispBlanksAs :: Maybe DispBlanksAs
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Chart title
 --
 -- TODO: layout, overlay, spPr, txPr, extLst
 newtype ChartTitle =
   ChartTitle TextBody
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | This simple type specifies the possible ways to display blanks.
 --
@@ -48,13 +51,13 @@
     -- ^ Specifies that blank values shall be spanned with a line.
   | DispBlanksAsZero
     -- ^ Specifies that blank values shall be treated as zero.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- TODO: legendEntry, layout, overlay, spPr, txPr, extLst
 data Legend = Legend
     { _legendPos     :: Maybe LegendPos
     , _legendOverlay :: Maybe Bool
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 -- See 21.2.3.24 "ST_LegendPos (Legend Position)" (p. 3449)
 data LegendPos
@@ -73,7 +76,7 @@
   | LegendTopRight
     -- ^ tr (Top Right) Specifies that the legend shall be drawn at
     -- the top right of the chart.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | Specific Chart
 -- TODO:
@@ -101,7 +104,7 @@
   | ScatterChart { _scchStyle :: ScatterStyle
                  , _scchSeries :: [ScatterSeries]
                  }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | Possible groupings for a bar chart
 --
@@ -116,7 +119,7 @@
   | StandardGrouping
     -- ^(Standard) Specifies that the chart series are drawn on the value
     -- axis.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | Possible directions for a bar chart
 --
@@ -124,7 +127,7 @@
 data BarDirection
   = DirectionBar
   | DirectionColumn
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | Possible styles of scatter chart
 --
@@ -140,7 +143,7 @@
   | ScatterMarker
   | ScatterSmooth
   | ScatterSmoothMarker
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | Single data point options
 --
@@ -150,7 +153,7 @@
 data DataPoint = DataPoint
   { _dpMarker :: Maybe DataMarker
   , _dpShapeProperties :: Maybe ShapeProperties
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Specifies common series options
 -- TODO: spPr
@@ -161,7 +164,7 @@
     -- ^ specifies text for a series name, without rich text formatting
     -- currently only reference formula is supported
   , _serShapeProperties :: Maybe ShapeProperties
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | A series on a line chart
 --
@@ -175,7 +178,7 @@
   , _lnserVal :: Maybe Formula
     -- ^ currently only reference formula is supported
   , _lnserSmooth :: Maybe Bool
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | A series on an area chart
 --
@@ -186,7 +189,7 @@
   { _arserShared :: Series
   , _arserDataLblProps :: Maybe DataLblProps
   , _arserVal :: Maybe Formula
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | A series on a bar chart
 --
@@ -198,7 +201,7 @@
   { _brserShared :: Series
   , _brserDataLblProps :: Maybe DataLblProps
   , _brserVal :: Maybe Formula
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | A series on a pie chart
 --
@@ -212,7 +215,7 @@
   -- properly colored
   , _piserDataLblProps :: Maybe DataLblProps
   , _piserVal :: Maybe Formula
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | A series on a scatter chart
 --
@@ -226,14 +229,14 @@
   , _scserXVal :: Maybe Formula
   , _scserYVal :: Maybe Formula
   , _scserSmooth :: Maybe Bool
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- See @CT_Marker@ (p. 4061)
 data DataMarker = DataMarker
   { _dmrkSymbol :: Maybe DataMarkerSymbol
   , _dmrkSize :: Maybe Int
     -- ^ integer between 2 and 72, specifying a size in points
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 data DataMarkerSymbol
   = DataMarkerCircle
@@ -248,7 +251,7 @@
   | DataMarkerTriangle
   | DataMarkerX
   | DataMarkerAuto
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | Settings for the data labels for an entire series or the
 -- entire chart
@@ -262,7 +265,7 @@
   , _dlblShowCatName :: Maybe Bool
   , _dlblShowSerName :: Maybe Bool
   , _dlblShowPercent :: Maybe Bool
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Specifies the possible positions for tick marks.
 
@@ -276,7 +279,7 @@
     -- ^ (None) Specifies there shall be no tick marks.
   | TickMarkOut
     -- ^ (Outside) Specifies the tick marks shall be outside the plot area.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 makeLenses ''DataPoint
 
diff --git a/src/Codec/Xlsx/Types/Drawing/Common.hs b/src/Codec/Xlsx/Types/Drawing/Common.hs
--- a/src/Codec/Xlsx/Types/Drawing/Common.hs
+++ b/src/Codec/Xlsx/Types/Drawing/Common.hs
@@ -2,8 +2,11 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Drawing.Common where
 
+import GHC.Generics (Generic)
+
 import Control.Arrow (first)
 import Control.Lens.TH
 import Control.Monad (join)
@@ -28,7 +31,7 @@
 -- angles are counter-clockwise (i.e., towards the negative y axis).
 newtype Angle =
   Angle Int
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | A string with rich text formatting
 --
@@ -58,7 +61,7 @@
     -- aligns the text within the "bounds box" for the text.
   , _txbdParagraphs :: [TextParagraph]
     -- ^ Paragraphs of text within the containing text body
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Text vertical overflow
 -- See 20.1.10.83 "ST_TextVertOverflowType (Text Vertical Overflow)" (p. 3083)
@@ -71,7 +74,7 @@
     -- there is text which is not visible.
   | TextVertOverflow
     -- ^ Overflow the text and pay no attention to top and bottom barriers.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | If there is vertical text, determines what kind of vertical text is going to be used.
 --
@@ -100,7 +103,7 @@
   | TextVerticalWordArtRtl
     -- ^  Specifies that vertical WordArt should be shown from right to left rather than
     -- left to right.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | Text wrapping types
 --
@@ -111,7 +114,7 @@
     -- paying attention to the bounding rectangle boundaries.
     | TextWrapSquare
     -- ^ Determines whether we wrap words within the bounding rectangle.
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic)
 
 -- | This type specifies a list of available anchoring types for text.
 --
@@ -137,13 +140,13 @@
     -- text in a line, it does not justify.
   | TextAnchoringTop
     -- ^ Anchor the text at the top of the bounding rectangle.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- See 21.1.2.2.6 "p (Text Paragraphs)" (p. 3211)
 data TextParagraph = TextParagraph
   { _txpaDefCharProps :: Maybe TextCharacterProperties
   , _txpaRuns :: [TextRun]
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Text character properties
 --
@@ -158,7 +161,7 @@
   { _txchBold :: Bool
   , _txchItalic :: Bool
   , _txchUnderline :: Bool
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Text run
 --
@@ -166,7 +169,7 @@
 data TextRun = RegularRun
   { _txrCharProps :: Maybe TextCharacterProperties
   , _txrText :: Text
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | This simple type represents a one dimensional position or length
 --
@@ -177,7 +180,7 @@
   | UniversalMeasure UnitIdentifier
                      Double
     -- ^ see 22.9.2.15 "ST_UniversalMeasure (Universal Measurement)" (p. 3793)
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | Units used in "Universal measure" coordinates
 -- see 22.9.2.15 "ST_UniversalMeasure (Universal Measurement)" (p. 3793)
@@ -188,13 +191,13 @@
   | UnitPt -- "pt" 1 pt = 1/72 in (informative)
   | UnitPc -- "pc" 1 pc = 12 pt (informative)
   | UnitPi -- "pi" 1 pi = 12 pt (informative)
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- See @CT_Point2D@ (p. 3989)
 data Point2D = Point2D
   { _pt2dX :: Coordinate
   , _pt2dY :: Coordinate
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 unqPoint2D :: Int -> Int -> Point2D
 unqPoint2D x y = Point2D (UnqCoordinate x) (UnqCoordinate y)
@@ -203,12 +206,12 @@
 -- see 20.1.10.41 "ST_PositiveCoordinate (Positive Coordinate)" (p. 2942)
 newtype PositiveCoordinate =
   PositiveCoordinate Integer
-  deriving (Eq, Ord, Show)
+  deriving (Eq, Ord, Show, Generic)
 
 data PositiveSize2D = PositiveSize2D
   { _ps2dX :: PositiveCoordinate
   , _ps2dY :: PositiveCoordinate
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 positiveSize2D :: Integer -> Integer -> PositiveSize2D
 positiveSize2D x y =
@@ -235,14 +238,14 @@
   , _trExtents :: Maybe PositiveSize2D
     -- ^ See 20.1.7.3 "ext (Extents)" (p. 2846) or
     -- 20.5.2.14 "ext (Shape Extent)" (p. 3165)
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- TODO: custGeom
 data Geometry =
   PresetGeometry
   -- TODO: prst, avList
   -- currently uses "rect" with empty avList
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- See 20.1.2.2.35 "spPr (Shape Properties)" (p. 2751)
 data ShapeProperties = ShapeProperties
@@ -251,7 +254,7 @@
   , _spFill :: Maybe FillProperties
   , _spOutline :: Maybe LineProperties
     -- TODO: bwMode, a_EG_EffectProperties, scene3d, sp3d, extLst
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Specifies an outline style that can be applied to a number of
 -- different objects such as shapes and text.
@@ -266,7 +269,7 @@
   -- ^ Specifies the width to be used for the underline stroke.  The
   -- value is in EMU, is greater of equal to 0 and maximum value is
   -- 20116800.
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Color choice for some drawing element
 --
@@ -280,7 +283,7 @@
   -- digits, RRGGBB. A perceptual gamma of 2.2 is used.
   --
   -- See 20.1.2.3.32 "srgbClr (RGB Color Model - Hex Variant)" (p. 2773)
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- TODO: gradFill, pattFill
 data FillProperties =
@@ -289,7 +292,7 @@
   | SolidFill (Maybe ColorChoice)
   -- ^ Solid fill
   -- See 20.1.8.54 "solidFill (Solid Fill)" (p. 2879)
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | solid fill with color specified by hexadecimal RGB color
 solidRgb :: Text -> FillProperties
diff --git a/src/Codec/Xlsx/Types/Internal.hs b/src/Codec/Xlsx/Types/Internal.hs
--- a/src/Codec/Xlsx/Types/Internal.hs
+++ b/src/Codec/Xlsx/Types/Internal.hs
@@ -1,17 +1,19 @@
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Internal where
 
-import           Control.Arrow
-import           Data.Text                  (Text)
+import Control.Arrow
+import Data.Text (Text)
+import GHC.Generics (Generic)
 
 #if !MIN_VERSION_base(4,8,0)
-import           Control.Applicative
+import Control.Applicative
 #endif
 
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Writer.Internal
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Writer.Internal
 
-newtype RefId = RefId { unRefId :: Text } deriving (Show, Eq, Ord)
+newtype RefId = RefId { unRefId :: Text } deriving (Eq, Ord, Show, Generic)
 
 instance ToAttrVal RefId where
     toAttrVal = toAttrVal . unRefId
diff --git a/src/Codec/Xlsx/Types/Internal/CfPair.hs b/src/Codec/Xlsx/Types/Internal/CfPair.hs
--- a/src/Codec/Xlsx/Types/Internal/CfPair.hs
+++ b/src/Codec/Xlsx/Types/Internal/CfPair.hs
@@ -1,13 +1,14 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Internal.CfPair where
 
-import           Text.XML.Cursor
-
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Types.Common
-import           Codec.Xlsx.Types.ConditionalFormatting
-import           Codec.Xlsx.Writer.Internal
+import GHC.Generics (Generic)
+import Text.XML.Cursor
 
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Types.Common
+import Codec.Xlsx.Types.ConditionalFormatting
+import Codec.Xlsx.Writer.Internal
 
 -- | Internal helper type for parsing "conditionalFormatting recods
 -- TODO: pivot, extList
@@ -16,7 +17,7 @@
 -- See 18.3.1.18 "conditionalFormatting (Conditional Formatting)" (p. 1610)
 newtype CfPair = CfPair
     { unCfPair :: (SqRef, ConditionalFormatting)
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 instance FromCursor CfPair where
     fromCursor cur = do
diff --git a/src/Codec/Xlsx/Types/Internal/CommentTable.hs b/src/Codec/Xlsx/Types/Internal/CommentTable.hs
--- a/src/Codec/Xlsx/Types/Internal/CommentTable.hs
+++ b/src/Codec/Xlsx/Types/Internal/CommentTable.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards   #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Internal.CommentTable where
 
 import Data.ByteString.Lazy (ByteString)
@@ -12,6 +13,7 @@
 import Data.Text.Lazy (toStrict)
 import qualified Data.Text.Lazy.Builder as B
 import qualified Data.Text.Lazy.Builder.Int as B
+import GHC.Generics (Generic)
 import Safe
 import Text.XML
 import Text.XML.Cursor
@@ -23,7 +25,7 @@
 
 newtype CommentTable = CommentTable
     { _commentsTable :: Map CellRef Comment }
-    deriving (Show, Eq)
+    deriving (Eq, Show, Generic)
 
 fromList :: [(CellRef, Comment)] -> CommentTable
 fromList = CommentTable . M.fromList
diff --git a/src/Codec/Xlsx/Types/Internal/ContentTypes.hs b/src/Codec/Xlsx/Types/Internal/ContentTypes.hs
--- a/src/Codec/Xlsx/Types/Internal/ContentTypes.hs
+++ b/src/Codec/Xlsx/Types/Internal/ContentTypes.hs
@@ -1,38 +1,40 @@
 {-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards   #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Internal.ContentTypes where
 
-import           Control.Arrow
-import           Data.Foldable              (asum)
-import           Data.Map                   (Map)
-import qualified Data.Map                   as M
-import           Data.Text                  (Text)
-import qualified Data.Text                  as T
-import           System.FilePath.Posix      (takeExtension)
-import           Text.XML
-import           Text.XML.Cursor
+import Control.Arrow
+import Data.Foldable (asum)
+import Data.Map (Map)
+import qualified Data.Map as M
+import Data.Text (Text)
+import qualified Data.Text as T
+import GHC.Generics (Generic)
+import System.FilePath.Posix (takeExtension)
+import Text.XML
+import Text.XML.Cursor
 
 #if !MIN_VERSION_base(4,8,0)
-import           Control.Applicative
+import Control.Applicative
 #endif
 
-import           Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Parser.Internal
 
 data CtDefault = CtDefault
     { dfltExtension   :: FilePath
     , dfltContentType :: Text
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 data Override = Override
     { ovrPartName    :: FilePath
     , ovrContentType :: Text
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 data ContentTypes = ContentTypes
     { ctDefaults :: Map FilePath Text
     , ctTypes    :: Map FilePath Text
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 lookup :: FilePath -> ContentTypes -> Maybe Text
 lookup path ContentTypes{..} =
diff --git a/src/Codec/Xlsx/Types/Internal/CustomProperties.hs b/src/Codec/Xlsx/Types/Internal/CustomProperties.hs
--- a/src/Codec/Xlsx/Types/Internal/CustomProperties.hs
+++ b/src/Codec/Xlsx/Types/Internal/CustomProperties.hs
@@ -1,18 +1,20 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Internal.CustomProperties where
 
-import           Data.Map                   (Map)
-import qualified Data.Map                   as M
-import           Data.Text                  (Text)
-import           Text.XML
-import           Text.XML.Cursor
+import Data.Map (Map)
+import qualified Data.Map as M
+import Data.Text (Text)
+import GHC.Generics (Generic)
+import Text.XML
+import Text.XML.Cursor
 
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Types.Variant
-import           Codec.Xlsx.Writer.Internal
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Types.Variant
+import Codec.Xlsx.Writer.Internal
 
 newtype CustomProperties = CustomProperties (Map Text Variant)
-    deriving (Show, Eq)
+    deriving (Eq, Show, Generic)
 
 fromList :: [(Text, Variant)] -> CustomProperties
 fromList = CustomProperties . M.fromList
diff --git a/src/Codec/Xlsx/Types/Internal/DvPair.hs b/src/Codec/Xlsx/Types/Internal/DvPair.hs
--- a/src/Codec/Xlsx/Types/Internal/DvPair.hs
+++ b/src/Codec/Xlsx/Types/Internal/DvPair.hs
@@ -1,21 +1,22 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Internal.DvPair where
 
-import qualified Data.Map                   as M
-import           Text.XML                   (Element (..))
-
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Types.Common
-import           Codec.Xlsx.Types.DataValidation
-import           Codec.Xlsx.Writer.Internal
+import qualified Data.Map as M
+import GHC.Generics (Generic)
+import Text.XML (Element(..))
 
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Types.Common
+import Codec.Xlsx.Types.DataValidation
+import Codec.Xlsx.Writer.Internal
 
 -- | Internal helper type for parsing data validation records
 --
 -- See 18.3.1.32 "dataValidation (Data Validation)" (p. 1614/1624)
 newtype DvPair = DvPair
     { unDvPair :: (SqRef, DataValidation)
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 instance FromCursor DvPair where
     fromCursor cur = do
diff --git a/src/Codec/Xlsx/Types/Internal/NumFmtPair.hs b/src/Codec/Xlsx/Types/Internal/NumFmtPair.hs
--- a/src/Codec/Xlsx/Types/Internal/NumFmtPair.hs
+++ b/src/Codec/Xlsx/Types/Internal/NumFmtPair.hs
@@ -1,17 +1,19 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Internal.NumFmtPair where
 
-import           Data.Text                  (Text)
+import Data.Text (Text)
+import GHC.Generics (Generic)
 
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Writer.Internal
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Writer.Internal
 
 -- | Internal helper type for parsing "numFmt" recods
 --
 -- See 18.8.30 "numFmt (Number Format)" (p. 1777)
 newtype NumFmtPair = NumFmtPair
     { unNumFmtPair :: (Int, Text)
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Generic)
 
 instance FromCursor NumFmtPair where
     fromCursor cur = do
diff --git a/src/Codec/Xlsx/Types/Internal/Relationships.hs b/src/Codec/Xlsx/Types/Internal/Relationships.hs
--- a/src/Codec/Xlsx/Types/Internal/Relationships.hs
+++ b/src/Codec/Xlsx/Types/Internal/Relationships.hs
@@ -1,32 +1,34 @@
 {-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards   #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Internal.Relationships where
 
-import           Data.List                  (find)
-import           Data.Map                   (Map)
-import qualified Data.Map                   as Map
-import           Data.Monoid                ((<>))
-import           Data.Text                  (Text)
-import qualified Data.Text                  as T
-import           Network.URI                hiding (path)
-import           Prelude                    hiding (abs, lookup)
-import           Safe
-import           Text.XML
-import           Text.XML.Cursor
+import Data.List (find)
+import Data.Map (Map)
+import qualified Data.Map as Map
+import Data.Monoid ((<>))
+import Data.Text (Text)
+import qualified Data.Text as T
+import GHC.Generics (Generic)
+import Network.URI hiding (path)
+import Prelude hiding (abs, lookup)
+import Safe
+import Text.XML
+import Text.XML.Cursor
 
 #if !MIN_VERSION_base(4,8,0)
-import           Control.Applicative
+import Control.Applicative
 #endif
 
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Types.Internal
-import           Codec.Xlsx.Writer.Internal
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Types.Internal
+import Codec.Xlsx.Writer.Internal
 
 data Relationship = Relationship
     { relType   :: Text
     , relTarget :: FilePath
-    } deriving (Show, Eq)
+    } deriving (Eq, Show, Generic)
 
 -- | Describes relationships according to Open Packaging Convention
 --
@@ -34,7 +36,7 @@
 -- Conventions
 newtype Relationships = Relationships
     { relMap :: Map RefId Relationship
-    } deriving (Show, Eq)
+    } deriving (Eq, Show, Generic)
 
 fromList :: [(RefId, Relationship)] -> Relationships
 fromList = Relationships . Map.fromList
diff --git a/src/Codec/Xlsx/Types/Internal/SharedStringTable.hs b/src/Codec/Xlsx/Types/Internal/SharedStringTable.hs
--- a/src/Codec/Xlsx/Types/Internal/SharedStringTable.hs
+++ b/src/Codec/Xlsx/Types/Internal/SharedStringTable.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards   #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Internal.SharedStringTable (
     -- * Main types
     SharedStringTable(..)
@@ -10,22 +11,22 @@
   , sstEmpty
   ) where
 
-import           Control.Monad
-
-import qualified Data.Map                   as Map
-import           Data.Maybe                 (mapMaybe)
-import qualified Data.Set                   as Set
-import           Data.Text                  (Text)
-import           Data.Vector                (Vector)
-import qualified Data.Vector                as V
-import           Numeric.Search.Range       (searchFromTo)
-import           Safe                       (fromJustNote)
-import           Text.XML
-import           Text.XML.Cursor
+import Control.Monad
+import qualified Data.Map as Map
+import Data.Maybe (mapMaybe)
+import qualified Data.Set as Set
+import Data.Text (Text)
+import Data.Vector (Vector)
+import qualified Data.Vector as V
+import GHC.Generics (Generic)
+import Numeric.Search.Range (searchFromTo)
+import Safe (fromJustNote)
+import Text.XML
+import Text.XML.Cursor
 
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Types
-import           Codec.Xlsx.Writer.Internal
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Types
+import Codec.Xlsx.Writer.Internal
 
 -- | Shared string table
 --
@@ -47,7 +48,7 @@
 newtype SharedStringTable = SharedStringTable {
     sstTable :: Vector XlsxText
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 sstEmpty :: SharedStringTable
 sstEmpty = SharedStringTable V.empty
diff --git a/src/Codec/Xlsx/Types/PageSetup.hs b/src/Codec/Xlsx/Types/PageSetup.hs
--- a/src/Codec/Xlsx/Types/PageSetup.hs
+++ b/src/Codec/Xlsx/Types/PageSetup.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TemplateHaskell   #-}
 {-# LANGUAGE RecordWildCards   #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.PageSetup (
     -- * Main types
     PageSetup(..)
@@ -36,10 +37,11 @@
 
 import Control.Lens (makeLenses)
 import Data.Default
+import qualified Data.Map as Map
 import Data.Maybe (catMaybes)
 import Data.Text (Text)
+import GHC.Generics (Generic)
 import Text.XML
-import qualified Data.Map as Map
 
 import Codec.Xlsx.Writer.Internal
 import Codec.Xlsx.Parser.Internal
@@ -134,7 +136,7 @@
     -- | Vertical print resolution of the device.
   , _pageSetupVerticalDpi :: Maybe Int
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Enumerations
@@ -155,7 +157,7 @@
 
     -- | Do not print cell comments
   | CellCommentsNone
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Print errors
 --
@@ -173,14 +175,14 @@
 
      -- | Display cell errors as @#N/A@
    | PrintErrorsNA
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Print orientation for this sheet
 data Orientation =
     OrientationDefault
   | OrientationLandscape
   | OrientationPortrait
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Specifies printed page order
 data PageOrder =
@@ -189,7 +191,7 @@
 
     -- | Order pages horizontally first, then move vertically
   | PageOrderOverThenDown
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Paper size
 data PaperSize =
@@ -259,7 +261,7 @@
   | EnvelopeInvite               -- ^ Invite envelope (220 mm by 220 mm)
   | EnvelopeItaly                -- ^ Italy envelope (110 mm by 230 mm)
   | EnvelopeMonarch              -- ^ Monarch envelope (3.875 in. by 7.5 in.).
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Default instances
diff --git a/src/Codec/Xlsx/Types/PivotTable.hs b/src/Codec/Xlsx/Types/PivotTable.hs
--- a/src/Codec/Xlsx/Types/PivotTable.hs
+++ b/src/Codec/Xlsx/Types/PivotTable.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.PivotTable
   ( PivotTable(..)
   , PivotFieldName(..)
@@ -12,6 +13,7 @@
 
 import Control.Arrow (first)
 import Data.Text (Text)
+import GHC.Generics (Generic)
 
 import Codec.Xlsx.Types.Common
 import Codec.Xlsx.Parser.Internal
@@ -31,14 +33,14 @@
   , _pvtLocation :: CellRef
   , _pvtSrcSheet :: Text
   , _pvtSrcRef :: Range
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 data PivotFieldInfo = PivotFieldInfo
   { _pfiName :: PivotFieldName
   , _pfiOutline :: Bool
   , _pfiSortType :: FieldSortType
   , _pfiHiddenItems :: [CellValue]
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Sort orders that can be applied to fields in a PivotTable
 --
@@ -47,22 +49,22 @@
   = FieldSortAscending
   | FieldSortDescending
   | FieldSortManual
-  deriving (Eq, Ord, Show)
+  deriving (Eq, Ord, Show, Generic)
 
 newtype PivotFieldName =
   PivotFieldName Text
-  deriving (Eq, Ord, Show)
+  deriving (Eq, Ord, Show, Generic)
 
 data PositionedField
   = DataPosition
   | FieldPosition PivotFieldName
-  deriving (Eq, Ord, Show)
+  deriving (Eq, Ord, Show, Generic)
 
 data DataField = DataField
   { _dfField :: PivotFieldName
   , _dfName :: Text
   , _dfFunction :: ConsolidateFunction
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Data consolidation functions specified by the user and used to
 -- consolidate ranges of data
@@ -99,7 +101,7 @@
   | ConsolidateVarP
     -- ^ The variance of a population, where the population is all of
     -- the data to be summarized.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Rendering
diff --git a/src/Codec/Xlsx/Types/PivotTable/Internal.hs b/src/Codec/Xlsx/Types/PivotTable/Internal.hs
--- a/src/Codec/Xlsx/Types/PivotTable/Internal.hs
+++ b/src/Codec/Xlsx/Types/PivotTable/Internal.hs
@@ -1,11 +1,14 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.PivotTable.Internal
   ( CacheId(..)
   , CacheField(..)
   ) where
 
+import GHC.Generics (Generic)
+
 import Control.Arrow (first)
 import Data.Maybe (catMaybes)
 import Text.XML
@@ -20,12 +23,12 @@
 import Codec.Xlsx.Types.PivotTable
 import Codec.Xlsx.Writer.Internal
 
-newtype CacheId = CacheId Int deriving Eq
+newtype CacheId = CacheId Int deriving (Eq, Generic)
 
 data CacheField = CacheField
   { cfName :: PivotFieldName
   , cfItems :: [CellValue]
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Parsing
diff --git a/src/Codec/Xlsx/Types/Protection.hs b/src/Codec/Xlsx/Types/Protection.hs
--- a/src/Codec/Xlsx/Types/Protection.hs
+++ b/src/Codec/Xlsx/Types/Protection.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Protection
   ( SheetProtection(..)
   , fullSheetProtection
@@ -27,6 +28,8 @@
   , sprSelectUnlockedCells
   ) where
 
+import GHC.Generics (Generic)
+
 import Control.Arrow (first)
 import Control.Lens (makeLenses)
 import Data.Bits
@@ -43,7 +46,7 @@
 
 newtype LegacyPassword =
   LegacyPassword Text
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 -- | Creates legacy @XOR@ hashed password.
 --
@@ -125,7 +128,7 @@
     -- sheet is protected
   , _sprSort :: Bool
     -- ^ sorting should not be allowed when the sheet is protected
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 makeLenses ''SheetProtection
 
diff --git a/src/Codec/Xlsx/Types/RichText.hs b/src/Codec/Xlsx/Types/RichText.hs
--- a/src/Codec/Xlsx/Types/RichText.hs
+++ b/src/Codec/Xlsx/Types/RichText.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE OverloadedStrings  #-}
 {-# LANGUAGE RecordWildCards    #-}
 {-# LANGUAGE TemplateHaskell    #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.RichText (
     -- * Main types
     RichTextRun(..)
@@ -29,6 +30,8 @@
   , runPropertiesVertAlign
   ) where
 
+import GHC.Generics (Generic)
+
 import Control.Lens hiding (element)
 import Control.Monad
 import Data.Default
@@ -66,7 +69,7 @@
     -- Section 18.4.12, "t (Text)" (p. 1727)
   , _richTextRunText :: Text
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Run properties
 --
@@ -171,7 +174,7 @@
     -- Section 18.4.14, "vertAlign (Vertical Alignment)" (p. 1728)
   , _runPropertiesVertAlign :: Maybe FontVerticalAlignment
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Lenses
diff --git a/src/Codec/Xlsx/Types/SheetViews.hs b/src/Codec/Xlsx/Types/SheetViews.hs
--- a/src/Codec/Xlsx/Types/SheetViews.hs
+++ b/src/Codec/Xlsx/Types/SheetViews.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards   #-}
 {-# LANGUAGE TemplateHaskell   #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.SheetViews (
     -- * Structured type to construct 'SheetViews'
     SheetView(..)
@@ -46,6 +47,8 @@
   , paneYSplit
   ) where
 
+import GHC.Generics (Generic)
+
 import Control.Lens (makeLenses)
 import Data.Default
 import Data.Maybe (catMaybes, maybeToList, listToMaybe)
@@ -176,7 +179,7 @@
     -- Minimum of 0, maximum of 4 elements
   , _sheetViewSelection :: [Selection]
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Worksheet view selection.
 --
@@ -199,7 +202,7 @@
     -- | Range of the selection. Can be non-contiguous set of ranges.
   , _selectionSqref :: Maybe SqRef
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Worksheet view pane
 --
@@ -226,7 +229,7 @@
     -- the left pane.
   , _paneYSplit :: Maybe Double
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Enumerations
@@ -244,7 +247,7 @@
 
     -- | Page layout view
   | SheetViewTypePageLayout
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Pane type
 --
@@ -277,7 +280,7 @@
     -- dividing the pane into right and left regions. In that case, this value
     -- specifies the right pane.
   | PaneTypeTopRight
-  deriving (Eq, Show, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | State of the sheet's pane.
 --
@@ -295,7 +298,7 @@
     -- | Panes are split, but not frozen. In this state, the split bars are
     -- adjustable by the user.
   | PaneStateSplit
-  deriving (Eq, Show, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Lenses
diff --git a/src/Codec/Xlsx/Types/StyleSheet.hs b/src/Codec/Xlsx/Types/StyleSheet.hs
--- a/src/Codec/Xlsx/Types/StyleSheet.hs
+++ b/src/Codec/Xlsx/Types/StyleSheet.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards   #-}
 {-# LANGUAGE TemplateHaskell   #-}
+{-# LANGUAGE DeriveGeneric #-}
 -- | Support for writing (but not reading) style sheets
 module Codec.Xlsx.Types.StyleSheet (
     -- * The main two types
@@ -126,26 +127,25 @@
   , firstUserNumFmtId
   ) where
 
-import           Control.Lens                         hiding (element, elements,
-                                                       (.=))
-import           Data.Default
-import           Data.Map.Strict                      (Map)
-import qualified Data.Map.Strict                      as M
-import           Data.Maybe                           (catMaybes)
-import           Data.Monoid
-import           Data.Text                            (Text)
-import qualified Data.Text                            as T
-import           Text.XML
-import           Text.XML.Cursor
-
+import Control.Lens hiding (element, elements, (.=))
+import Data.Default
+import Data.Map.Strict (Map)
+import qualified Data.Map.Strict as M
+import Data.Maybe (catMaybes)
+import Data.Monoid
+import Data.Text (Text)
+import qualified Data.Text as T
+import GHC.Generics (Generic)
+import Text.XML
+import Text.XML.Cursor
 
 #if !MIN_VERSION_base(4,8,0)
-import           Control.Applicative
+import Control.Applicative
 #endif
 
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Types.Internal.NumFmtPair
-import           Codec.Xlsx.Writer.Internal
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Types.Internal.NumFmtPair
+import Codec.Xlsx.Writer.Internal
 
 {-------------------------------------------------------------------------------
   The main types
@@ -229,7 +229,7 @@
     -- This element contains custom number formats defined in this style sheet
     --
     -- Section 18.8.31, "numFmts (Number Formats)" (p. 1784)
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Ord, Show, Generic)
 
 -- | Cell formatting
 --
@@ -316,7 +316,7 @@
     -- not take effect unless the sheet has been protected.
   , _cellXfProtection        :: Maybe Protection
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Supporting record types
@@ -365,7 +365,7 @@
     -- within the cell.
   , _alignmentWrapText        :: Maybe Bool
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Expresses a single set of cell border formats (left, right, top, bottom,
 -- diagonal). Color is optional. When missing, 'automatic' is implied.
@@ -423,7 +423,7 @@
     -- | Vertical inner border
   , _borderVertical     :: Maybe BorderStyle
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Border style
 -- See @CT_BorderPr@ (p. 3934)
@@ -431,7 +431,7 @@
     _borderStyleColor :: Maybe Color
   , _borderStyleLine  :: Maybe LineStyle
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | One of the colors associated with the data bar or color scale.
 --
@@ -465,7 +465,7 @@
     -- 100% darken and 1.0 means 100% lighten. Also, 0.0 means no change.
   , _colorTint      :: Maybe Double
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | This element specifies fill formatting.
 --
@@ -477,7 +477,7 @@
 data Fill = Fill {
     _fillPattern :: Maybe FillPattern
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | This element is used to specify cell fill information for pattern and solid
 -- color cell fills. For solid cell fills (no pattern), fgColor is used. For
@@ -490,7 +490,7 @@
   , _fillPatternFgColor :: Maybe Color
   , _fillPatternType    :: Maybe PatternType
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | This element defines the properties for one of the fonts used in this
 -- workbook.
@@ -592,7 +592,7 @@
     -- is available) accordingly.
   , _fontVertAlign     :: Maybe FontVerticalAlignment
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | A single dxf record, expressing incremental formatting to be applied.
 --
@@ -605,7 +605,7 @@
     , _dxfBorder     :: Maybe Border
     , _dxfProtection :: Maybe Protection
     -- TODO: extList
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Ord, Show, Generic)
 
 type NumFmt = Text
 
@@ -616,7 +616,7 @@
 data NumberFormat
     = StdNumberFormat ImpliedNumberFormat
     | UserNumberFormat NumFmt
-    deriving (Eq, Ord, Show)
+    deriving (Eq, Ord, Show, Generic)
 
 -- | Basic number format with predefined number of decimals
 -- as format code of number format in xlsx should be less than 255 characters
@@ -665,7 +665,7 @@
   | NfExponent1Decimal                -- ^> 48 ##0.0E+0
   | NfTextPlaceHolder                 -- ^> 49 @
   | NfOtherImplied Int                -- ^ other (non local-neutral?) built-in format (id < 164)
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 stdNumberFormatId :: ImpliedNumberFormat -> Int
 stdNumberFormatId NfGeneral                         = 0 -- General
@@ -743,7 +743,7 @@
     _protectionHidden :: Maybe Bool
   , _protectionLocked :: Maybe Bool
   }
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Enumerations
@@ -761,7 +761,7 @@
   | CellHorizontalAlignmentJustify
   | CellHorizontalAlignmentLeft
   | CellHorizontalAlignmentRight
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Vertical alignment in cells
 --
@@ -772,7 +772,7 @@
   | CellVerticalAlignmentDistributed
   | CellVerticalAlignmentJustify
   | CellVerticalAlignmentTop
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Font family
 --
@@ -796,7 +796,7 @@
 
     -- | Novelty font
   | FontFamilyDecorative
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Font scheme
 --
@@ -810,7 +810,7 @@
 
     -- | This font is not a theme font.
   | FontSchemeNone
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Font underline property
 --
@@ -821,7 +821,7 @@
   | FontUnderlineSingleAccounting
   | FontUnderlineDoubleAccounting
   | FontUnderlineNone
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Vertical alignment
 --
@@ -830,7 +830,7 @@
     FontVerticalAlignmentBaseline
   | FontVerticalAlignmentSubscript
   | FontVerticalAlignmentSuperscript
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 data LineStyle =
     LineStyleDashDot
@@ -847,7 +847,7 @@
   | LineStyleSlantDashDot
   | LineStyleThick
   | LineStyleThin
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Indicates the style of fill pattern being used for a cell format.
 --
@@ -872,7 +872,7 @@
   | PatternTypeMediumGray
   | PatternTypeNone
   | PatternTypeSolid
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 -- | Reading order
 --
@@ -881,7 +881,7 @@
     ReadingOrderContextDependent
   | ReadingOrderLeftToRight
   | ReadingOrderRightToLeft
-  deriving (Show, Eq, Ord)
+  deriving (Eq, Ord, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Lenses
diff --git a/src/Codec/Xlsx/Types/Table.hs b/src/Codec/Xlsx/Types/Table.hs
--- a/src/Codec/Xlsx/Types/Table.hs
+++ b/src/Codec/Xlsx/Types/Table.hs
@@ -2,16 +2,18 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Table where
 
 import Control.Lens (makeLenses)
-import Data.Maybe (maybeToList)
+import Data.Maybe (catMaybes, maybeToList)
 import Data.Text (Text)
+import GHC.Generics (Generic)
 import Text.XML
 import Text.XML.Cursor
 
 #if !MIN_VERSION_base(4,8,0)
-import           Control.Applicative
+import Control.Applicative
 #endif
 
 import Codec.Xlsx.Parser.Internal
@@ -43,7 +45,7 @@
     -- it, and it shall be unique amongst all other displayNames and
     -- definedNames in the workbook. The character lengths and
     -- restrictions are the same as for definedNames .
-  , tblName :: Text
+  , tblName :: Maybe Text
     -- ^ A string representing the name of the table that is used to
     -- reference the table programmatically through the spreadsheet
     -- applications object model. This string shall be unique per table
@@ -59,7 +61,7 @@
     -- ^ columns of this table, specification requires any table to
     -- include at least 1 column
   , tblAutoFilter :: Maybe AutoFilter
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 -- | Single table column
 --
@@ -72,7 +74,7 @@
   -- column. This is what shall be displayed in the header row in the
   -- UI, and is referenced through functions. This name shall be
   -- unique per table.
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 makeLenses ''Table
 
@@ -83,7 +85,7 @@
 instance FromCursor Table where
   fromCursor c = do
     tblDisplayName <- fromAttribute "displayName" c
-    tblName <- fromAttribute "name" c
+    tblName <- maybeAttribute "name" c
     tblRef <- fromAttribute "ref" c
     tblAutoFilter <- maybeFromElement (n_ "autoFilter") c
     let tblColumns =
@@ -106,8 +108,10 @@
     attrs =
       [ "id" .= i
       , "displayName" .= tblDisplayName
-      , "name" .= tblName
       , "ref" .= tblRef
+      ] ++
+      catMaybes
+      [ "name" .=? tblName
       ]
     subElements =
       maybeToList (toElement "autoFilter" <$> tblAutoFilter) ++
diff --git a/src/Codec/Xlsx/Types/Variant.hs b/src/Codec/Xlsx/Types/Variant.hs
--- a/src/Codec/Xlsx/Types/Variant.hs
+++ b/src/Codec/Xlsx/Types/Variant.hs
@@ -1,16 +1,18 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Variant where
 
-import           Data.ByteString            (ByteString)
-import           Data.ByteString.Base64     as B64
-import           Data.Text                  (Text)
-import qualified Data.Text                  as T
-import qualified Data.Text.Encoding         as T
-import           Text.XML
-import           Text.XML.Cursor
+import Data.ByteString (ByteString)
+import Data.ByteString.Base64 as B64
+import Data.Text (Text)
+import qualified Data.Text as T
+import qualified Data.Text.Encoding as T
+import GHC.Generics (Generic)
+import Text.XML
+import Text.XML.Cursor
 
-import           Codec.Xlsx.Parser.Internal
-import           Codec.Xlsx.Writer.Internal
+import Codec.Xlsx.Parser.Internal
+import Codec.Xlsx.Writer.Internal
 
 data Variant
     = VtBlob ByteString
@@ -22,7 +24,7 @@
     -- vt_i4, vt_i8, vt_ui1, vt_ui2, vt_ui4, vt_ui8, vt_uint, vt_r4, vt_r8,
     -- vt_lpstr, vt_bstr, vt_date, vt_filetime, vt_cy, vt_error, vt_stream,
     -- vt_ostream, vt_storage, vt_ostorage, vt_vstream, vt_clsid
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic)
 
 {-------------------------------------------------------------------------------
   Parsing
diff --git a/src/Codec/Xlsx/Writer.hs b/src/Codec/Xlsx/Writer.hs
--- a/src/Codec/Xlsx/Writer.hs
+++ b/src/Codec/Xlsx/Writer.hs
@@ -2,53 +2,58 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TupleSections #-}
+{-# LANGUAGE DeriveGeneric #-}
 -- | This module provides a function for serializing structured `Xlsx` into lazy bytestring
 module Codec.Xlsx.Writer
-    ( fromXlsx
-    ) where
+  ( fromXlsx
+  ) where
 
-import qualified Codec.Archive.Zip                           as Zip
-import           Control.Arrow                               (second)
-import           Control.Lens                                hiding (transform, (.=))
-import           Control.Monad                               (forM)
-import qualified Data.ByteString.Lazy                        as L
-import           Data.ByteString.Lazy.Char8                  ()
-import           Data.List                                   (foldl', mapAccumL)
-import           Data.Map                                    (Map)
-import           Data.STRef
-import           Control.Monad.ST
-import qualified Data.Map                                    as M
-import           Data.Maybe
-import           Data.Monoid                                 ((<>))
-import           Data.Text                                   (Text)
-import Data.Tuple.Extra (fst3, snd3, thd3)
-import qualified Data.Text                                   as T
-import           Data.Time                                   (UTCTime)
-import           Data.Time.Clock.POSIX                       (POSIXTime, posixSecondsToUTCTime)
-import           Data.Time.Format                            (formatTime)
+import qualified Codec.Archive.Zip as Zip
+import Control.Arrow (second)
+import Control.Lens hiding (transform, (.=))
+import Control.Monad (forM)
+import Control.Monad.ST
+import qualified Data.ByteString.Lazy as L
+import Data.ByteString.Lazy.Char8 ()
+import Data.List (foldl', mapAccumL)
+import Data.Map (Map)
+import qualified Data.Map as M
+import Data.Maybe
+import Data.Maybe (maybeToList)
+import Data.Monoid ((<>))
+import Data.STRef
+import Data.Text (Text)
+import qualified Data.Text as T
+import Data.Time (UTCTime)
+import Data.Time.Clock.POSIX (POSIXTime, posixSecondsToUTCTime)
+import Data.Time.Format (formatTime)
 #if MIN_VERSION_time(1,5,0)
-import           Data.Time.Format                            (defaultTimeLocale)
+import Data.Time.Format (defaultTimeLocale)
 #else
-import           System.Locale                               (defaultTimeLocale)
+import System.Locale (defaultTimeLocale)
 #endif
-import           Safe
-import           Text.XML
+import Data.Tuple.Extra (fst3, snd3, thd3)
+import GHC.Generics (Generic)
+import Safe
+import Text.XML
 
 #if !MIN_VERSION_base(4,8,0)
-import           Control.Applicative
+import Control.Applicative
 #endif
 
-import           Codec.Xlsx.Types
-import           Codec.Xlsx.Types.Internal
-import           Codec.Xlsx.Types.Internal.CfPair
-import qualified Codec.Xlsx.Types.Internal.CommentTable      as CommentTable
-import           Codec.Xlsx.Types.Internal.CustomProperties
-import           Codec.Xlsx.Types.Internal.DvPair
-import           Codec.Xlsx.Types.Internal.Relationships     as Relationships hiding (lookup)
-import           Codec.Xlsx.Types.Internal.SharedStringTable
-import           Codec.Xlsx.Types.PivotTable.Internal
-import           Codec.Xlsx.Writer.Internal
-import           Codec.Xlsx.Writer.Internal.PivotTable
+import Codec.Xlsx.Types
+import Codec.Xlsx.Types.Internal
+import Codec.Xlsx.Types.Internal.CfPair
+import qualified Codec.Xlsx.Types.Internal.CommentTable
+       as CommentTable
+import Codec.Xlsx.Types.Internal.CustomProperties
+import Codec.Xlsx.Types.Internal.DvPair
+import Codec.Xlsx.Types.Internal.Relationships as Relationships
+       hiding (lookup)
+import Codec.Xlsx.Types.Internal.SharedStringTable
+import Codec.Xlsx.Types.PivotTable.Internal
+import Codec.Xlsx.Writer.Internal
+import Codec.Xlsx.Writer.Internal.PivotTable
 
 -- | Writes `Xlsx' to raw data (lazy bytestring)
 fromXlsx :: POSIXTime -> Xlsx -> L.ByteString
@@ -164,16 +169,23 @@
 sheetDataXml rows rh = map rowEl rows
   where
     rowEl (r, cells) = elementList "row"
-                       (ht ++ s ++ [("r", txti r) ,("hidden", "false"), ("outlineLevel", "0"),
-                                    ("collapsed", "false"), ("customFormat", "true"),
-                                    ("customHeight", txtb hasHeight)])
+                         (ht ++ s ++
+                         [("r", txti r), ("hidden", txtb hidden), ("outlineLevel", "0"),
+                          ("collapsed", "false"), ("customFormat", "true"),
+                          ("customHeight", txtb hasHeight)])
                        $ map (cellEl r) cells
       where
-        (ht, hasHeight, s) = case M.lookup r rh of
-          Just (RowProps (Just h) (Just st)) -> ([("ht", txtd h)], True,[("s", txti st)])
-          Just (RowProps Nothing  (Just st)) -> ([], True, [("s", txti st)])
-          Just (RowProps (Just h) Nothing ) -> ([("ht", txtd h)], True,[])
-          _ -> ([], False,[])
+        mProps    = M.lookup r rh
+        hasHeight = case rowHeight =<< mProps of
+                      Just CustomHeight{} -> True
+                      _                   -> False
+        ht        = do Just height <- [rowHeight =<< mProps]
+                       let h = case height of CustomHeight    x -> x
+                                              AutomaticHeight x -> x
+                       return ("ht", txtd h)
+        s         = do Just st <- [rowStyle =<< mProps]
+                       return ("s", txti st)
+        hidden    = fromMaybe False $ rowHidden <$> mProps
     cellEl r (icol, cell) =
       elementList "c" (cellAttrs (singleCellRef (r, icol)) cell)
               (catMaybes [ elementContent "v" . value <$> xlsxCellValue cell
@@ -404,13 +416,13 @@
 data XlsxCellData = XlsxSS Int
                   | XlsxDouble Double
                   | XlsxBool Bool
-                    deriving (Show, Eq)
+                    deriving (Eq, Show, Generic)
 data XlsxCell = XlsxCell
     { xlsxCellStyle   :: Maybe Int
     , xlsxCellValue   :: Maybe XlsxCellData
     , xlsxComment     :: Maybe Comment
     , xlsxCellFormula :: Maybe CellFormula
-    } deriving (Show, Eq)
+    } deriving (Eq, Show, Generic)
 
 xlsxCellType :: XlsxCell -> Text
 xlsxCellType XlsxCell{xlsxCellValue=Just(XlsxSS _)} = "s"
diff --git a/src/Codec/Xlsx/Writer/Internal.hs b/src/Codec/Xlsx/Writer/Internal.hs
--- a/src/Codec/Xlsx/Writer/Internal.hs
+++ b/src/Codec/Xlsx/Writer/Internal.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE OverloadedStrings   #-}
 {-# LANGUAGE RecordWildCards     #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Writer.Internal (
     -- * Rendering documents
     ToDocument(..)
@@ -37,16 +38,16 @@
   , justFalse
   ) where
 
-import           Data.Text                        (Text)
-import qualified Data.Text                        as T
-import           Data.Text.Lazy                   (toStrict)
-import           Data.Text.Lazy.Builder           (toLazyText)
-import           Data.Text.Lazy.Builder.Int
-import           Data.Text.Lazy.Builder.RealFloat
+import Data.Text (Text)
+import qualified Data.Text as T
+import Data.Text.Lazy (toStrict)
+import Data.Text.Lazy.Builder (toLazyText)
+import Data.Text.Lazy.Builder.Int
+import Data.Text.Lazy.Builder.RealFloat
 
-import qualified Data.Map                         as Map
-import           Data.String                      (fromString)
-import           Text.XML
+import qualified Data.Map as Map
+import Data.String (fromString)
+import Text.XML
 
 {-------------------------------------------------------------------------------
   Rendering documents
diff --git a/src/Codec/Xlsx/Writer/Internal/PivotTable.hs b/src/Codec/Xlsx/Writer/Internal/PivotTable.hs
--- a/src/Codec/Xlsx/Writer/Internal/PivotTable.hs
+++ b/src/Codec/Xlsx/Writer/Internal/PivotTable.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Writer.Internal.PivotTable
   ( PivotTableFiles(..)
   , renderPivotTableFiles
@@ -10,11 +11,12 @@
 import qualified Data.Map as M
 import Data.Maybe (catMaybes, fromMaybe, mapMaybe)
 import Data.Text (Text)
+import GHC.Generics (Generic)
 import Safe (fromJustNote)
 import Text.XML
 
-import Codec.Xlsx.Types.Common
 import Codec.Xlsx.Types.Cell
+import Codec.Xlsx.Types.Common
 import Codec.Xlsx.Types.PivotTable
 import Codec.Xlsx.Types.PivotTable.Internal
 import Codec.Xlsx.Writer.Internal
@@ -22,13 +24,13 @@
 data PivotTableFiles = PivotTableFiles
   { pvtfTable :: ByteString
   , pvtfCacheDefinition :: ByteString
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 data CacheDefinition = CacheDefinition
   { cdSourceRef :: CellRef
   , cdSourceSheet :: Text
   , cdFields :: [CacheField]
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 renderPivotTableFiles :: CellMap -> Int -> PivotTable -> PivotTableFiles
 renderPivotTableFiles cm cacheId t = PivotTableFiles {..}
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -85,7 +85,7 @@
                            (CustomFilter FltrLessThan "42"))]
     tables =
       [ Table
-        { tblName = "Table1"
+        { tblName = Just "Table1"
         , tblDisplayName = "Table1"
         , tblRef = CellRef "A3"
         , tblColumns = [TableColumn "another text"]
@@ -100,7 +100,10 @@
     sheet2 = def & wsCells .~ testCellMap2
     pvSheet = sheetWithPvCells & wsPivotTables .~ [testPivotTable]
     sheetWithPvCells = def & wsCells .~ testPivotSrcCells
-    rowProps = M.fromList [(1, RowProps (Just 50) (Just 3))]
+    rowProps = M.fromList [(1, RowProps { rowHeight       = Just (CustomHeight 50)
+                                        , rowStyle        = Just 3
+                                        , rowHidden       = False
+                                        })]
     cols = [ColumnsProperties 1 10 (Just 15) (Just 1) False False False]
     drawing = Just $ testDrawing { _xdrAnchors = map resolve $ _xdrAnchors testDrawing }
     resolve :: Anchor RefId RefId -> Anchor FileInfo ChartSpace
diff --git a/xlsx.cabal b/xlsx.cabal
--- a/xlsx.cabal
+++ b/xlsx.cabal
@@ -1,6 +1,6 @@
 Name:                xlsx
 
-Version:             0.5.0
+Version:             0.6.0
 
 Synopsis:            Simple and incomplete Excel file parser/writer
 Description:
