| /******************************************************************************* |
| * 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 |
| } |