diff --git a/ClosedXML/Excel/IXLSheetView.cs b/ClosedXML/Excel/IXLSheetView.cs
index eee1ed0..9de885a 100644
--- a/ClosedXML/Excel/IXLSheetView.cs
+++ b/ClosedXML/Excel/IXLSheetView.cs
@@ -3,27 +3,45 @@
namespace ClosedXML.Excel
{
public enum XLSheetViewOptions { Normal, PageBreakPreview, PageLayout }
+
public interface IXLSheetView
{
///
- /// Gets or sets the row after which the vertical split should take place.
- ///
- Int32 SplitRow { get; set; }
- ///
/// Gets or sets the column after which the horizontal split should take place.
///
Int32 SplitColumn { get; set; }
- //Boolean FreezePanes { get; set; }
+
///
- /// Freezes the top X rows.
+ /// Gets or sets the row after which the vertical split should take place.
///
- /// The rows to freeze.
- void FreezeRows(Int32 rows);
+ Int32 SplitRow { get; set; }
+
+ XLSheetViewOptions View { get; set; }
+
///
- /// Freezes the left X columns.
+ /// Window zoom magnification for current view representing percent values. Horizontal & Vertical scale together.
///
- /// The columns to freeze.
- void FreezeColumns(Int32 columns);
+ /// Representing percent values ranging from 10 to 400.
+ Int32 ZoomScale { get; set; }
+
+ ///
+ /// Zoom magnification to use when in normal view. Horizontal & Vertical scale together
+ ///
+ /// Representing percent values ranging from 10 to 400.
+ Int32 ZoomScaleNormal { get; set; }
+
+ ///
+ /// Zoom magnification to use when in page layout view. Horizontal & Vertical scale together.
+ ///
+ /// Representing percent values ranging from 10 to 400.
+ Int32 ZoomScalePageLayoutView { get; set; }
+
+ ///
+ /// Zoom magnification to use when in page break preview. Horizontal & Vertical scale together.
+ ///
+ /// Representing percent values ranging from 10 to 400.
+ Int32 ZoomScaleSheetLayoutView { get; set; }
+
///
/// Freezes the specified rows and columns.
///
@@ -31,7 +49,18 @@
/// The columns to freeze.
void Freeze(Int32 rows, Int32 columns);
- XLSheetViewOptions View { get; set; }
+ ///
+ /// Freezes the left X columns.
+ ///
+ /// The columns to freeze.
+ void FreezeColumns(Int32 columns);
+
+ //Boolean FreezePanes { get; set; }
+ ///
+ /// Freezes the top X rows.
+ ///
+ /// The rows to freeze.
+ void FreezeRows(Int32 rows);
IXLSheetView SetView(XLSheetViewOptions value);
}
diff --git a/ClosedXML/Excel/XLSheetView.cs b/ClosedXML/Excel/XLSheetView.cs
index 2d7b22d..169bb67 100644
--- a/ClosedXML/Excel/XLSheetView.cs
+++ b/ClosedXML/Excel/XLSheetView.cs
@@ -2,31 +2,62 @@
namespace ClosedXML.Excel
{
- internal class XLSheetView: IXLSheetView
+ internal class XLSheetView : IXLSheetView
{
- public XLSheetView() {
+ public XLSheetView()
+ {
View = XLSheetViewOptions.Normal;
+
+ ZoomScale = 100;
+ ZoomScaleNormal = 100;
+ ZoomScalePageLayoutView = 100;
+ ZoomScaleSheetLayoutView = 100;
}
- public XLSheetView(IXLSheetView sheetView):this()
+
+ public XLSheetView(IXLSheetView sheetView)
+ : this()
{
this.SplitRow = sheetView.SplitRow;
this.SplitColumn = sheetView.SplitColumn;
this.FreezePanes = ((XLSheetView)sheetView).FreezePanes;
}
- public Int32 SplitRow { get; set; }
- public Int32 SplitColumn { get; set; }
public Boolean FreezePanes { get; set; }
- public void FreezeRows(Int32 rows)
+ public Int32 SplitColumn { get; set; }
+ public Int32 SplitRow { get; set; }
+ public XLSheetViewOptions View { get; set; }
+
+ public int ZoomScale
{
- SplitRow = rows;
- FreezePanes = true;
+ get { return _zoomScale; }
+ set
+ {
+ _zoomScale = value;
+ switch (View)
+ {
+ case XLSheetViewOptions.Normal:
+ ZoomScaleNormal = value;
+ break;
+
+ case XLSheetViewOptions.PageBreakPreview:
+ ZoomScalePageLayoutView = value;
+ break;
+
+ case XLSheetViewOptions.PageLayout:
+ ZoomScaleSheetLayoutView = value;
+ break;
+ }
+ }
}
- public void FreezeColumns(Int32 columns)
- {
- SplitColumn = columns;
- FreezePanes = true;
- }
+
+ public int ZoomScaleNormal { get; set; }
+
+ public int ZoomScalePageLayoutView { get; set; }
+
+ public int ZoomScaleSheetLayoutView { get; set; }
+
+ private int _zoomScale { get; set; }
+
public void Freeze(Int32 rows, Int32 columns)
{
SplitRow = rows;
@@ -34,8 +65,17 @@
FreezePanes = true;
}
+ public void FreezeColumns(Int32 columns)
+ {
+ SplitColumn = columns;
+ FreezePanes = true;
+ }
- public XLSheetViewOptions View { get; set; }
+ public void FreezeRows(Int32 rows)
+ {
+ SplitRow = rows;
+ FreezePanes = true;
+ }
public IXLSheetView SetView(XLSheetViewOptions value)
{
diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs
index bb05e45..f453b6a 100644
--- a/ClosedXML/Excel/XLWorkbook_Load.cs
+++ b/ClosedXML/Excel/XLWorkbook_Load.cs
@@ -1917,8 +1917,16 @@
ws.Cell(selection.ActiveCell).SetActive();
}
- var pane = sheetView.Elements().FirstOrDefault();
+ if (sheetView.ZoomScale != null)
+ ws.SheetView.ZoomScale = (int)UInt32Value.ToUInt32(sheetView.ZoomScale);
+ if (sheetView.ZoomScaleNormal != null)
+ ws.SheetView.ZoomScaleNormal = (int)UInt32Value.ToUInt32(sheetView.ZoomScaleNormal);
+ if (sheetView.ZoomScalePageLayoutView != null)
+ ws.SheetView.ZoomScalePageLayoutView = (int)UInt32Value.ToUInt32(sheetView.ZoomScalePageLayoutView);
+ if (sheetView.ZoomScaleSheetLayoutView != null)
+ ws.SheetView.ZoomScaleSheetLayoutView = (int)UInt32Value.ToUInt32(sheetView.ZoomScaleSheetLayoutView);
+ var pane = sheetView.Elements().FirstOrDefault();
if (pane == null) return;
if (pane.State == null ||
diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs
index 0c40d9d..7fb82f5 100644
--- a/ClosedXML/Excel/XLWorkbook_Save.cs
+++ b/ClosedXML/Excel/XLWorkbook_Save.cs
@@ -3647,6 +3647,26 @@
sheetView.Append(selection);
}
+ if (xlWorksheet.SheetView.ZoomScale == 100)
+ sheetView.ZoomScale = null;
+ else
+ sheetView.ZoomScale = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScale));
+
+ if (xlWorksheet.SheetView.ZoomScaleNormal == 100)
+ sheetView.ZoomScaleNormal = null;
+ else
+ sheetView.ZoomScaleNormal = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScaleNormal));
+
+ if (xlWorksheet.SheetView.ZoomScalePageLayoutView == 100)
+ sheetView.ZoomScalePageLayoutView = null;
+ else
+ sheetView.ZoomScalePageLayoutView = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScalePageLayoutView));
+
+ if (xlWorksheet.SheetView.ZoomScaleSheetLayoutView == 100)
+ sheetView.ZoomScaleSheetLayoutView = null;
+ else
+ sheetView.ZoomScaleSheetLayoutView = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScaleSheetLayoutView));
+
#endregion
var maxOutlineColumn = 0;
diff --git a/ClosedXML_Examples/ClosedXML_Examples.csproj b/ClosedXML_Examples/ClosedXML_Examples.csproj
index 9bdf8de..155d094 100644
--- a/ClosedXML_Examples/ClosedXML_Examples.csproj
+++ b/ClosedXML_Examples/ClosedXML_Examples.csproj
@@ -75,6 +75,7 @@
+
diff --git a/ClosedXML_Examples/Creating/CreateFiles.cs b/ClosedXML_Examples/Creating/CreateFiles.cs
index 694109c..64b2ce4 100644
--- a/ClosedXML_Examples/Creating/CreateFiles.cs
+++ b/ClosedXML_Examples/Creating/CreateFiles.cs
@@ -90,6 +90,7 @@
new WalkingRanges().Create(Path.Combine(path, "CellMoves.xlsx"));
new AddingComments().Create(Path.Combine(path, "AddingComments.xlsx"));
new PivotTables().Create(Path.Combine(path, "PivotTables.xlsx"));
+ new SheetViews().Create(Path.Combine(path, "SheetViews.xlsx"));
}
}
}
diff --git a/ClosedXML_Examples/Misc/SheetViews.cs b/ClosedXML_Examples/Misc/SheetViews.cs
new file mode 100644
index 0000000..70f9b5c
--- /dev/null
+++ b/ClosedXML_Examples/Misc/SheetViews.cs
@@ -0,0 +1,45 @@
+using ClosedXML.Excel;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace ClosedXML_Examples.Misc
+{
+ public class SheetViews : IXLExample
+ {
+ public void Create(string filePath)
+ {
+ using (var wb = new XLWorkbook())
+ {
+ IXLWorksheet ws;
+
+ ws = wb.AddWorksheet("ZoomScale");
+ ws.FirstCell().SetValue(ws.Name);
+ ws.SheetView.ZoomScale = 50;
+
+ ws = wb.AddWorksheet("ZoomScaleNormal");
+ ws.FirstCell().SetValue(ws.Name);
+ ws.SheetView.ZoomScaleNormal = 70;
+
+ ws = wb.AddWorksheet("ZoomScalePageLayoutView");
+ ws.FirstCell().SetValue(ws.Name);
+ ws.SheetView.ZoomScalePageLayoutView = 85;
+
+ ws = wb.AddWorksheet("ZoomScaleSheetLayoutView");
+ ws.FirstCell().SetValue(ws.Name);
+ ws.SheetView.ZoomScaleSheetLayoutView = 120;
+
+ ws = wb.AddWorksheet("ZoomScaleTooSmall");
+ ws.FirstCell().SetValue(ws.Name);
+ ws.SheetView.ZoomScale = 5;
+
+ ws = wb.AddWorksheet("ZoomScaleTooBig");
+ ws.FirstCell().SetValue(ws.Name);
+ ws.SheetView.ZoomScale = 500;
+
+ wb.SaveAs(filePath);
+ }
+ }
+ }
+}
diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj
index e89fd07..9b1c48d 100644
--- a/ClosedXML_Tests/ClosedXML_Tests.csproj
+++ b/ClosedXML_Tests/ClosedXML_Tests.csproj
@@ -162,6 +162,7 @@
+
diff --git a/ClosedXML_Tests/Examples/MiscTests.cs b/ClosedXML_Tests/Examples/MiscTests.cs
index eebb483..47865bc 100644
--- a/ClosedXML_Tests/Examples/MiscTests.cs
+++ b/ClosedXML_Tests/Examples/MiscTests.cs
@@ -170,6 +170,12 @@
}
[Test]
+ public void SheetViews()
+ {
+ TestHelper.RunTestExample(@"Misc\SheetViews.xlsx");
+ }
+
+ [Test]
public void ShiftingFormulas()
{
TestHelper.RunTestExample(@"Misc\ShiftingFormulas.xlsx");
diff --git a/ClosedXML_Tests/Resource/Examples/Misc/SheetViews.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/SheetViews.xlsx
new file mode 100644
index 0000000..723756a
--- /dev/null
+++ b/ClosedXML_Tests/Resource/Examples/Misc/SheetViews.xlsx
Binary files differ