/*******************************************************************************
* You may amend and distribute as you like, but don't remove this header!
*
* EPPlus provides server-side generation of Excel 2007/2010 spreadsheets.
* See http://www.codeplex.com/EPPlus for details.
*
* Copyright (C) 2011 Jan Källman
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
* If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
*
* All code and executables are provided "as is" with no warranty either express or implied.
* The author accepts no liability for any damage or loss of business that this product may cause.
*
* Code change notes:
*
* Author Change Date
* ******************************************************************************
* Jan Källman Added 21-MAR-2011
* Jan Källman License changed GPL-->LGPL 2011-12-16
*******************************************************************************/
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Xml;
using OfficeOpenXml.Style.XmlAccess;
namespace OfficeOpenXml.Table.PivotTable
{
///
/// A pivo table data field
///
public class ExcelPivotTableDataField : XmlHelper
{
internal ExcelPivotTableDataField(XmlNamespaceManager ns, XmlNode topNode,ExcelPivotTableField field) :
base(ns, topNode)
{
if (topNode.Attributes.Count == 0)
{
Index = field.Index;
BaseField = 0;
BaseItem = 0;
}
Field = field;
}
///
/// The field
///
public ExcelPivotTableField Field
{
get;
private set;
}
///
/// The index of the datafield
///
public int Index
{
get
{
return GetXmlNodeInt("@fld");
}
internal set
{
SetXmlNodeString("@fld",value.ToString());
}
}
///
/// The name of the datafield
///
public string Name
{
get
{
return GetXmlNodeString("@name");
}
set
{
if (Field._table.DataFields.ExistsDfName(value, this))
{
throw (new InvalidOperationException("Duplicate datafield name"));
}
SetXmlNodeString("@name", value);
}
}
///
/// Field index. Reference to the field collection
///
public int BaseField
{
get
{
return GetXmlNodeInt("@baseField");
}
set
{
SetXmlNodeString("@baseField", value.ToString());
}
}
///
/// Specifies the index to the base item when the ShowDataAs calculation is in use
///
public int BaseItem
{
get
{
return GetXmlNodeInt("@baseItem");
}
set
{
SetXmlNodeString("@baseItem", value.ToString());
}
}
///
/// Number format id.
///
internal int NumFmtId
{
get
{
return GetXmlNodeInt("@numFmtId");
}
set
{
SetXmlNodeString("@numFmtId", value.ToString());
}
}
///
/// Number format for the data column
///
public string Format
{
get
{
foreach (var nf in Field._table.WorkSheet.Workbook.Styles.NumberFormats)
{
if (nf.NumFmtId == NumFmtId)
{
return nf.Format;
}
}
return Field._table.WorkSheet.Workbook.Styles.NumberFormats[0].Format;
}
set
{
var styles = Field._table.WorkSheet.Workbook.Styles;
ExcelNumberFormatXml nf = null;
if (!styles.NumberFormats.FindByID(value, ref nf))
{
nf = new ExcelNumberFormatXml(NameSpaceManager) { Format = value, NumFmtId = styles.NumberFormats.NextId++ };
styles.NumberFormats.Add(value, nf);
}
NumFmtId = nf.NumFmtId;
}
}
///
/// Type of aggregate function
///
public DataFieldFunctions Function
{
get
{
string s=GetXmlNodeString("@subtotal");
if(s=="")
{
return DataFieldFunctions.None;
}
else
{
return (DataFieldFunctions)Enum.Parse(typeof(DataFieldFunctions), s, true);
}
}
set
{
string v;
switch(value)
{
case DataFieldFunctions.None:
DeleteNode("@subtotal");
return;
case DataFieldFunctions.CountNums:
v="CountNums";
break;
case DataFieldFunctions.StdDev:
v="stdDev";
break;
case DataFieldFunctions.StdDevP:
v="stdDevP";
break;
default:
v=value.ToString().ToLower(CultureInfo.InvariantCulture);
break;
}
SetXmlNodeString("@subtotal", v);
}
}
/////Since we have no items, Excel will crash when we use showDataAs options that require baseItem's
//public eShowDataAs ShowDataAs
//{
// get
// {
// string s = GetXmlNodeString("@showDataAs");
// if (s == "")
// {
// return eShowDataAs.Normal;
// }
// else
// {
// return (eShowDataAs)Enum.Parse(typeof(eShowDataAs), s, true);
// }
// }
// set
// {
// string v = value.ToString();
// v = v.Substring(0, 1).ToLower() + v.Substring(1);
// SetXmlNodeString("@showDataAs", v);
// }
//}
}
}