|  | /******************************************************************************* | 
|  | * 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		                License changed GPL-->LGPL 2011-12-27 | 
|  | *******************************************************************************/ | 
|  | using System; | 
|  | using System.Collections.Generic; | 
|  | using System.Text; | 
|  | using System.Xml; | 
|  | using System.Globalization; | 
|  |  | 
|  | namespace OfficeOpenXml | 
|  | { | 
|  | #region "Enums" | 
|  | /// <summary> | 
|  | /// Printer orientation | 
|  | /// </summary> | 
|  | public enum eOrientation | 
|  | { | 
|  | /// <summary> | 
|  | /// Portrait orientation | 
|  | /// </summary> | 
|  | Portrait, | 
|  | /// <summary> | 
|  | /// Landscape orientation | 
|  | /// </summary> | 
|  | Landscape | 
|  | } | 
|  | /// <summary> | 
|  | /// Papersize | 
|  | /// </summary> | 
|  | public enum ePaperSize | 
|  | { | 
|  | /// <summary> | 
|  | /// Letter paper (8.5 in. by 11 in.) | 
|  | /// </summary> | 
|  | Letter= 1, | 
|  | /// <summary> | 
|  | /// Letter small paper (8.5 in. by 11 in.) | 
|  | /// </summary> | 
|  | LetterSmall=2, | 
|  | /// <summary> | 
|  | /// // Tabloid paper (11 in. by 17 in.) | 
|  | /// </summary> | 
|  | Tabloid=3, | 
|  | /// <summary> | 
|  | /// Ledger paper (17 in. by 11 in.) | 
|  | /// </summary> | 
|  | Ledger=4, | 
|  | /// <summary> | 
|  | /// Legal paper (8.5 in. by 14 in.) | 
|  | /// </summary> | 
|  | Legal=5, | 
|  | /// <summary> | 
|  | /// Statement paper (5.5 in. by 8.5 in.) | 
|  | /// </summary> | 
|  | Statement=6, | 
|  | /// <summary> | 
|  | /// Executive paper (7.25 in. by 10.5 in.) | 
|  | /// </summary> | 
|  | Executive=7, | 
|  | /// <summary> | 
|  | /// A3 paper (297 mm by 420 mm) | 
|  | /// </summary> | 
|  | A3=8, | 
|  | /// <summary> | 
|  | /// A4 paper (210 mm by 297 mm) | 
|  | /// </summary> | 
|  | A4=9, | 
|  | /// <summary> | 
|  | /// A4 small paper (210 mm by 297 mm) | 
|  | /// </summary> | 
|  | A4Small=10, | 
|  | /// <summary> | 
|  | /// A5 paper (148 mm by 210 mm) | 
|  | /// </summary> | 
|  | A5=11, | 
|  | /// <summary> | 
|  | /// B4 paper (250 mm by 353 mm) | 
|  | /// </summary> | 
|  | B4=12, | 
|  | /// <summary> | 
|  | /// B5 paper (176 mm by 250 mm) | 
|  | /// </summary> | 
|  | B5=13, | 
|  | /// <summary> | 
|  | /// Folio paper (8.5 in. by 13 in.) | 
|  | /// </summary> | 
|  | Folio=14, | 
|  | /// <summary> | 
|  | /// Quarto paper (215 mm by 275 mm) | 
|  | /// </summary> | 
|  | Quarto=15, | 
|  | /// <summary> | 
|  | /// Standard paper (10 in. by 14 in.) | 
|  | /// </summary> | 
|  | Standard10_14=16, | 
|  | /// <summary> | 
|  | /// Standard paper (11 in. by 17 in.) | 
|  | /// </summary> | 
|  | Standard11_17=17, | 
|  | /// <summary> | 
|  | /// Note paper (8.5 in. by 11 in.) | 
|  | /// </summary> | 
|  | Note=18, | 
|  | /// <summary> | 
|  | /// #9 envelope (3.875 in. by 8.875 in.) | 
|  | /// </summary> | 
|  | Envelope9=19, | 
|  | /// <summary> | 
|  | /// #10 envelope (4.125 in. by 9.5 in.) | 
|  | /// </summary> | 
|  | Envelope10=20, | 
|  | /// <summary> | 
|  | /// #11 envelope (4.5 in. by 10.375 in.) | 
|  | /// </summary> | 
|  | Envelope11=21, | 
|  | /// <summary> | 
|  | /// #12 envelope (4.75 in. by 11 in.) | 
|  | /// </summary> | 
|  | Envelope12=22, | 
|  | /// <summary> | 
|  | /// #14 envelope (5 in. by 11.5 in.) | 
|  | /// </summary> | 
|  | Envelope14=23, | 
|  | /// <summary> | 
|  | /// C paper (17 in. by 22 in.) | 
|  | /// </summary> | 
|  | C=24, | 
|  | /// <summary> | 
|  | /// D paper (22 in. by 34 in.) | 
|  | /// </summary> | 
|  | D=25, | 
|  | /// <summary> | 
|  | /// E paper (34 in. by 44 in.) | 
|  | /// </summary> | 
|  | E=26, | 
|  | /// <summary> | 
|  | /// DL envelope (110 mm by 220 mm) | 
|  | /// </summary> | 
|  | DLEnvelope = 27, | 
|  | /// <summary> | 
|  | /// C5 envelope (162 mm by 229 mm) | 
|  | /// </summary> | 
|  | C5Envelope = 28, | 
|  | /// <summary> | 
|  | /// C3 envelope (324 mm by 458 mm) | 
|  | /// </summary> | 
|  | C3Envelope = 29, | 
|  | /// <summary> | 
|  | /// C4 envelope (229 mm by 324 mm) | 
|  | /// </summary> | 
|  | C4Envelope = 30, | 
|  | /// <summary> | 
|  | /// C6 envelope (114 mm by 162 mm) | 
|  | /// </summary> | 
|  | C6Envelope = 31, | 
|  | /// <summary> | 
|  | /// C65 envelope (114 mm by 229 mm) | 
|  | /// </summary> | 
|  | C65Envelope = 32, | 
|  | /// <summary> | 
|  | /// B4 envelope (250 mm by 353 mm) | 
|  | /// </summary> | 
|  | B4Envelope= 33, | 
|  | /// <summary> | 
|  | /// B5 envelope (176 mm by 250 mm) | 
|  | /// </summary> | 
|  | B5Envelope= 34, | 
|  | /// <summary> | 
|  | /// B6 envelope (176 mm by 125 mm) | 
|  | /// </summary> | 
|  | B6Envelope = 35, | 
|  | /// <summary> | 
|  | /// Italy envelope (110 mm by 230 mm) | 
|  | /// </summary> | 
|  | ItalyEnvelope = 36, | 
|  | /// <summary> | 
|  | /// Monarch envelope (3.875 in. by 7.5 in.). | 
|  | /// </summary> | 
|  | MonarchEnvelope = 37, | 
|  | /// <summary> | 
|  | /// 6 3/4 envelope (3.625 in. by 6.5 in.) | 
|  | /// </summary> | 
|  | Six3_4Envelope = 38, | 
|  | /// <summary> | 
|  | /// US standard fanfold (14.875 in. by 11 in.) | 
|  | /// </summary> | 
|  | USStandard=39, | 
|  | /// <summary> | 
|  | /// German standard fanfold (8.5 in. by 12 in.) | 
|  | /// </summary> | 
|  | GermanStandard=40, | 
|  | /// <summary> | 
|  | /// German legal fanfold (8.5 in. by 13 in.) | 
|  | /// </summary> | 
|  | GermanLegal=41, | 
|  | /// <summary> | 
|  | /// ISO B4 (250 mm by 353 mm) | 
|  | /// </summary> | 
|  | ISOB4=42, | 
|  | /// <summary> | 
|  | ///  Japanese double postcard (200 mm by 148 mm) | 
|  | /// </summary> | 
|  | JapaneseDoublePostcard=43, | 
|  | /// <summary> | 
|  | /// Standard paper (9 in. by 11 in.) | 
|  | /// </summary> | 
|  | Standard9=44, | 
|  | /// <summary> | 
|  | /// Standard paper (10 in. by 11 in.) | 
|  | /// </summary> | 
|  | Standard10=45, | 
|  | /// <summary> | 
|  | /// Standard paper (15 in. by 11 in.) | 
|  | /// </summary> | 
|  | Standard15=46, | 
|  | /// <summary> | 
|  | /// Invite envelope (220 mm by 220 mm) | 
|  | /// </summary> | 
|  | InviteEnvelope = 47, | 
|  | /// <summary> | 
|  | /// Letter extra paper (9.275 in. by 12 in.) | 
|  | /// </summary> | 
|  | LetterExtra=50, | 
|  | /// <summary> | 
|  | /// Legal extra paper (9.275 in. by 15 in.) | 
|  | /// </summary> | 
|  | LegalExtra=51, | 
|  | /// <summary> | 
|  | /// Tabloid extra paper (11.69 in. by 18 in.) | 
|  | /// </summary> | 
|  | TabloidExtra=52, | 
|  | /// <summary> | 
|  | /// A4 extra paper (236 mm by 322 mm) | 
|  | /// </summary> | 
|  | A4Extra=53, | 
|  | /// <summary> | 
|  | /// Letter transverse paper (8.275 in. by 11 in.) | 
|  | /// </summary> | 
|  | LetterTransverse=54, | 
|  | /// <summary> | 
|  | /// A4 transverse paper (210 mm by 297 mm) | 
|  | /// </summary> | 
|  | A4Transverse=55, | 
|  | /// <summary> | 
|  | /// Letter extra transverse paper (9.275 in. by 12 in.) | 
|  | /// </summary> | 
|  | LetterExtraTransverse=56, | 
|  | /// <summary> | 
|  | /// SuperA/SuperA/A4 paper (227 mm by 356 mm) | 
|  | /// </summary> | 
|  | SuperA=57, | 
|  | /// <summary> | 
|  | /// SuperB/SuperB/A3 paper (305 mm by 487 mm) | 
|  | /// </summary> | 
|  | SuperB=58, | 
|  | /// <summary> | 
|  | /// Letter plus paper (8.5 in. by 12.69 in.) | 
|  | /// </summary> | 
|  | LetterPlus=59, | 
|  | /// <summary> | 
|  | /// A4 plus paper (210 mm by 330 mm) | 
|  | /// </summary> | 
|  | A4Plus=60, | 
|  | /// <summary> | 
|  | /// A5 transverse paper (148 mm by 210 mm) | 
|  | /// </summary> | 
|  | A5Transverse=61, | 
|  | /// <summary> | 
|  | /// JIS B5 transverse paper (182 mm by 257 mm) | 
|  | /// </summary> | 
|  | JISB5Transverse=62, | 
|  | /// <summary> | 
|  | /// A3 extra paper (322 mm by 445 mm) | 
|  | /// </summary> | 
|  | A3Extra=63, | 
|  | /// <summary> | 
|  | /// A5 extra paper (174 mm by 235 mm) | 
|  | /// </summary> | 
|  | A5Extra=64, | 
|  | /// <summary> | 
|  | /// ISO B5 extra paper (201 mm by 276 mm) | 
|  | /// </summary> | 
|  | ISOB5=65, | 
|  | /// <summary> | 
|  | /// A2 paper (420 mm by 594 mm) | 
|  | /// </summary> | 
|  | A2=66, | 
|  | /// <summary> | 
|  | /// A3 transverse paper (297 mm by 420 mm) | 
|  | /// </summary> | 
|  | A3Transverse=67, | 
|  | /// <summary> | 
|  | /// A3 extra transverse paper (322 mm by 445 mm*/ | 
|  | /// </summary> | 
|  | A3ExtraTransverse = 68 | 
|  | } | 
|  | /// <summary> | 
|  | /// Specifies printed page order | 
|  | /// </summary> | 
|  | public enum ePageOrder | 
|  | { | 
|  |  | 
|  | /// <summary> | 
|  | /// Order pages vertically first, then move horizontally. | 
|  | /// </summary> | 
|  | DownThenOver, | 
|  | /// <summary> | 
|  | /// Order pages horizontally first, then move vertically | 
|  | /// </summary> | 
|  | OverThenDown | 
|  | } | 
|  | #endregion | 
|  | /// <summary> | 
|  | /// Printer settings | 
|  | /// </summary> | 
|  | public sealed class ExcelPrinterSettings : XmlHelper | 
|  | { | 
|  | ExcelWorksheet _ws; | 
|  | bool _marginsCreated = false; | 
|  |  | 
|  | internal ExcelPrinterSettings(XmlNamespaceManager ns, XmlNode topNode,ExcelWorksheet ws) : | 
|  | base(ns, topNode) | 
|  | { | 
|  | _ws = ws; | 
|  | SchemaNodeOrder = ws.SchemaNodeOrder; | 
|  | } | 
|  | const string _leftMarginPath = "d:pageMargins/@left"; | 
|  | /// <summary> | 
|  | /// Left margin in inches | 
|  | /// </summary> | 
|  | public decimal LeftMargin | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeDecimal(_leftMarginPath); | 
|  | } | 
|  | set | 
|  | { | 
|  | CreateMargins(); | 
|  | SetXmlNodeString(_leftMarginPath, value.ToString(CultureInfo.InvariantCulture)); | 
|  | } | 
|  | } | 
|  | const string _rightMarginPath = "d:pageMargins/@right"; | 
|  | /// <summary> | 
|  | /// Right margin in inches | 
|  | /// </summary> | 
|  | public decimal RightMargin | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeDecimal(_rightMarginPath); | 
|  | } | 
|  | set | 
|  | { | 
|  | CreateMargins(); | 
|  | SetXmlNodeString(_rightMarginPath, value.ToString(CultureInfo.InvariantCulture)); | 
|  | } | 
|  | } | 
|  | const string _topMarginPath = "d:pageMargins/@top"; | 
|  | /// <summary> | 
|  | /// Top margin in inches | 
|  | /// </summary> | 
|  | public decimal TopMargin | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeDecimal(_topMarginPath); | 
|  | } | 
|  | set | 
|  | { | 
|  | CreateMargins(); | 
|  | SetXmlNodeString(_topMarginPath, value.ToString(CultureInfo.InvariantCulture)); | 
|  | } | 
|  | } | 
|  | const string _bottomMarginPath = "d:pageMargins/@bottom"; | 
|  | /// <summary> | 
|  | /// Bottom margin in inches | 
|  | /// </summary> | 
|  | public decimal BottomMargin | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeDecimal(_bottomMarginPath); | 
|  | } | 
|  | set | 
|  | { | 
|  | CreateMargins(); | 
|  | SetXmlNodeString(_bottomMarginPath, value.ToString(CultureInfo.InvariantCulture)); | 
|  | } | 
|  | } | 
|  | const string _headerMarginPath = "d:pageMargins/@header"; | 
|  | /// <summary> | 
|  | /// Header margin in inches | 
|  | /// </summary> | 
|  | public decimal HeaderMargin | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeDecimal(_headerMarginPath); | 
|  | } | 
|  | set | 
|  | { | 
|  | CreateMargins(); | 
|  | SetXmlNodeString(_headerMarginPath, value.ToString(CultureInfo.InvariantCulture)); | 
|  | } | 
|  | } | 
|  | const string _footerMarginPath = "d:pageMargins/@footer"; | 
|  | /// <summary> | 
|  | /// Footer margin in inches | 
|  | /// </summary> | 
|  | public decimal FooterMargin | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeDecimal(_footerMarginPath); | 
|  | } | 
|  | set | 
|  | { | 
|  | CreateMargins(); | 
|  | SetXmlNodeString(_footerMarginPath, value.ToString(CultureInfo.InvariantCulture)); | 
|  | } | 
|  | } | 
|  | const string _orientationPath = "d:pageSetup/@orientation"; | 
|  | /// <summary> | 
|  | /// Orientation | 
|  | /// Portrait or Landscape | 
|  | /// </summary> | 
|  | public eOrientation Orientation | 
|  | { | 
|  | get | 
|  | { | 
|  | return (eOrientation)Enum.Parse(typeof(eOrientation), GetXmlNodeString(_orientationPath), true); | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeString(_orientationPath, value.ToString().ToLower(CultureInfo.InvariantCulture)); | 
|  | } | 
|  | } | 
|  | const string _fitToWidthPath = "d:pageSetup/@fitToWidth"; | 
|  | /// <summary> | 
|  | /// Fit to Width in pages. | 
|  | /// Set FitToPage to true when using this one. | 
|  | /// 0 is automatic | 
|  | /// </summary> | 
|  | public int FitToWidth | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeInt(_fitToWidthPath); | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeString(_fitToWidthPath, value.ToString()); | 
|  | } | 
|  | } | 
|  | const string _fitToHeightPath = "d:pageSetup/@fitToHeight"; | 
|  | /// <summary> | 
|  | /// Fit to height in pages. | 
|  | /// Set FitToPage to true when using this one. | 
|  | /// 0 is automatic | 
|  | /// </summary> | 
|  | public int FitToHeight | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeInt(_fitToHeightPath); | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeString(_fitToHeightPath, value.ToString()); | 
|  | } | 
|  | } | 
|  | const string _scalePath = "d:pageSetup/@scale"; | 
|  | /// <summary> | 
|  | /// Print scale | 
|  | /// </summary> | 
|  | public int Scale | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeInt(_scalePath); | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeString(_scalePath, value.ToString()); | 
|  | } | 
|  | } | 
|  | const string _fitToPagePath = "d:sheetPr/d:pageSetUpPr/@fitToPage"; | 
|  | /// <summary> | 
|  | /// Fit To Page. | 
|  | /// </summary> | 
|  | public bool FitToPage | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeBool(_fitToPagePath); | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeString(_fitToPagePath, value ? "1" : "0"); | 
|  | } | 
|  | } | 
|  | const string _headersPath = "d:printOptions/@headings"; | 
|  | /// <summary> | 
|  | /// Print headings (column letter and row numbers) | 
|  | /// </summary> | 
|  | public bool ShowHeaders | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeBool(_headersPath, false); | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeBool(_headersPath, value, false); | 
|  | } | 
|  | } | 
|  | /// <summary> | 
|  | /// Print titles | 
|  | /// Rows to be repeated after each pagebreak. | 
|  | /// The address must be a full row address (ex. 1:1) | 
|  | /// </summary> | 
|  | public ExcelAddress RepeatRows | 
|  | { | 
|  | get | 
|  | { | 
|  | if (_ws.Names.ContainsKey("_xlnm.Print_Titles")) | 
|  | { | 
|  | ExcelRangeBase r = _ws.Names["_xlnm.Print_Titles"] as ExcelRangeBase; | 
|  | if (r.Start.Column == 1 && r.End.Column == ExcelPackage.MaxColumns) | 
|  | { | 
|  | return new ExcelAddress(r.FirstAddress); | 
|  | } | 
|  | else if (r._addresses != null && r.Addresses[0].Start.Column == 1 && r.Addresses[0].End.Column == ExcelPackage.MaxColumns) | 
|  | { | 
|  | return r._addresses[0]; | 
|  | } | 
|  | else | 
|  | { | 
|  | return null; | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | return null; | 
|  | } | 
|  | } | 
|  | set | 
|  | { | 
|  |  | 
|  | //Must span entire columns | 
|  | if (!(value.Start.Column == 1 && value.End.Column == ExcelPackage.MaxColumns)) | 
|  | { | 
|  | throw new InvalidOperationException("Address must span full columns only (for ex. Address=\"A:A\" for the first column)."); | 
|  | } | 
|  |  | 
|  | var vertAddr = RepeatColumns; | 
|  | string addr; | 
|  | if (vertAddr == null) | 
|  | { | 
|  | addr = value.Address; | 
|  | } | 
|  | else | 
|  | { | 
|  | addr = vertAddr.Address + "," + value.Address; | 
|  | } | 
|  |  | 
|  | if (_ws.Names.ContainsKey("_xlnm.Print_Titles")) | 
|  | { | 
|  | _ws.Names["_xlnm.Print_Titles"].Address = addr; | 
|  | } | 
|  | else | 
|  | { | 
|  | _ws.Names.Add("_xlnm.Print_Titles", new ExcelRangeBase(_ws, addr)); | 
|  | } | 
|  | } | 
|  | } | 
|  | /// <summary> | 
|  | /// Print titles | 
|  | /// Columns to be repeated after each pagebreak. | 
|  | /// The address must be a full column address (ex. A:A) | 
|  | /// </summary> | 
|  | public ExcelAddress RepeatColumns | 
|  | { | 
|  | get | 
|  | { | 
|  | if (_ws.Names.ContainsKey("_xlnm.Print_Titles")) | 
|  | { | 
|  | ExcelRangeBase r = _ws.Names["_xlnm.Print_Titles"] as ExcelRangeBase; | 
|  | if (r.Start.Row == 1 && r.End.Row == ExcelPackage.MaxRows) | 
|  | { | 
|  | return new ExcelAddress(r.FirstAddress); | 
|  | } | 
|  | else if (r._addresses != null && (r._addresses[0].Start.Row == 1 && r._addresses[0].End.Row == ExcelPackage.MaxRows)) | 
|  | { | 
|  | return r._addresses[0]; | 
|  | } | 
|  | else | 
|  | { | 
|  | return null; | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | return null; | 
|  | } | 
|  | } | 
|  | set | 
|  | { | 
|  | //Must span entire rows | 
|  | if (!(value.Start.Row == 1 && value.End.Row== ExcelPackage.MaxRows)) | 
|  | { | 
|  | throw new InvalidOperationException("Address must span rows only (for ex. Address=\"1:1\" for the first row)."); | 
|  | } | 
|  |  | 
|  | var horAddr = RepeatRows; | 
|  | string addr; | 
|  | if (horAddr == null) | 
|  | { | 
|  | addr = value.Address; | 
|  | } | 
|  | else | 
|  | { | 
|  | addr = value.Address + "," + horAddr.Address; | 
|  | } | 
|  |  | 
|  | if (_ws.Names.ContainsKey("_xlnm.Print_Titles")) | 
|  | { | 
|  | _ws.Names["_xlnm.Print_Titles"].Address = addr; | 
|  | } | 
|  | else | 
|  | { | 
|  | _ws.Names.Add("_xlnm.Print_Titles", new ExcelRangeBase(_ws, addr)); | 
|  | } | 
|  | } | 
|  | } | 
|  | /// <summary> | 
|  | /// The printarea. | 
|  | /// Null if no print area is set. | 
|  | /// </summary> | 
|  | public ExcelRangeBase PrintArea | 
|  | { | 
|  | get | 
|  | { | 
|  | if (_ws.Names.ContainsKey("_xlnm.Print_Area")) | 
|  | { | 
|  | return _ws.Names["_xlnm.Print_Area"]; | 
|  | } | 
|  | else | 
|  | { | 
|  | return null; | 
|  | } | 
|  | } | 
|  | set | 
|  | { | 
|  | if (value == null) | 
|  | { | 
|  | _ws.Names.Remove("_xlnm.Print_Area"); | 
|  | } | 
|  | else if (_ws.Names.ContainsKey("_xlnm.Print_Area")) | 
|  | { | 
|  | _ws.Names["_xlnm.Print_Area"].Address = value.Address; | 
|  | } | 
|  | else | 
|  | { | 
|  | _ws.Names.Add("_xlnm.Print_Area", value); | 
|  | } | 
|  | } | 
|  | } | 
|  | const string _gridLinesPath = "d:printOptions/@gridLines"; | 
|  | /// <summary> | 
|  | /// Print gridlines | 
|  | /// </summary> | 
|  | public bool ShowGridLines | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeBool(_gridLinesPath, false); | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeBool(_gridLinesPath, value, false); | 
|  | } | 
|  | } | 
|  | const string _horizontalCenteredPath = "d:printOptions/@horizontalCentered"; | 
|  | /// <summary> | 
|  | /// Horizontal centered when printing | 
|  | /// </summary>w | 
|  | public bool HorizontalCentered | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeBool(_horizontalCenteredPath, false); | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeBool(_horizontalCenteredPath, value, false); | 
|  | } | 
|  | } | 
|  | const string _verticalCenteredPath = "d:printOptions/@verticalCentered"; | 
|  | /// <summary> | 
|  | /// Vertical centered when printing | 
|  | /// </summary> | 
|  | public bool VerticalCentered | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeBool(_verticalCenteredPath, false); | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeBool(_verticalCenteredPath, value, false); | 
|  | } | 
|  | } | 
|  | const string _pageOrderPath = "d:pageSetup/@pageOrder"; | 
|  | /// <summary> | 
|  | /// Specifies printed page order | 
|  | /// </summary> | 
|  | public ePageOrder PageOrder | 
|  | { | 
|  | get | 
|  | { | 
|  | if (GetXmlNodeString(_pageOrderPath) == "overThenDown") | 
|  | { | 
|  | return ePageOrder.OverThenDown; | 
|  | } | 
|  | else | 
|  | { | 
|  | return ePageOrder.DownThenOver; | 
|  | } | 
|  | } | 
|  | set | 
|  | { | 
|  | if (value == ePageOrder.OverThenDown) | 
|  | { | 
|  | SetXmlNodeString(_pageOrderPath, "overThenDown"); | 
|  | } | 
|  | else | 
|  | { | 
|  | DeleteNode(_pageOrderPath); | 
|  | } | 
|  | } | 
|  | } | 
|  | const string _blackAndWhitePath = "d:pageSetup/@blackAndWhite"; | 
|  | /// <summary> | 
|  | /// Print black and white | 
|  | /// </summary> | 
|  | public bool BlackAndWhite | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeBool(_blackAndWhitePath, false); | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeBool(_blackAndWhitePath, value, false); | 
|  | } | 
|  | } | 
|  | const string _draftPath = "d:pageSetup/@draft"; | 
|  | /// <summary> | 
|  | /// Print a draft | 
|  | /// </summary> | 
|  | public bool Draft | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetXmlNodeBool(_draftPath, false); | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeBool(_draftPath, value, false); | 
|  | } | 
|  | } | 
|  | const string _paperSizePath = "d:pageSetup/@paperSize"; | 
|  | /// <summary> | 
|  | /// Paper size | 
|  | /// </summary> | 
|  | public ePaperSize PaperSize | 
|  | { | 
|  | get | 
|  | { | 
|  | string s = GetXmlNodeString(_paperSizePath); | 
|  | if (s != "") | 
|  | { | 
|  | return (ePaperSize)int.Parse(s); | 
|  | } | 
|  | else | 
|  | { | 
|  | return ePaperSize.Letter; | 
|  |  | 
|  | } | 
|  | } | 
|  | set | 
|  | { | 
|  | SetXmlNodeString(_paperSizePath, ((int)value).ToString()); | 
|  | } | 
|  | } | 
|  | /// <summary> | 
|  | /// All or none of the margin attributes must exist. Create all att ones. | 
|  | /// </summary> | 
|  | private void CreateMargins() | 
|  | { | 
|  | if (_marginsCreated==false && TopNode.SelectSingleNode(_leftMarginPath, NameSpaceManager) == null) | 
|  | { | 
|  | _marginsCreated=true; | 
|  | LeftMargin = 0.7087M; | 
|  | RightMargin = 0.7087M; | 
|  | TopMargin = 0.7480M; | 
|  | BottomMargin = 0.7480M; | 
|  | HeaderMargin = 0.315M; | 
|  | FooterMargin = 0.315M; | 
|  | } | 
|  | } | 
|  | } | 
|  | } |