blob: ce72dd8df3783d1a51665513b9f0771236cb3cae [file] [log] [blame]
/*******************************************************************************
* 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 Initial Release 2009-10-01
* Jan Källman Total rewrite 2010-03-01
* Jan Källman License changed GPL-->LGPL 2011-12-27
* *******************************************************************************/
using System.Xml;
namespace OfficeOpenXml
{
#region class ExcelHeaderFooterText
/// <summary>
/// Print header and footer
/// </summary>
public class ExcelHeaderFooterText
{
ExcelWorksheet _ws;
string _hf;
internal ExcelHeaderFooterText(XmlNode TextNode, ExcelWorksheet ws, string hf)
{
_ws = ws;
_hf = hf;
if (TextNode == null || string.IsNullOrEmpty(TextNode.InnerText)) return;
string text = TextNode.InnerText;
string code = text.Substring(0, 2);
int startPos=2;
for (int pos=startPos;pos<text.Length-2;pos++)
{
string newCode = text.Substring(pos, 2);
if (newCode == "&C" || newCode == "&R")
{
SetText(code, text.Substring(startPos, pos-startPos));
startPos = pos+2;
pos = startPos;
code = newCode;
}
}
SetText(code, text.Substring(startPos, text.Length - startPos));
}
private void SetText(string code, string text)
{
switch (code)
{
case "&L":
LeftAlignedText=text;
break;
case "&C":
CenteredText=text;
break;
default:
RightAlignedText=text;
break;
}
}
/// <summary>
/// Get/set the text to appear on the left hand side of the header (or footer) on the worksheet.
/// </summary>
public string LeftAlignedText = null;
/// <summary>
/// Get/set the text to appear in the center of the header (or footer) on the worksheet.
/// </summary>
public string CenteredText = null;
/// <summary>
/// Get/set the text to appear on the right hand side of the header (or footer) on the worksheet.
/// </summary>
public string RightAlignedText = null;
}
#endregion
#region ExcelHeaderFooter
/// <summary>
/// Represents the Header and Footer on an Excel Worksheet
/// </summary>
public sealed class ExcelHeaderFooter : XmlHelper
{
#region Static Properties
/// <summary>
/// The code for "current page #"
/// </summary>
public const string PageNumber = @"&P";
/// <summary>
/// The code for "total pages"
/// </summary>
public const string NumberOfPages = @"&N";
/// <summary>
/// The code for "text font color"
/// RGB Color is specified as RRGGBB
/// Theme Color is specified as TTSNN where TT is the theme color Id, S is either "+" or "-" of the tint/shade value, NN is the tint/shade value.
/// </summary>
public const string FontColor = @"&K";
/// <summary>
/// The code for "sheet tab name"
/// </summary>
public const string SheetName = @"&A";
/// <summary>
/// The code for "this workbook's file path"
/// </summary>
public const string FilePath = @"&Z";
/// <summary>
/// The code for "this workbook's file name"
/// </summary>
public const string FileName = @"&F";
/// <summary>
/// The code for "date"
/// </summary>
public const string CurrentDate = @"&D";
/// <summary>
/// The code for "time"
/// </summary>
public const string CurrentTime = @"&T";
/// <summary>
/// The code for "picture as background"
/// </summary>
public const string Image = @"&G";
/// <summary>
/// The code for "outline style"
/// </summary>
public const string OutlineStyle = @"&O";
/// <summary>
/// The code for "shadow style"
/// </summary>
public const string ShadowStyle = @"&H";
#endregion
#region ExcelHeaderFooter Private Properties
internal ExcelHeaderFooterText _oddHeader;
internal ExcelHeaderFooterText _oddFooter;
internal ExcelHeaderFooterText _evenHeader;
internal ExcelHeaderFooterText _evenFooter;
internal ExcelHeaderFooterText _firstHeader;
internal ExcelHeaderFooterText _firstFooter;
private ExcelWorksheet _ws;
#endregion
#region ExcelHeaderFooter Constructor
/// <summary>
/// ExcelHeaderFooter Constructor
/// </summary>
/// <param name="nameSpaceManager"></param>
/// <param name="topNode"></param>
/// <param name="ws">The worksheet</param>
internal ExcelHeaderFooter(XmlNamespaceManager nameSpaceManager, XmlNode topNode, ExcelWorksheet ws) :
base(nameSpaceManager, topNode)
{
_ws = ws;
SchemaNodeOrder = new string[] { "headerFooter", "oddHeader", "oddFooter", "evenHeader", "evenFooter", "firstHeader", "firstFooter" };
}
#endregion
#region alignWithMargins
const string alignWithMarginsPath="@alignWithMargins";
/// <summary>
/// Gets/sets the alignWithMargins attribute
/// </summary>
public bool AlignWithMargins
{
get
{
return GetXmlNodeBool(alignWithMarginsPath);
}
set
{
SetXmlNodeString(alignWithMarginsPath, value ? "1" : "0");
}
}
#endregion
#region differentOddEven
const string differentOddEvenPath = "@differentOddEven";
/// <summary>
/// Gets/sets the flag that tells Excel to display different headers and footers on odd and even pages.
/// </summary>
public bool differentOddEven
{
get
{
return GetXmlNodeBool(differentOddEvenPath);
}
set
{
SetXmlNodeString(differentOddEvenPath, value ? "1" : "0");
}
}
#endregion
#region differentFirst
const string differentFirstPath = "@differentFirst";
/// <summary>
/// Gets/sets the flag that tells Excel to display different headers and footers on the first page of the worksheet.
/// </summary>
public bool differentFirst
{
get
{
return GetXmlNodeBool(differentFirstPath);
}
set
{
SetXmlNodeString(differentFirstPath, value ? "1" : "0");
}
}
#endregion
#region ExcelHeaderFooter Public Properties
/// <summary>
/// Provides access to the header on odd numbered pages of the document.
/// If you want the same header on both odd and even pages, then only set values in this ExcelHeaderFooterText class.
/// </summary>
public ExcelHeaderFooterText OddHeader
{
get
{
if (_oddHeader == null)
{
_oddHeader = new ExcelHeaderFooterText(TopNode.SelectSingleNode("d:oddHeader", NameSpaceManager), _ws, "H");
}
return _oddHeader; }
}
/// <summary>
/// Provides access to the footer on odd numbered pages of the document.
/// If you want the same footer on both odd and even pages, then only set values in this ExcelHeaderFooterText class.
/// </summary>
public ExcelHeaderFooterText OddFooter
{
get
{
if (_oddFooter == null)
{
_oddFooter = new ExcelHeaderFooterText(TopNode.SelectSingleNode("d:oddFooter", NameSpaceManager), _ws, "F"); ;
}
return _oddFooter;
}
}
// evenHeader and evenFooter set differentOddEven = true
/// <summary>
/// Provides access to the header on even numbered pages of the document.
/// </summary>
public ExcelHeaderFooterText EvenHeader
{
get
{
if (_evenHeader == null)
{
_evenHeader = new ExcelHeaderFooterText(TopNode.SelectSingleNode("d:evenHeader", NameSpaceManager), _ws, "HEVEN");
differentOddEven = true;
}
return _evenHeader;
}
}
/// <summary>
/// Provides access to the footer on even numbered pages of the document.
/// </summary>
public ExcelHeaderFooterText EvenFooter
{
get
{
if (_evenFooter == null)
{
_evenFooter = new ExcelHeaderFooterText(TopNode.SelectSingleNode("d:evenFooter", NameSpaceManager), _ws, "FEVEN");
differentOddEven = true;
}
return _evenFooter ;
}
}
/// <summary>
/// Provides access to the header on the first page of the document.
/// </summary>
public ExcelHeaderFooterText FirstHeader
{
get
{
if (_firstHeader == null)
{
_firstHeader = new ExcelHeaderFooterText(TopNode.SelectSingleNode("d:firstHeader", NameSpaceManager), _ws, "HFIRST");
differentFirst = true;
}
return _firstHeader;
}
}
/// <summary>
/// Provides access to the footer on the first page of the document.
/// </summary>
public ExcelHeaderFooterText FirstFooter
{
get
{
if (_firstFooter == null)
{
_firstFooter = new ExcelHeaderFooterText(TopNode.SelectSingleNode("d:firstFooter", NameSpaceManager), _ws, "FFIRST");
differentFirst = true;
}
return _firstFooter;
}
}
#endregion
#region Save // ExcelHeaderFooter
/// <summary>
/// Saves the header and footer information to the worksheet XML
/// </summary>
internal void Save()
{
if (_oddHeader != null)
{
SetXmlNodeString("d:oddHeader", GetText(OddHeader));
}
if (_oddFooter != null)
{
SetXmlNodeString("d:oddFooter", GetText(OddFooter));
}
// only set evenHeader and evenFooter
if (differentOddEven)
{
if (_evenHeader != null)
{
SetXmlNodeString("d:evenHeader", GetText(EvenHeader));
}
if (_evenFooter != null)
{
SetXmlNodeString("d:evenFooter", GetText(EvenFooter));
}
}
// only set firstHeader and firstFooter
if (differentFirst)
{
if (_firstHeader != null)
{
SetXmlNodeString("d:firstHeader", GetText(FirstHeader));
}
if (_firstFooter != null)
{
SetXmlNodeString("d:firstFooter", GetText(FirstFooter));
}
}
}
private string GetText(ExcelHeaderFooterText headerFooter)
{
string ret = "";
if (headerFooter.LeftAlignedText != null)
ret += "&L" + headerFooter.LeftAlignedText;
if (headerFooter.CenteredText != null)
ret += "&C" + headerFooter.CenteredText;
if (headerFooter.RightAlignedText != null)
ret += "&R" + headerFooter.RightAlignedText;
return ret;
}
#endregion
}
#endregion
}