/*******************************************************************************
* 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 30-AUG-2010
* 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;
namespace OfficeOpenXml.Table
{
///
/// Build-in table row functions
///
public enum RowFunctions
{
Average,
Count,
CountNums,
Custom,
Max,
Min,
None,
StdDev,
Sum,
Var
}
///
/// A table column
///
public class ExcelTableColumn : XmlHelper
{
internal ExcelTable _tbl;
internal ExcelTableColumn(XmlNamespaceManager ns, XmlNode topNode, ExcelTable tbl, int pos) :
base(ns, topNode)
{
_tbl = tbl;
Position = pos;
}
///
/// The column id
///
public int Id
{
get
{
return GetXmlNodeInt("@id");
}
set
{
SetXmlNodeString("@id", value.ToString());
}
}
///
/// The position of the column
///
public int Position
{
get;
private set;
}
///
/// The name of the column
///
public string Name
{
get
{
var n=GetXmlNodeString("@name");
if (string.IsNullOrEmpty(n))
{
if (_tbl.ShowHeader)
{
n = _tbl.WorkSheet.GetValue(_tbl.Address._fromRow, _tbl.Address._fromCol + this.Position);
}
else
{
n = "Column" + (this.Position+1).ToString();
}
}
return n;
}
set
{
SetXmlNodeString("@name", value);
_tbl.WorkSheet.SetTableTotalFunction(_tbl, this);
}
}
///
/// A string text in the total row
///
public string TotalsRowLabel
{
get
{
return GetXmlNodeString("@totalsRowLabel");
}
set
{
SetXmlNodeString("@totalsRowLabel", value);
}
}
///
/// Build-in total row functions.
/// To set a custom Total row formula use the TotalsRowFormula property
///
///
public RowFunctions TotalsRowFunction
{
get
{
if (GetXmlNodeString("@totalsRowFunction") == "")
{
return RowFunctions.None;
}
else
{
return (RowFunctions)Enum.Parse(typeof(RowFunctions), GetXmlNodeString("@totalsRowFunction"), true);
}
}
set
{
if (value == RowFunctions.Custom)
{
throw(new Exception("Use the TotalsRowFormula-property to set a custom table formula"));
}
string s = value.ToString();
s = s.Substring(0, 1).ToLower(CultureInfo.InvariantCulture) + s.Substring(1, s.Length - 1);
SetXmlNodeString("@totalsRowFunction", s);
_tbl.WorkSheet.SetTableTotalFunction(_tbl, this);
}
}
const string TOTALSROWFORMULA_PATH = "d:totalsRowFormula";
///
/// Sets a custom Totals row Formula.
/// Be carefull with this property since it is not validated.
///
/// tbl.Columns[9].TotalsRowFormula = string.Format("SUM([{0}])",tbl.Columns[9].Name);
///
///
public string TotalsRowFormula
{
get
{
return GetXmlNodeString(TOTALSROWFORMULA_PATH);
}
set
{
if (value.StartsWith("=")) value = value.Substring(1, value.Length - 1);
SetXmlNodeString("@totalsRowFunction", "custom");
SetXmlNodeString(TOTALSROWFORMULA_PATH, value);
_tbl.WorkSheet.SetTableTotalFunction(_tbl, this);
}
}
const string DATACELLSTYLE_PATH = "@dataCellStyle";
///
/// The named style for datacells in the column
///
public string DataCellStyleName
{
get
{
return GetXmlNodeString(DATACELLSTYLE_PATH);
}
set
{
if(_tbl.WorkSheet.Workbook.Styles.NamedStyles.FindIndexByID(value)<0)
{
throw(new Exception(string.Format("Named style {0} does not exist.",value)));
}
SetXmlNodeString(TopNode, DATACELLSTYLE_PATH, value,true);
int fromRow=_tbl.Address._fromRow + (_tbl.ShowHeader?1:0),
toRow=_tbl.Address._toRow - (_tbl.ShowTotal?1:0),
col=_tbl.Address._fromCol+Position;
if (fromRow < toRow)
{
_tbl.WorkSheet.Cells[fromRow, col, toRow, col].StyleName = value;
}
}
}
const string CALCULATEDCOLUMNFORMULA_PATH = "d:calculatedColumnFormula";
///
/// Sets a calculated column Formula.
/// Be carefull with this property since it is not validated.
///
/// tbl.Columns[9].CalculatedColumnFormula = string.Format("SUM(MyDataTable[[#This Row],[{0}]])",tbl.Columns[9].Name);
///
///
public string CalculatedColumnFormula
{
get
{
return GetXmlNodeString(CALCULATEDCOLUMNFORMULA_PATH);
}
set
{
if (value.StartsWith("=")) value = value.Substring(1, value.Length - 1);
SetXmlNodeString(CALCULATEDCOLUMNFORMULA_PATH, value);
}
}
}
}