xlsx-1.2.0: src/Codec/Xlsx/Types/PivotTable.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE DeriveGeneric #-}
module Codec.Xlsx.Types.PivotTable
( PivotTable(..)
, PivotFieldName(..)
, PivotFieldInfo(..)
, FieldSortType(..)
, PositionedField(..)
, DataField(..)
, ConsolidateFunction(..)
) where
import Control.Arrow (first)
import Control.DeepSeq (NFData)
import Data.Text (Text)
import GHC.Generics (Generic)
import Codec.Xlsx.Types.Common
import Codec.Xlsx.Parser.Internal
import Codec.Xlsx.Writer.Internal
data PivotTable = PivotTable
{ _pvtName :: Text
, _pvtDataCaption :: Text
, _pvtRowFields :: [PositionedField]
, _pvtColumnFields :: [PositionedField]
, _pvtDataFields :: [DataField]
, _pvtFields :: [PivotFieldInfo]
, _pvtRowGrandTotals :: Bool
, _pvtColumnGrandTotals :: Bool
, _pvtOutline :: Bool
, _pvtOutlineData :: Bool
, _pvtLocation :: CellRef
, _pvtSrcSheet :: Text
, _pvtSrcRef :: Range
} deriving (Eq, Show, Generic)
instance NFData PivotTable
data PivotFieldInfo = PivotFieldInfo
{ _pfiName :: Maybe PivotFieldName
, _pfiOutline :: Bool
, _pfiSortType :: FieldSortType
, _pfiHiddenItems :: [CellValue]
} deriving (Eq, Show, Generic)
instance NFData PivotFieldInfo
-- | Sort orders that can be applied to fields in a PivotTable
--
-- See 18.18.28 "ST_FieldSortType (Field Sort Type)" (p. 2454)
data FieldSortType
= FieldSortAscending
| FieldSortDescending
| FieldSortManual
deriving (Eq, Ord, Show, Generic)
instance NFData FieldSortType
newtype PivotFieldName =
PivotFieldName Text
deriving (Eq, Ord, Show, Generic)
instance NFData PivotFieldName
data PositionedField
= DataPosition
| FieldPosition PivotFieldName
deriving (Eq, Ord, Show, Generic)
instance NFData PositionedField
data DataField = DataField
{ _dfField :: PivotFieldName
, _dfName :: Text
, _dfFunction :: ConsolidateFunction
} deriving (Eq, Show, Generic)
instance NFData DataField
-- | Data consolidation functions specified by the user and used to
-- consolidate ranges of data
--
-- See 18.18.17 "ST_DataConsolidateFunction (Data Consolidation
-- Functions)" (p. 2447)
data ConsolidateFunction
= ConsolidateAverage
-- ^ The average of the values.
| ConsolidateCount
-- ^ The number of data values. The Count consolidation function
-- works the same as the COUNTA worksheet function.
| ConsolidateCountNums
-- ^ The number of data values that are numbers. The Count Nums
-- consolidation function works the same as the COUNT worksheet
-- function.
| ConsolidateMaximum
-- ^ The largest value.
| ConsolidateMinimum
-- ^ The smallest value.
| ConsolidateProduct
-- ^ The product of the values.
| ConsolidateStdDev
-- ^ An estimate of the standard deviation of a population, where
-- the sample is a subset of the entire population.
| ConsolidateStdDevP
-- ^ The standard deviation of a population, where the population
-- is all of the data to be summarized.
| ConsolidateSum
-- ^ The sum of the values.
| ConsolidateVariance
-- ^ An estimate of the variance of a population, where the sample
-- is a subset of the entire population.
| ConsolidateVarP
-- ^ The variance of a population, where the population is all of
-- the data to be summarized.
deriving (Eq, Show, Generic)
instance NFData ConsolidateFunction
{-------------------------------------------------------------------------------
Rendering
-------------------------------------------------------------------------------}
instance ToAttrVal ConsolidateFunction where
toAttrVal ConsolidateAverage = "average"
toAttrVal ConsolidateCount = "count"
toAttrVal ConsolidateCountNums = "countNums"
toAttrVal ConsolidateMaximum = "max"
toAttrVal ConsolidateMinimum = "min"
toAttrVal ConsolidateProduct = "product"
toAttrVal ConsolidateStdDev = "stdDev"
toAttrVal ConsolidateStdDevP = "stdDevp"
toAttrVal ConsolidateSum = "sum"
toAttrVal ConsolidateVariance = "var"
toAttrVal ConsolidateVarP = "varp"
instance ToAttrVal PivotFieldName where
toAttrVal (PivotFieldName n) = toAttrVal n
instance ToAttrVal FieldSortType where
toAttrVal FieldSortManual = "manual"
toAttrVal FieldSortAscending = "ascending"
toAttrVal FieldSortDescending = "descending"
{-------------------------------------------------------------------------------
Parsing
-------------------------------------------------------------------------------}
instance FromAttrVal ConsolidateFunction where
fromAttrVal "average" = readSuccess ConsolidateAverage
fromAttrVal "count" = readSuccess ConsolidateCount
fromAttrVal "countNums" = readSuccess ConsolidateCountNums
fromAttrVal "max" = readSuccess ConsolidateMaximum
fromAttrVal "min" = readSuccess ConsolidateMinimum
fromAttrVal "product" = readSuccess ConsolidateProduct
fromAttrVal "stdDev" = readSuccess ConsolidateStdDev
fromAttrVal "stdDevp" = readSuccess ConsolidateStdDevP
fromAttrVal "sum" = readSuccess ConsolidateSum
fromAttrVal "var" = readSuccess ConsolidateVariance
fromAttrVal "varp" = readSuccess ConsolidateVarP
fromAttrVal t = invalidText "ConsolidateFunction" t
instance FromAttrVal PivotFieldName where
fromAttrVal = fmap (first PivotFieldName) . fromAttrVal
instance FromAttrVal FieldSortType where
fromAttrVal "manual" = readSuccess FieldSortManual
fromAttrVal "ascending" = readSuccess FieldSortAscending
fromAttrVal "descending" = readSuccess FieldSortDescending
fromAttrVal t = invalidText "FieldSortType" t