diff --git a/EPPlus/CellStore.cs b/EPPlus/CellStore.cs
index c767a82..71aece7 100644
--- a/EPPlus/CellStore.cs
+++ b/EPPlus/CellStore.cs
@@ -1583,15 +1583,15 @@
 }
 
 internal class CellsStoreEnumerator<T> : IEnumerable<T>, IEnumerator<T> {
-  private CellStore<T> _cellStore;
+  private readonly CellStore<T> _cellStore;
   private int row,
       colPos;
   private int[] pagePos,
       cellPos;
-  private int _startRow,
-      _startCol,
-      _endRow,
-      _endCol;
+  private readonly int _startRow;
+  private readonly int _startCol;
+  private readonly int _endRow;
+  private readonly int _endCol;
   private int minRow,
       minColPos,
       maxRow,
diff --git a/EPPlus/ConditionalFormatting/ExcelConditionalFormattingCollection.cs b/EPPlus/ConditionalFormatting/ExcelConditionalFormattingCollection.cs
index 4fe42f4..3c19a93 100644
--- a/EPPlus/ConditionalFormatting/ExcelConditionalFormattingCollection.cs
+++ b/EPPlus/ConditionalFormatting/ExcelConditionalFormattingCollection.cs
@@ -70,8 +70,8 @@
   /****************************************************************************************/
 
 
-  private List<IExcelConditionalFormattingRule> _rules = new();
-  private ExcelWorksheet _worksheet;
+  private readonly List<IExcelConditionalFormattingRule> _rules = new();
+  private readonly ExcelWorksheet _worksheet;
 
   /****************************************************************************************/
 
diff --git a/EPPlus/ConditionalFormatting/ExcelConditionalFormattingColorScaleValue.cs b/EPPlus/ConditionalFormatting/ExcelConditionalFormattingColorScaleValue.cs
index 3331b3e..1f1bda6 100644
--- a/EPPlus/ConditionalFormatting/ExcelConditionalFormattingColorScaleValue.cs
+++ b/EPPlus/ConditionalFormatting/ExcelConditionalFormattingColorScaleValue.cs
@@ -46,7 +46,7 @@
 
   private eExcelConditionalFormattingValueObjectPosition _position;
   private eExcelConditionalFormattingRuleType _ruleType;
-  private ExcelWorksheet _worksheet;
+  private readonly ExcelWorksheet _worksheet;
 
   /****************************************************************************************/
 
diff --git a/EPPlus/ConditionalFormatting/ExcelConditionalFormattingIconDatabarValue.cs b/EPPlus/ConditionalFormatting/ExcelConditionalFormattingIconDatabarValue.cs
index 3c7a98b..2e080d2 100644
--- a/EPPlus/ConditionalFormatting/ExcelConditionalFormattingIconDatabarValue.cs
+++ b/EPPlus/ConditionalFormatting/ExcelConditionalFormattingIconDatabarValue.cs
@@ -46,7 +46,7 @@
 
 
   private eExcelConditionalFormattingRuleType _ruleType;
-  private ExcelWorksheet _worksheet;
+  private readonly ExcelWorksheet _worksheet;
 
   /****************************************************************************************/
 
diff --git a/EPPlus/ConditionalFormatting/Rules/ExcelConditionalFormattingRule.cs b/EPPlus/ConditionalFormatting/Rules/ExcelConditionalFormattingRule.cs
index a9a12ae..a85ebaa 100644
--- a/EPPlus/ConditionalFormatting/Rules/ExcelConditionalFormattingRule.cs
+++ b/EPPlus/ConditionalFormatting/Rules/ExcelConditionalFormattingRule.cs
@@ -42,7 +42,7 @@
 /// </summary>
 public abstract class ExcelConditionalFormattingRule : XmlHelper, IExcelConditionalFormattingRule {
   private eExcelConditionalFormattingRuleType? _type;
-  private ExcelWorksheet _worksheet;
+  private readonly ExcelWorksheet _worksheet;
 
   /// <summary>
   /// Sinalize that we are in a Cnaging Priorities opeartion so that we won't enter
diff --git a/EPPlus/DataValidation/ExcelDataValidationCollection.cs b/EPPlus/DataValidation/ExcelDataValidationCollection.cs
index 6692f9d..76c07a3 100644
--- a/EPPlus/DataValidation/ExcelDataValidationCollection.cs
+++ b/EPPlus/DataValidation/ExcelDataValidationCollection.cs
@@ -67,8 +67,8 @@
 /// </code>
 /// </summary>
 public class ExcelDataValidationCollection : XmlHelper, IEnumerable<IExcelDataValidation> {
-  private List<IExcelDataValidation> _validations = new();
-  private ExcelWorksheet _worksheet;
+  private readonly List<IExcelDataValidation> _validations = new();
+  private readonly ExcelWorksheet _worksheet;
 
   private const string _dataValidationPath = "//d:dataValidations";
   private readonly string DataValidationItemsPath = string.Format(
diff --git a/EPPlus/DataValidation/Formulas/ExcelDataValidationFormulaList.cs b/EPPlus/DataValidation/Formulas/ExcelDataValidationFormulaList.cs
index bfe5301..55e554b 100644
--- a/EPPlus/DataValidation/Formulas/ExcelDataValidationFormulaList.cs
+++ b/EPPlus/DataValidation/Formulas/ExcelDataValidationFormulaList.cs
@@ -44,7 +44,7 @@
     : ExcelDataValidationFormula,
       IExcelDataValidationFormulaList {
   private class DataValidationList : IList<string>, ICollection {
-    private IList<string> _items = new List<string>();
+    private readonly IList<string> _items = new List<string>();
     private EventHandler<EventArgs> _listChanged;
 
     public event EventHandler<EventArgs> ListChanged {
@@ -140,7 +140,7 @@
     SetInitialValues();
   }
 
-  private string _formulaPath;
+  private readonly string _formulaPath;
 
   private void SetInitialValues() {
     var value = GetXmlNodeString(_formulaPath);
diff --git a/EPPlus/DataValidation/RangeDataValidation.cs b/EPPlus/DataValidation/RangeDataValidation.cs
index 82bf95d..b09d219 100644
--- a/EPPlus/DataValidation/RangeDataValidation.cs
+++ b/EPPlus/DataValidation/RangeDataValidation.cs
@@ -43,8 +43,8 @@
     _address = address;
   }
 
-  private ExcelWorksheet _worksheet;
-  private string _address;
+  private readonly ExcelWorksheet _worksheet;
+  private readonly string _address;
 
   public IExcelDataValidationAny AddAnyDataValidation() {
     return _worksheet.DataValidations.AddAnyValidation(_address);
diff --git a/EPPlus/Drawing/Vml/ExcelVmlDrawingPosition.cs b/EPPlus/Drawing/Vml/ExcelVmlDrawingPosition.cs
index 755fad0..3d02863 100644
--- a/EPPlus/Drawing/Vml/ExcelVmlDrawingPosition.cs
+++ b/EPPlus/Drawing/Vml/ExcelVmlDrawingPosition.cs
@@ -39,7 +39,7 @@
 /// The position of a VML drawing. Used for comments
 /// </summary>
 public class ExcelVmlDrawingPosition : XmlHelper {
-  private int _startPos;
+  private readonly int _startPos;
 
   internal ExcelVmlDrawingPosition(XmlNamespaceManager ns, XmlNode topNode, int startPos)
       : base(ns, topNode) {
diff --git a/EPPlus/ExcelAddress.cs b/EPPlus/ExcelAddress.cs
index 54e5460..22fcf59 100644
--- a/EPPlus/ExcelAddress.cs
+++ b/EPPlus/ExcelAddress.cs
@@ -162,14 +162,17 @@
   /// <param name="address">The Excel Address</param>
   /// <param name="pck">Reference to the package to find information about tables and names</param>
   /// <param name="referenceAddress">The address</param>
-  public ExcelAddressBase(string address, ExcelPackage pck, ExcelAddressBase referenceAddress) {
+  protected ExcelAddressBase(
+      string address,
+      ExcelWorkbook workbook,
+      ExcelAddressBase referenceAddress) {
     SetAddress(address);
-    SetRcFromTable(pck, referenceAddress);
+    SetRcFromTable(workbook, referenceAddress);
   }
 
-  internal void SetRcFromTable(ExcelPackage pck, ExcelAddressBase referenceAddress) {
+  internal void SetRcFromTable(ExcelWorkbook workbook, ExcelAddressBase referenceAddress) {
     if (string.IsNullOrEmpty(_wb) && Table != null) {
-      foreach (var ws in pck.Workbook.Worksheets) {
+      foreach (var ws in workbook.Worksheets) {
         foreach (var t in ws.Tables) {
           if (t.Name.Equals(Table.Name, StringComparison.InvariantCultureIgnoreCase)) {
             _ws = ws.Name;
@@ -1188,8 +1191,8 @@
     }
   }
 
-  public ExcelAddress(string address, ExcelPackage package, ExcelAddressBase referenceAddress)
-      : base(address, package, referenceAddress) {}
+  public ExcelAddress(string address, ExcelWorkbook workbook, ExcelAddressBase referenceAddress)
+      : base(address, workbook, referenceAddress) {}
 
   /// <summary>
   /// The address for the range
diff --git a/EPPlus/ExcelColumn.cs b/EPPlus/ExcelColumn.cs
index bb26958..31bd864 100644
--- a/EPPlus/ExcelColumn.cs
+++ b/EPPlus/ExcelColumn.cs
@@ -40,8 +40,8 @@
 /// Represents one or more columns within the worksheet
 /// </summary>
 public class ExcelColumn : IRangeId {
-  private ExcelWorksheet _worksheet;
-  private XmlElement _colElement = null;
+  private readonly ExcelWorksheet _worksheet;
+  private readonly XmlElement _colElement = null;
 
   /// <summary>
   /// Creates a new instance of the ExcelColumn class.
diff --git a/EPPlus/ExcelComment.cs b/EPPlus/ExcelComment.cs
index acd42ad..9e7409a 100644
--- a/EPPlus/ExcelComment.cs
+++ b/EPPlus/ExcelComment.cs
@@ -41,7 +41,7 @@
 /// </summary>
 public class ExcelComment : ExcelVmlDrawingComment {
   internal XmlHelper _commentHelper;
-  private string _text;
+  private readonly string _text;
 
   internal ExcelComment(XmlNamespaceManager ns, XmlNode commentTopNode, ExcelRangeBase cell)
       : base(null, cell, cell.Worksheet.VmlDrawingsComments.NameSpaceManager) {
diff --git a/EPPlus/ExcelHeaderFooter.cs b/EPPlus/ExcelHeaderFooter.cs
index 9a53f92..c4a3eeb 100644
--- a/EPPlus/ExcelHeaderFooter.cs
+++ b/EPPlus/ExcelHeaderFooter.cs
@@ -160,7 +160,7 @@
   internal ExcelHeaderFooterText _evenFooter;
   internal ExcelHeaderFooterText _firstHeader;
   internal ExcelHeaderFooterText _firstFooter;
-  private ExcelWorksheet _ws;
+  private readonly ExcelWorksheet _ws;
 
   /// <summary>
   /// ExcelHeaderFooter Constructor
diff --git a/EPPlus/ExcelNamedRange.cs b/EPPlus/ExcelNamedRange.cs
index da86830..96337ae 100644
--- a/EPPlus/ExcelNamedRange.cs
+++ b/EPPlus/ExcelNamedRange.cs
@@ -36,7 +36,7 @@
 /// A named range.
 /// </summary>
 public sealed class ExcelNamedRange : ExcelRangeBase {
-  private ExcelWorksheet _sheet;
+  private readonly ExcelWorksheet _sheet;
 
   /// <summary>
   /// A named range
diff --git a/EPPlus/ExcelNamedRangeCollection.cs b/EPPlus/ExcelNamedRangeCollection.cs
index ab281f9..748b7e7 100644
--- a/EPPlus/ExcelNamedRangeCollection.cs
+++ b/EPPlus/ExcelNamedRangeCollection.cs
@@ -53,8 +53,8 @@
     _ws = ws;
   }
 
-  private List<ExcelNamedRange> _list = new();
-  private Dictionary<string, int> _dic = new(StringComparer.InvariantCultureIgnoreCase);
+  private readonly List<ExcelNamedRange> _list = new();
+  private readonly Dictionary<string, int> _dic = new(StringComparer.InvariantCultureIgnoreCase);
 
   /// <summary>
   /// Add a new named range
diff --git a/EPPlus/ExcelPackage.cs b/EPPlus/ExcelPackage.cs
index 5bd9395..be8f56e 100644
--- a/EPPlus/ExcelPackage.cs
+++ b/EPPlus/ExcelPackage.cs
@@ -62,102 +62,8 @@
 }
 
 /// <summary>
-/// Represents an Excel 2007/2010 XLSX file package.
-/// This is the top-level object to access all parts of the document.
-/// <code>
-///     FileInfo newFile = new FileInfo(outputDir.FullName + @"\sample1.xlsx");
-/// 	if (newFile.Exists)
-/// 	{
-/// 		newFile.Delete();  // ensures we create a new workbook
-/// 		newFile = new FileInfo(outputDir.FullName + @"\sample1.xlsx");
-/// 	}
-/// 	using (ExcelPackage package = new ExcelPackage(newFile))
-///     {
-///         // add a new worksheet to the empty workbook
-///         ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Inventory");
-///         //Add the headers
-///         worksheet.Cells[1, 1].Value = "ID";
-///         worksheet.Cells[1, 2].Value = "Product";
-///         worksheet.Cells[1, 3].Value = "Quantity";
-///         worksheet.Cells[1, 4].Value = "Price";
-///         worksheet.Cells[1, 5].Value = "Value";
-///
-///         //Add some items...
-///         worksheet.Cells["A2"].Value = "12001";
-///         worksheet.Cells["B2"].Value = "Nails";
-///         worksheet.Cells["C2"].Value = 37;
-///         worksheet.Cells["D2"].Value = 3.99;
-///
-///         worksheet.Cells["A3"].Value = "12002";
-///         worksheet.Cells["B3"].Value = "Hammer";
-///         worksheet.Cells["C3"].Value = 5;
-///         worksheet.Cells["D3"].Value = 12.10;
-///
-///         worksheet.Cells["A4"].Value = "12003";
-///         worksheet.Cells["B4"].Value = "Saw";
-///         worksheet.Cells["C4"].Value = 12;
-///         worksheet.Cells["D4"].Value = 15.37;
-///
-///         //Add a formula for the value-column
-///         worksheet.Cells["E2:E4"].Formula = "C2*D2";
-///
-///            //Ok now format the values;
-///         using (var range = worksheet.Cells[1, 1, 1, 5])
-///          {
-///             range.Style.Font.Bold = true;
-///             range.Style.Fill.PatternType = ExcelFillStyle.Solid;
-///             range.Style.Fill.BackgroundColor.SetColor(Color.DarkBlue);
-///             range.Style.Font.Color.SetColor(Color.White);
-///         }
-///
-///         worksheet.Cells["A5:E5"].Style.Border.Top.Style = ExcelBorderStyle.Thin;
-///         worksheet.Cells["A5:E5"].Style.Font.Bold = true;
-///
-///         worksheet.Cells[5, 3, 5, 5].Formula = string.Format("SUBTOTAL(9,{0})", new ExcelAddress(2,3,4,3).Address);
-///         worksheet.Cells["C2:C5"].Style.Numberformat.Format = "#,##0";
-///         worksheet.Cells["D2:E5"].Style.Numberformat.Format = "#,##0.00";
-///
-///         //Create an autofilter for the range
-///         worksheet.Cells["A1:E4"].AutoFilter = true;
-///
-///         worksheet.Cells["A1:E5"].AutoFitColumns(0);
-///
-///         // lets set the header text
-///         worksheet.HeaderFooter.oddHeader.CenteredText = "&amp;24&amp;U&amp;\"Arial,Regular Bold\" Inventory";
-///         // add the page number to the footer plus the total number of pages
-///         worksheet.HeaderFooter.oddFooter.RightAlignedText =
-///         string.Format("Page {0} of {1}", ExcelHeaderFooter.PageNumber, ExcelHeaderFooter.NumberOfPages);
-///         // add the sheet name to the footer
-///         worksheet.HeaderFooter.oddFooter.CenteredText = ExcelHeaderFooter.SheetName;
-///         // add the file path to the footer
-///         worksheet.HeaderFooter.oddFooter.LeftAlignedText = ExcelHeaderFooter.FilePath + ExcelHeaderFooter.FileName;
-///
-///         worksheet.PrinterSettings.RepeatRows = worksheet.Cells["1:2"];
-///         worksheet.PrinterSettings.RepeatColumns = worksheet.Cells["A:G"];
-///
-///          // Change the sheet view to show it in page layout mode
-///           worksheet.View.PageLayoutView = true;
-///
-///         // set some document properties
-///         package.Workbook.Properties.Title = "Invertory";
-///         package.Workbook.Properties.Author = "Jan K�llman";
-///         package.Workbook.Properties.Comments = "This sample demonstrates how to create an Excel 2007 workbook using EPPlus";
-///
-///         // set some extended property values
-///         package.Workbook.Properties.Company = "AdventureWorks Inc.";
-///
-///         // set some custom property values
-///         package.Workbook.Properties.SetCustomPropertyValue("Checked by", "Jan K�llman");
-///         package.Workbook.Properties.SetCustomPropertyValue("AssemblyName", "EPPlus");
-///
-///         // save our new workbook and we are done!
-///         package.Save();
-///
-///       }
-///
-///       return newFile.FullName;
-/// </code>
-/// More samples can be found at  <a href="http://epplus.codeplex.com/">http://epplus.codeplex.com/</a>
+/// Represents an Excel XLSX file package.
+/// This is the top-level object to access all parts of the document.\
 /// </summary>
 public sealed class ExcelPackage {
   internal const bool _preserveWhitespace = false;
@@ -232,7 +138,7 @@
   public const int MaxRows = 1048576;
 
   /// <summary>
-  /// Create a new instance of the ExcelPackage. Output is accessed through the Stream property.
+  /// Create a new, empty package.
   /// </summary>
   public ExcelPackage() {
     Package = new();
@@ -240,15 +146,14 @@
     _ = Workbook.WorkbookXml;
     // create the relationship to the main part
     Package.CreateRelationship(
-        UriHelper.GetRelativeUri(new("/xl", UriKind.Relative), Workbook.WorkbookUri),
+        UriHelper.GetRelativeUri(new("/xl", UriKind.Relative), ExcelWorkbook.WorkbookUri),
         TargetMode.Internal,
         _schemaRelationships + "/officeDocument");
   }
 
   /// <summary>
-  /// Create a new instance of the ExcelPackage class based on a existing file or creates a new file.
+  /// Create a new instance of the ExcelPackage class based on an existing file.
   /// </summary>
-  /// <param name="newFile">If newFile exists, it is opened.  Otherwise it is created from scratch.</param>
   public ExcelPackage(FileInfo newFile) {
     using var inputStream = newFile.OpenRead();
     Package = new(inputStream);
@@ -256,9 +161,8 @@
   }
 
   /// <summary>
-  /// Create a new instance of the ExcelPackage class based on a stream
+  /// Create a new instance of the ExcelPackage class based on a stream.
   /// </summary>
-  /// <param name="newStream">The stream object can be empty or contain a package. The stream must be Read/Write</param>
   public ExcelPackage(Stream newStream) {
     Package = new(newStream);
     Workbook = CreateWorkbook();
@@ -271,9 +175,6 @@
     return workbook;
   }
 
-  /// <summary>
-  /// Returns a reference to the package
-  /// </summary>
   internal ZipPackage Package { get; }
 
   /// <summary>
diff --git a/EPPlus/ExcelPrinterSettings.cs b/EPPlus/ExcelPrinterSettings.cs
index 17ed052..dcdb541 100644
--- a/EPPlus/ExcelPrinterSettings.cs
+++ b/EPPlus/ExcelPrinterSettings.cs
@@ -405,7 +405,7 @@
 /// Printer settings
 /// </summary>
 public sealed class ExcelPrinterSettings : XmlHelper {
-  private ExcelWorksheet _ws;
+  private readonly ExcelWorksheet _ws;
   private bool _marginsCreated;
 
   internal ExcelPrinterSettings(XmlNamespaceManager ns, XmlNode topNode, ExcelWorksheet ws)
diff --git a/EPPlus/ExcelProtectedRangeCollection.cs b/EPPlus/ExcelProtectedRangeCollection.cs
index 72afcc3..728a3e4 100644
--- a/EPPlus/ExcelProtectedRangeCollection.cs
+++ b/EPPlus/ExcelProtectedRangeCollection.cs
@@ -26,7 +26,7 @@
     }
   }
 
-  private List<ExcelProtectedRange> _baseList = new();
+  private readonly List<ExcelProtectedRange> _baseList = new();
 
   public ExcelProtectedRange Add(string name, ExcelAddress address) {
     if (!ExistNode("d:protectedRanges")) {
diff --git a/EPPlus/ExcelRangeBase.cs b/EPPlus/ExcelRangeBase.cs
index fd753d6..b94a638 100644
--- a/EPPlus/ExcelRangeBase.cs
+++ b/EPPlus/ExcelRangeBase.cs
@@ -104,8 +104,8 @@
   //}
 
 
-  internal ExcelRangeBase(ExcelWorksheet xlWorksheet) {
-    _worksheet = xlWorksheet;
+  internal ExcelRangeBase(ExcelWorksheet worksheet) {
+    _worksheet = worksheet;
     _ws = _worksheet.Name;
     _workbook = _worksheet.Workbook;
     AddressChange += ExcelRangeBase_AddressChange;
@@ -114,16 +114,16 @@
 
   private void ExcelRangeBase_AddressChange(object sender, EventArgs e) {
     if (Table != null) {
-      SetRcFromTable(_workbook._package, null);
+      SetRcFromTable(_workbook, null);
     }
     SetDelegate();
   }
 
-  internal ExcelRangeBase(ExcelWorksheet xlWorksheet, string address)
-      : base(xlWorksheet == null ? "" : xlWorksheet.Name, address) {
-    _worksheet = xlWorksheet;
-    _workbook = _worksheet.Workbook;
-    SetRcFromTable(_worksheet._package, null);
+  internal ExcelRangeBase(ExcelWorksheet worksheet, string address)
+      : base(worksheet == null ? "" : worksheet.Name, address) {
+    _worksheet = worksheet;
+    _workbook = worksheet.Workbook;
+    SetRcFromTable(_workbook, null);
     if (string.IsNullOrEmpty(_ws)) {
       _ws = _worksheet == null ? "" : _worksheet.Name;
     }
@@ -133,7 +133,7 @@
 
   internal ExcelRangeBase(ExcelWorkbook wb, ExcelWorksheet xlWorksheet, string address, bool isName)
       : base(xlWorksheet == null ? "" : xlWorksheet.Name, address, isName) {
-    SetRcFromTable(wb._package, null);
+    SetRcFromTable(wb, null);
     _worksheet = xlWorksheet;
     _workbook = wb;
     if (string.IsNullOrEmpty(_ws)) {
diff --git a/EPPlus/ExcelRow.cs b/EPPlus/ExcelRow.cs
index fbb0db3..3dfd422 100644
--- a/EPPlus/ExcelRow.cs
+++ b/EPPlus/ExcelRow.cs
@@ -64,8 +64,8 @@
 /// Represents an individual row in the spreadsheet.
 /// </summary>
 public class ExcelRow : IRangeId {
-  private ExcelWorksheet _worksheet;
-  private XmlElement _rowElement = null;
+  private readonly ExcelWorksheet _worksheet;
+  private readonly XmlElement _rowElement = null;
 
   /// <summary>
   /// Internal RowID.
diff --git a/EPPlus/ExcelStyleCollection.cs b/EPPlus/ExcelStyleCollection.cs
index 6ca76f9..2e2d203 100644
--- a/EPPlus/ExcelStyleCollection.cs
+++ b/EPPlus/ExcelStyleCollection.cs
@@ -47,7 +47,7 @@
     _setNextIdManual = false;
   }
 
-  private bool _setNextIdManual;
+  private readonly bool _setNextIdManual;
 
   public ExcelStyleCollection(bool setNextIdManual) {
     _setNextIdManual = setNextIdManual;
@@ -56,7 +56,7 @@
   public XmlNode TopNode { get; set; }
 
   internal List<T> _list = new();
-  private Dictionary<string, int> _dic = new(StringComparer.InvariantCultureIgnoreCase);
+  private readonly Dictionary<string, int> _dic = new(StringComparer.InvariantCultureIgnoreCase);
   internal int NextId;
 
   public IEnumerator<T> GetEnumerator() {
diff --git a/EPPlus/ExcelStyles.cs b/EPPlus/ExcelStyles.cs
index 086189d..8c786e0 100644
--- a/EPPlus/ExcelStyles.cs
+++ b/EPPlus/ExcelStyles.cs
@@ -55,9 +55,9 @@
   private const string _dxfsPath = "d:styleSheet/d:dxfs";
 
   //internal Dictionary<int, ExcelXfs> Styles = new Dictionary<int, ExcelXfs>();
-  private XmlDocument _styleXml;
-  private ExcelWorkbook _wb;
-  private XmlNamespaceManager _nameSpaceManager;
+  private readonly XmlDocument _styleXml;
+  private readonly ExcelWorkbook _wb;
+  private readonly XmlNamespaceManager _nameSpaceManager;
   internal int _nextDfxNumFmtID = 164;
 
   internal ExcelStyles(XmlNamespaceManager nameSpaceManager, XmlDocument xml, ExcelWorkbook wb)
diff --git a/EPPlus/ExcelWorkbook.cs b/EPPlus/ExcelWorkbook.cs
index ada35ea..3bc05dd 100644
--- a/EPPlus/ExcelWorkbook.cs
+++ b/EPPlus/ExcelWorkbook.cs
@@ -91,9 +91,6 @@
   internal ExcelWorkbook(ExcelPackage package, XmlNamespaceManager namespaceManager)
       : base(namespaceManager) {
     _package = package;
-    WorkbookUri = new("/xl/workbook.xml", UriKind.Relative);
-    SharedStringsUri = new("/xl/sharedStrings.xml", UriKind.Relative);
-    StylesUri = new("/xl/styles.xml", UriKind.Relative);
 
     _names = new(this);
     _namespaceManager = namespaceManager;
@@ -247,7 +244,7 @@
             //}
           }
         } else {
-          ExcelAddress addr = new ExcelAddress(fullAddress, _package, null);
+          ExcelAddress addr = new ExcelAddress(fullAddress, this, null);
           if (localSheetId > -1) {
             if (string.IsNullOrEmpty(addr._ws)) {
               namedRange = Worksheets[localSheetId + 1].Names.Add(
@@ -286,7 +283,7 @@
           sheetsNode = CreateNode("d:sheets");
         }
 
-        _worksheets = new(_package, _namespaceManager, sheetsNode);
+        _worksheets = new(_package, this, _namespaceManager, sheetsNode);
       }
       return (_worksheets);
     }
@@ -300,7 +297,7 @@
   internal FormulaParser FormulaParser {
     get {
       if (_formulaParser == null) {
-        _formulaParser = new(new EpplusExcelDataProvider(_package));
+        _formulaParser = new(new EpplusExcelDataProvider(this));
       }
       return _formulaParser;
     }
@@ -347,24 +344,22 @@
   /// <summary>
   /// URI to the workbook inside the package
   /// </summary>
-  internal Uri WorkbookUri { get; private set; }
+  internal static Uri WorkbookUri { get; } = new("/xl/workbook.xml", UriKind.Relative);
 
   /// <summary>
   /// URI to the styles inside the package
   /// </summary>
-  internal Uri StylesUri { get; private set; }
+  internal static Uri StylesUri { get; } = new("/xl/styles.xml", UriKind.Relative);
 
   /// <summary>
   /// URI to the shared strings inside the package
   /// </summary>
-  internal Uri SharedStringsUri { get; private set; }
+  internal static Uri SharedStringsUri { get; } = new("/xl/sharedStrings.xml", UriKind.Relative);
 
   /// <summary>
   /// Returns a reference to the workbook's part within the package
   /// </summary>
-  internal ZipPackagePart Part {
-    get { return (_package.Package.GetPart(WorkbookUri)); }
-  }
+  internal ZipPackagePart Part => (_package.Package.GetPart(WorkbookUri));
 
   private XmlDocument _workbookXml;
 
@@ -499,7 +494,7 @@
           //stream.Close();
 
           // create the relationship between the workbook and the new shared strings part
-          _package.Workbook.Part.CreateRelationship(
+          Part.CreateRelationship(
               UriHelper.GetRelativeUri(WorkbookUri, StylesUri),
               TargetMode.Internal,
               ExcelPackage._schemaRelationships + "/styles");
@@ -536,7 +531,7 @@
     }
   }
 
-  private string CALC_MODE_PATH = "d:calcPr/@calcMode";
+  private readonly string CALC_MODE_PATH = "d:calcPr/@calcMode";
 
   /// <summary>
   /// Calculation mode for the workbook.
@@ -648,9 +643,9 @@
     Uri uriCalcChain = new Uri("/xl/calcChain.xml", UriKind.Relative);
     if (_package.Package.PartExists(uriCalcChain)) {
       Uri calcChain = new Uri("calcChain.xml", UriKind.Relative);
-      foreach (var relationship in _package.Workbook.Part.GetRelationships()) {
+      foreach (var relationship in Part.GetRelationships()) {
         if (relationship.TargetUri == calcChain) {
-          _package.Workbook.Part.DeleteRelationship(relationship.Id);
+          Part.DeleteRelationship(relationship.Id);
           break;
         }
       }
@@ -660,7 +655,7 @@
   }
 
   private void ValidateDataValidations() {
-    foreach (var sheet in _package.Workbook.Worksheets) {
+    foreach (var sheet in Worksheets) {
       if (!(sheet is ExcelChartsheet)) {
         sheet.DataValidations.ValidateAll();
       }
diff --git a/EPPlus/ExcelWorksheet.cs b/EPPlus/ExcelWorksheet.cs
index 2579a7e..85a6ccd 100644
--- a/EPPlus/ExcelWorksheet.cs
+++ b/EPPlus/ExcelWorksheet.cs
@@ -88,13 +88,14 @@
   public ExcelChartsheet(
       XmlNamespaceManager ns,
       ExcelPackage pck,
+      ExcelWorkbook workbook,
       string relId,
       Uri uriWorksheet,
       string sheetName,
       int sheetId,
       int positionId,
       eWorkSheetHidden hidden)
-      : base(ns, pck, relId, uriWorksheet, sheetName, sheetId, positionId, hidden) {}
+      : base(ns, pck, workbook, relId, uriWorksheet, sheetName, sheetId, positionId, hidden) {}
 }
 
 /// <summary>
@@ -145,7 +146,7 @@
       return formula;
     }
 
-    private ISourceCodeTokenizer _tokenizer;
+    private readonly ISourceCodeTokenizer _tokenizer;
 
     internal int Index { get; set; }
 
@@ -190,7 +191,7 @@
     internal MergeCellsCollection() {}
 
     internal CellStore<int> _cells = new();
-    private List<string> _list = new();
+    private readonly List<string> _list = new();
 
     internal List<string> List => _list;
 
@@ -342,30 +343,21 @@
   internal int _minCol = ExcelPackage.MaxColumns;
   internal int _maxCol = 0;
 
-  internal ExcelPackage _package;
-  private Uri _worksheetUri;
+  internal readonly ExcelPackage _package;
+  private readonly ExcelWorkbook _workbook;
+  private readonly Uri _worksheetUri;
   private string _name;
-  private int _sheetID;
+  private readonly int _sheetID;
   private int _positionID;
-  private string _relationshipID;
+  private readonly string _relationshipID;
   private XmlDocument _worksheetXml;
-  internal ExcelWorksheetView _sheetView;
-  internal ExcelHeaderFooter _headerFooter;
+  private ExcelWorksheetView _sheetView;
+  private ExcelHeaderFooter _headerFooter;
 
-  /// <summary>
-  /// A worksheet
-  /// </summary>
-  /// <param name="ns">Namespacemanager</param>
-  /// <param name="excelPackage">Package</param>
-  /// <param name="relId">Relationship ID</param>
-  /// <param name="uriWorksheet">URI</param>
-  /// <param name="sheetName">Name of the sheet</param>
-  /// <param name="sheetId">Sheet id</param>
-  /// <param name="positionId">Position</param>
-  /// <param name="hide">hide</param>
-  public ExcelWorksheet(
+  internal ExcelWorksheet(
       XmlNamespaceManager ns,
       ExcelPackage excelPackage,
+      ExcelWorkbook workbook,
       string relId,
       Uri uriWorksheet,
       string sheetName,
@@ -373,6 +365,7 @@
       int positionId,
       eWorkSheetHidden hide)
       : base(ns, null) {
+    _workbook = workbook;
     SchemaNodeOrder = new[] {
       "sheetPr",
       "tabColor",
@@ -418,6 +411,7 @@
       "extLst",
     };
     _package = excelPackage;
+    _workbook = workbook;
     _relationshipID = relId;
     _worksheetUri = uriWorksheet;
     _name = sheetName;
@@ -525,14 +519,14 @@
       if (value == _name) {
         return;
       }
-      value = _package.Workbook.Worksheets.ValidateFixSheetName(value);
+      value = _workbook.Worksheets.ValidateFixSheetName(value);
       foreach (var ws in Workbook.Worksheets) {
         if (ws.PositionID != PositionID
             && ws.Name.Equals(value, StringComparison.InvariantCultureIgnoreCase)) {
           throw (new ArgumentException("Worksheet name must be unique"));
         }
       }
-      _package.Workbook.SetXmlNodeString(
+      _workbook.SetXmlNodeString(
           string.Format("d:sheets/d:sheet[@sheetId={0}]/@name", _sheetID),
           value);
       ChangeNames(value);
@@ -576,7 +570,7 @@
   /// </summary>
   public eWorkSheetHidden Hidden {
     get {
-      string state = _package.Workbook.GetXmlNodeString(
+      string state = _workbook.GetXmlNodeString(
           string.Format("d:sheets/d:sheet[@sheetId={0}]/@state", _sheetID));
       if (state == "hidden") {
         return eWorkSheetHidden.Hidden;
@@ -588,13 +582,12 @@
     }
     set {
       if (value == eWorkSheetHidden.Visible) {
-        _package.Workbook.DeleteNode(
-            string.Format("d:sheets/d:sheet[@sheetId={0}]/@state", _sheetID));
+        _workbook.DeleteNode(string.Format("d:sheets/d:sheet[@sheetId={0}]/@state", _sheetID));
       } else {
         string v;
         v = value.ToString();
         v = v.Substring(0, 1).ToLower(CultureInfo.InvariantCulture) + v.Substring(1);
-        _package.Workbook.SetXmlNodeString(
+        _workbook.SetXmlNodeString(
             string.Format("d:sheets/d:sheet[@sheetId={0}]/@state", _sheetID),
             v);
       }
@@ -1410,16 +1403,16 @@
                 "ReadElementContentAsInt returned value '{0}' which is less than zero.",
                 ix));
       }
-      if (ix >= _package.Workbook._sharedStringsList.Count) {
+      if (ix >= _workbook._sharedStringsList.Count) {
         throw new(
             string.Format(
                 "ReadElementContentAsInt returned index value '{0}' which is greater than _sharedStringsList count of {1}.",
                 ix,
-                _package.Workbook._sharedStringsList.Count));
+                _workbook._sharedStringsList.Count));
       }
 
-      _values.SetValue(row, col, _package.Workbook._sharedStringsList[ix].Text);
-      if (_package.Workbook._sharedStringsList[ix].isRichText) {
+      _values.SetValue(row, col, _workbook._sharedStringsList[ix].Text);
+      if (_workbook._sharedStringsList[ix].isRichText) {
         _flags.SetFlagValue(row, col, true, CellFlags.RichText);
       }
     } else if (type == "str") {
@@ -1521,8 +1514,6 @@
   //    return (retValue);
   //}
 
-
-
   /// <summary>
   /// A reference to the header and footer class which allows you to
   /// set the header and footer for all odd, even and first pages of the worksheet
@@ -1593,7 +1584,7 @@
     }
   }
 
-  private MergeCellsCollection _mergedCells = new();
+  private readonly MergeCellsCollection _mergedCells = new();
 
   /// <summary>
   /// Addresses to merged ranges
@@ -3179,7 +3170,7 @@
         first = false;
       }
       var col = cse.Value as ExcelColumn;
-      ExcelStyleCollection<ExcelXfs> cellXfs = _package.Workbook.Styles.CellXfs;
+      ExcelStyleCollection<ExcelXfs> cellXfs = _workbook.Styles.CellXfs;
 
       sw.Write("<col min=\"{0}\" max=\"{1}\"", col.ColumnMin, col.ColumnMax);
       if (col.Hidden) {
@@ -3227,13 +3218,13 @@
   /// Insert row and cells into the XML document
   /// </summary>
   private void UpdateRowCellData(StreamWriter sw) {
-    ExcelStyleCollection<ExcelXfs> cellXfs = _package.Workbook.Styles.CellXfs;
+    ExcelStyleCollection<ExcelXfs> cellXfs = _workbook.Styles.CellXfs;
 
     int row = -1;
 
     StringBuilder sbXml = new StringBuilder();
-    var ss = _package.Workbook._sharedStrings;
-    var styles = _package.Workbook.Styles;
+    var ss = _workbook._sharedStrings;
+    var styles = _workbook.Styles;
     var cache = new StringBuilder();
     cache.Append("<sheetData>");
 
@@ -3401,7 +3392,7 @@
   }
 
   private object GetFormulaValue(object v) {
-    //if (_package.Workbook._isCalculated)
+    //if (_workbook._isCalculated)
     //{
     if (v != null && v.ToString() != "") {
       return "<v>" + SecurityElement.Escape(GetValueForXml(v)) + "</v>"; //Fixes issue 15071
@@ -3772,7 +3763,7 @@
   /// <summary>
   /// The workbook object
   /// </summary>
-  public ExcelWorkbook Workbook => _package.Workbook;
+  public ExcelWorkbook Workbook => _workbook;
 
   /// <summary>
   /// Get the next ID from a shared formula or an Array formula
diff --git a/EPPlus/ExcelWorksheetView.cs b/EPPlus/ExcelWorksheetView.cs
index c3047a2..03303b8 100644
--- a/EPPlus/ExcelWorksheetView.cs
+++ b/EPPlus/ExcelWorksheetView.cs
@@ -119,7 +119,7 @@
     }
   }
 
-  private ExcelWorksheet _worksheet;
+  private readonly ExcelWorksheet _worksheet;
 
   /// <summary>
   /// Creates a new ExcelWorksheetView which provides access to all the view states of the worksheet.
@@ -193,7 +193,7 @@
     set {
       if (value) {
         //    // ensure no other worksheet has its tabSelected attribute set to 1
-        foreach (ExcelWorksheet sheet in _worksheet._package.Workbook.Worksheets) {
+        foreach (ExcelWorksheet sheet in _worksheet.Workbook.Worksheets) {
           sheet.View.TabSelected = false;
         }
 
@@ -286,8 +286,8 @@
   /// </summary>
   public ExcelWorksheetPanes[] Panes { get; internal set; }
 
-  private string _paneNodePath = "d:pane";
-  private string _selectionNodePath = "d:selection";
+  private readonly string _paneNodePath = "d:pane";
+  private readonly string _selectionNodePath = "d:selection";
 
   /// <summary>
   /// Freeze the columns/rows to left and above the cell
diff --git a/EPPlus/ExcelWorksheets.cs b/EPPlus/ExcelWorksheets.cs
index 91e3cdb..dd56dab 100644
--- a/EPPlus/ExcelWorksheets.cs
+++ b/EPPlus/ExcelWorksheets.cs
@@ -45,13 +45,19 @@
 /// The collection of worksheets for the workbook
 /// </summary>
 public class ExcelWorksheets : XmlHelper, IEnumerable<ExcelWorksheet> {
-  private ExcelPackage _pck;
+  private readonly ExcelPackage _pck;
+  private readonly ExcelWorkbook _workbook;
   private Dictionary<int, ExcelWorksheet> _worksheets;
-  private XmlNamespaceManager _namespaceManager;
+  private readonly XmlNamespaceManager _namespaceManager;
 
-  internal ExcelWorksheets(ExcelPackage pck, XmlNamespaceManager nsm, XmlNode topNode)
+  internal ExcelWorksheets(
+      ExcelPackage pck,
+      ExcelWorkbook workbook,
+      XmlNamespaceManager nsm,
+      XmlNode topNode)
       : base(nsm, topNode) {
     _pck = pck;
+    _workbook = workbook;
     _namespaceManager = nsm;
     _worksheets = new();
     int positionId = 1;
@@ -70,9 +76,9 @@
           hidden = TranslateHidden(attr.Value);
         }
 
-        var sheetRelation = pck.Workbook.Part.GetRelationship(relId);
+        var sheetRelation = _workbook.Part.GetRelationship(relId);
         Uri uriWorksheet = UriHelper.ResolvePartUri(
-            pck.Workbook.WorkbookUri,
+            ExcelWorkbook.WorkbookUri,
             sheetRelation.TargetUri);
 
         //add the worksheet
@@ -81,7 +87,8 @@
               positionId,
               new ExcelChartsheet(
                   _namespaceManager,
-                  _pck,
+                  pck,
+                  _workbook,
                   relId,
                   uriWorksheet,
                   name,
@@ -91,7 +98,16 @@
         } else {
           _worksheets.Add(
               positionId,
-              new(_namespaceManager, _pck, relId, uriWorksheet, name, sheetId, positionId, hidden));
+              new(
+                  _namespaceManager,
+                  pck,
+                  _workbook,
+                  relId,
+                  uriWorksheet,
+                  name,
+                  sheetId,
+                  positionId,
+                  hidden));
         }
         positionId++;
       }
@@ -116,10 +132,8 @@
 
   private const string _errDupWorksheet =
       "A worksheet with this name already exists in the workbook";
-  internal const string _worksheetContenttype =
+  internal const string _worksheetContentType =
       "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml";
-  internal const string _chartsheetContenttype =
-      "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml";
 
   /// <summary>
   /// Foreach support
@@ -148,7 +162,7 @@
       GetSheetUri(ref name, out sheetId, out uriWorksheet, false);
       ZipPackagePart worksheetPart = _pck.Package.CreatePart(
           uriWorksheet,
-          _worksheetContenttype,
+          _worksheetContentType,
           _pck.Compression);
 
       //Create the new, empty worksheet and save it to the package
@@ -166,6 +180,7 @@
         worksheet = new(
             _namespaceManager,
             _pck,
+            _workbook,
             rel,
             uriWorksheet,
             name,
@@ -181,13 +196,13 @@
 
   private string CreateWorkbookRel(string name, int sheetId, Uri uriWorksheet, bool isChart) {
     //Create the relationship between the workbook and the new worksheet
-    var rel = _pck.Workbook.Part.CreateRelationship(
-        UriHelper.GetRelativeUri(_pck.Workbook.WorkbookUri, uriWorksheet),
+    var rel = _workbook.Part.CreateRelationship(
+        UriHelper.GetRelativeUri(ExcelWorkbook.WorkbookUri, uriWorksheet),
         TargetMode.Internal,
         ExcelPackage._schemaRelationships + "/" + (isChart ? "chartsheet" : "worksheet"));
 
     //Create the new sheet node
-    XmlElement worksheetNode = _pck.Workbook.WorkbookXml.CreateElement(
+    XmlElement worksheetNode = _workbook.WorkbookXml.CreateElement(
         "sheet",
         ExcelPackage._schemaMain);
     worksheetNode.SetAttribute("name", name);
diff --git a/EPPlus/FormulaParsing/DependencyChain/DependenyChainFactory.cs b/EPPlus/FormulaParsing/DependencyChain/DependenyChainFactory.cs
index bd3bbd9..009a8e5 100644
--- a/EPPlus/FormulaParsing/DependencyChain/DependenyChainFactory.cs
+++ b/EPPlus/FormulaParsing/DependencyChain/DependenyChainFactory.cs
@@ -203,7 +203,7 @@
       if (t.TokenType == TokenType.ExcelAddress) {
         var adr = new ExcelFormulaAddress(t.Value);
         if (adr.Table != null) {
-          adr.SetRcFromTable(ws._package, new(f.Row, f.Column, f.Row, f.Column));
+          adr.SetRcFromTable(ws.Workbook, new(f.Row, f.Column, f.Row, f.Column));
         }
 
         if (adr.WorkSheet == null
diff --git a/EPPlus/FormulaParsing/EpplusExcelDataProvider.cs b/EPPlus/FormulaParsing/EpplusExcelDataProvider.cs
index 85d297a..0783dcc 100644
--- a/EPPlus/FormulaParsing/EpplusExcelDataProvider.cs
+++ b/EPPlus/FormulaParsing/EpplusExcelDataProvider.cs
@@ -11,14 +11,14 @@
 public class EpplusExcelDataProvider : ExcelDataProvider {
   public class RangeInfo : IRangeInfo {
     internal ExcelWorksheet _ws;
-    private CellsStoreEnumerator<object> _values;
-    private int _fromRow,
-        _toRow,
-        _fromCol,
-        _toCol;
+    private readonly CellsStoreEnumerator<object> _values;
+    private readonly int _fromRow;
+    private readonly int _toRow;
+    private readonly int _fromCol;
+    private readonly int _toCol;
     private int _cellCount;
-    private ExcelAddressBase _address;
-    private ICellInfo _cell;
+    private readonly ExcelAddressBase _address;
+    private readonly ICellInfo _cell;
 
     public RangeInfo(ExcelWorksheet ws, int fromRow, int fromCol, int toRow, int toCol) {
       _ws = ws;
@@ -118,8 +118,8 @@
   }
 
   public class CellInfo : ICellInfo {
-    private ExcelWorksheet _ws;
-    private CellsStoreEnumerator<object> _values;
+    private readonly ExcelWorksheet _ws;
+    private readonly CellsStoreEnumerator<object> _values;
 
     internal CellInfo(ExcelWorksheet ws, CellsStoreEnumerator<object> values) {
       _ws = ws;
@@ -169,19 +169,16 @@
     public object Value { get; set; }
   }
 
-  private readonly ExcelPackage _package;
+  private readonly ExcelWorkbook _workbook;
   private ExcelWorksheet _currentWorksheet;
-  private RangeAddressFactory _rangeAddressFactory;
   private Dictionary<ulong, INameInfo> _names = new();
 
-  public EpplusExcelDataProvider(ExcelPackage package) {
-    _package = package;
-
-    _rangeAddressFactory = new(this);
+  public EpplusExcelDataProvider(ExcelWorkbook workbook) {
+    _workbook = workbook;
   }
 
   public override ExcelNamedRangeCollection GetWorksheetNames(string worksheet) {
-    var ws = _package.Workbook.Worksheets[worksheet];
+    var ws = _workbook.Worksheets[worksheet];
     if (ws != null) {
       return ws.Names;
     }
@@ -189,7 +186,7 @@
   }
 
   public override ExcelNamedRangeCollection GetWorkbookNameValues() {
-    return _package.Workbook.Names;
+    return _workbook.Names;
   }
 
   public override IRangeInfo GetRange(
@@ -200,18 +197,18 @@
       int toCol) {
     SetCurrentWorksheet(worksheet);
     var wsName = string.IsNullOrEmpty(worksheet) ? _currentWorksheet.Name : worksheet;
-    var ws = _package.Workbook.Worksheets[wsName];
+    var ws = _workbook.Worksheets[wsName];
     return new RangeInfo(ws, fromRow, fromCol, toRow, toCol);
   }
 
   public override IRangeInfo GetRange(string worksheet, int row, int column, string address) {
     var addr = new ExcelAddress(worksheet, address);
     if (addr.Table != null) {
-      addr.SetRcFromTable(_package, new(row, column, row, column));
+      addr.SetRcFromTable(_workbook, new(row, column, row, column));
     }
     //SetCurrentWorksheet(addr.WorkSheet);
     var wsName = string.IsNullOrEmpty(addr.WorkSheet) ? _currentWorksheet.Name : addr.WorkSheet;
-    var ws = _package.Workbook.Worksheets[wsName];
+    var ws = _workbook.Worksheets[wsName];
     //return new CellsStoreEnumerator<object>(ws._values, addr._fromRow, addr._fromCol, addr._toRow, addr._toCol);
     return new RangeInfo(ws, addr._fromRow, addr._fromCol, addr._toRow, addr._toCol);
   }
@@ -221,18 +218,18 @@
     ulong id;
     ExcelWorksheet ws;
     if (string.IsNullOrEmpty(worksheet)) {
-      if (_package.Workbook.Names.ContainsKey(name)) {
-        nameItem = _package.Workbook.Names[name];
+      if (_workbook.Names.ContainsKey(name)) {
+        nameItem = _workbook.Names[name];
       } else {
         return null;
       }
       ws = null;
     } else {
-      ws = _package.Workbook.Worksheets[worksheet];
+      ws = _workbook.Worksheets[worksheet];
       if (ws != null && ws.Names.ContainsKey(name)) {
         nameItem = ws.Names[name];
-      } else if (_package.Workbook.Names.ContainsKey(name)) {
-        nameItem = _package.Workbook.Names[name];
+      } else if (_workbook.Names.ContainsKey(name)) {
+        nameItem = _workbook.Names[name];
       } else {
         return null;
       }
@@ -266,7 +263,7 @@
     SetCurrentWorksheet(ExcelAddressInfo.Parse(address));
     var addr = new ExcelAddress(address);
     var wsName = string.IsNullOrEmpty(addr.WorkSheet) ? _currentWorksheet.Name : addr.WorkSheet;
-    var ws = _package.Workbook.Worksheets[wsName];
+    var ws = _workbook.Worksheets[wsName];
     return (new CellsStoreEnumerator<object>(
             ws._values,
             addr._fromRow,
@@ -299,7 +296,7 @@
   public override ExcelCellAddress GetDimensionEnd(string worksheet) {
     ExcelCellAddress address = null;
     try {
-      address = _package.Workbook.Worksheets[worksheet].Dimension.End;
+      address = _workbook.Worksheets[worksheet].Dimension.End;
     } catch {}
 
     return address;
@@ -307,17 +304,17 @@
 
   private void SetCurrentWorksheet(ExcelAddressInfo addressInfo) {
     if (addressInfo.WorksheetIsSpecified) {
-      _currentWorksheet = _package.Workbook.Worksheets[addressInfo.Worksheet];
+      _currentWorksheet = _workbook.Worksheets[addressInfo.Worksheet];
     } else if (_currentWorksheet == null) {
-      _currentWorksheet = _package.Workbook.Worksheets.First();
+      _currentWorksheet = _workbook.Worksheets.First();
     }
   }
 
   private void SetCurrentWorksheet(string worksheetName) {
     if (!string.IsNullOrEmpty(worksheetName)) {
-      _currentWorksheet = _package.Workbook.Worksheets[worksheetName];
+      _currentWorksheet = _workbook.Worksheets[worksheetName];
     } else {
-      _currentWorksheet = _package.Workbook.Worksheets.First();
+      _currentWorksheet = _workbook.Worksheets.First();
     }
   }
 
@@ -336,7 +333,7 @@
   }
 
   public override string GetFormat(object value, string format) {
-    var styles = _package.Workbook.Styles;
+    var styles = _workbook.Styles;
     ExcelNumberFormatXml.ExcelFormatTranslator ft = null;
     foreach (var f in styles.NumberFormats) {
       if (f.Format == format) {
@@ -351,13 +348,13 @@
   }
 
   public override List<Token> GetRangeFormulaTokens(string worksheetName, int row, int column) {
-    return _package.Workbook.Worksheets[worksheetName]._formulaTokens.GetValue(row, column);
+    return _workbook.Worksheets[worksheetName]._formulaTokens.GetValue(row, column);
   }
 
   public override bool IsRowHidden(string worksheetName, int row) {
     var b =
-        _package.Workbook.Worksheets[worksheetName].Row(row).Height == 0
-            || _package.Workbook.Worksheets[worksheetName].Row(row).Hidden;
+        _workbook.Worksheets[worksheetName].Row(row).Height == 0
+            || _workbook.Worksheets[worksheetName].Row(row).Hidden;
 
     return b;
   }
diff --git a/EPPlus/FormulaParsing/EpplusNameValueProvider.cs b/EPPlus/FormulaParsing/EpplusNameValueProvider.cs
index 60becec..65b9db3 100644
--- a/EPPlus/FormulaParsing/EpplusNameValueProvider.cs
+++ b/EPPlus/FormulaParsing/EpplusNameValueProvider.cs
@@ -1,7 +1,7 @@
 ﻿namespace OfficeOpenXml.FormulaParsing;
 
 public class EpplusNameValueProvider : INameValueProvider {
-  private ExcelDataProvider _excelDataProvider;
+  private readonly ExcelDataProvider _excelDataProvider;
   private ExcelNamedRangeCollection _values;
 
   public EpplusNameValueProvider(ExcelDataProvider excelDataProvider) {
diff --git a/EPPlus/FormulaParsing/Excel/Functions/ArgumentParsers.cs b/EPPlus/FormulaParsing/Excel/Functions/ArgumentParsers.cs
index 1c4d10e..86f9d5c 100644
--- a/EPPlus/FormulaParsing/Excel/Functions/ArgumentParsers.cs
+++ b/EPPlus/FormulaParsing/Excel/Functions/ArgumentParsers.cs
@@ -30,7 +30,7 @@
 namespace OfficeOpenXml.FormulaParsing.Excel.Functions;
 
 public class ArgumentParsers {
-  private static object _syncRoot = new();
+  private static readonly object _syncRoot = new();
   private readonly Dictionary<DataType, ArgumentParser> _parsers = new();
   private readonly ArgumentParserFactory _parserFactory;
 
diff --git a/EPPlus/FormulaParsing/Excel/Functions/Database/ExcelDatabaseRow.cs b/EPPlus/FormulaParsing/Excel/Functions/Database/ExcelDatabaseRow.cs
index 7b694cf..e3c9a12 100644
--- a/EPPlus/FormulaParsing/Excel/Functions/Database/ExcelDatabaseRow.cs
+++ b/EPPlus/FormulaParsing/Excel/Functions/Database/ExcelDatabaseRow.cs
@@ -28,7 +28,7 @@
 namespace OfficeOpenXml.FormulaParsing.Excel.Functions.Database;
 
 public class ExcelDatabaseRow {
-  private Dictionary<int, string> _fieldIndexes = new();
+  private readonly Dictionary<int, string> _fieldIndexes = new();
   private readonly Dictionary<string, object> _items = new();
   private int _colIndex = 1;
 
diff --git a/EPPlus/FormulaParsing/Excel/Functions/DateTime/Weekday.cs b/EPPlus/FormulaParsing/Excel/Functions/DateTime/Weekday.cs
index 533ce2a..cf1af33 100644
--- a/EPPlus/FormulaParsing/Excel/Functions/DateTime/Weekday.cs
+++ b/EPPlus/FormulaParsing/Excel/Functions/DateTime/Weekday.cs
@@ -42,9 +42,9 @@
         DataType.Integer);
   }
 
-  private static List<int> _oneBasedStartOnSunday = new() { 1, 2, 3, 4, 5, 6, 7 };
-  private static List<int> _oneBasedStartOnMonday = new() { 7, 1, 2, 3, 4, 5, 6 };
-  private static List<int> _zeroBasedStartOnSunday = new() { 6, 0, 1, 2, 3, 4, 5 };
+  private static readonly List<int> _oneBasedStartOnSunday = new() { 1, 2, 3, 4, 5, 6, 7 };
+  private static readonly List<int> _oneBasedStartOnMonday = new() { 7, 1, 2, 3, 4, 5, 6 };
+  private static readonly List<int> _zeroBasedStartOnSunday = new() { 6, 0, 1, 2, 3, 4, 5 };
 
   private int CalculateDayOfWeek(System.DateTime dateTime, int returnType) {
     var dayIx = (int)dateTime.DayOfWeek;
diff --git a/EPPlus/FormulaParsing/Excel/Functions/FunctionRepository.cs b/EPPlus/FormulaParsing/Excel/Functions/FunctionRepository.cs
index 42d7f0b..fe09617 100644
--- a/EPPlus/FormulaParsing/Excel/Functions/FunctionRepository.cs
+++ b/EPPlus/FormulaParsing/Excel/Functions/FunctionRepository.cs
@@ -52,7 +52,8 @@
 /// This class provides methods for accessing/modifying VBA Functions.
 /// </summary>
 public class FunctionRepository : IFunctionNameProvider {
-  private Dictionary<string, ExcelFunction> _functions = new(StringComparer.InvariantCulture);
+  private readonly Dictionary<string, ExcelFunction> _functions = new(
+      StringComparer.InvariantCulture);
 
   private FunctionRepository() {}
 
diff --git a/EPPlus/FormulaParsing/Excel/Functions/Math/Subtotal.cs b/EPPlus/FormulaParsing/Excel/Functions/Math/Subtotal.cs
index 45e11e6..cc82beb 100644
--- a/EPPlus/FormulaParsing/Excel/Functions/Math/Subtotal.cs
+++ b/EPPlus/FormulaParsing/Excel/Functions/Math/Subtotal.cs
@@ -30,7 +30,7 @@
 namespace OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
 
 public class Subtotal : ExcelFunction {
-  private Dictionary<int, HiddenValuesHandlingFunction> _functions = new();
+  private readonly Dictionary<int, HiddenValuesHandlingFunction> _functions = new();
 
   public Subtotal() {
     Initialize();
diff --git a/EPPlus/FormulaParsing/ExcelUtilities/ExcelAddressUtil.cs b/EPPlus/FormulaParsing/ExcelUtilities/ExcelAddressUtil.cs
index 75ad665..03373ce 100644
--- a/EPPlus/FormulaParsing/ExcelUtilities/ExcelAddressUtil.cs
+++ b/EPPlus/FormulaParsing/ExcelUtilities/ExcelAddressUtil.cs
@@ -32,7 +32,7 @@
 namespace OfficeOpenXml.FormulaParsing.ExcelUtilities;
 
 public static class ExcelAddressUtil {
-  private static char[] SheetNameInvalidChars = { '?', ':', '*', '/', '\\' };
+  private static readonly char[] SheetNameInvalidChars = { '?', ':', '*', '/', '\\' };
 
   public static bool IsValidAddress(string token) {
     int ix;
diff --git a/EPPlus/FormulaParsing/ExcelUtilities/FormulaDependency.cs b/EPPlus/FormulaParsing/ExcelUtilities/FormulaDependency.cs
index c337019..d46fca9 100644
--- a/EPPlus/FormulaParsing/ExcelUtilities/FormulaDependency.cs
+++ b/EPPlus/FormulaParsing/ExcelUtilities/FormulaDependency.cs
@@ -45,9 +45,9 @@
 
   public RangeAddress Address { get; private set; }
 
-  private List<RangeAddress> _referencedBy = new();
+  private readonly List<RangeAddress> _referencedBy = new();
 
-  private List<RangeAddress> _references = new();
+  private readonly List<RangeAddress> _references = new();
 
   public virtual void AddReferenceFrom(RangeAddress rangeAddress) {
     if (Address.CollidesWith(rangeAddress)
diff --git a/EPPlus/FormulaParsing/ExcelUtilities/NumericExpressionEvaluator.cs b/EPPlus/FormulaParsing/ExcelUtilities/NumericExpressionEvaluator.cs
index 31b6f2a..6e326a7 100644
--- a/EPPlus/FormulaParsing/ExcelUtilities/NumericExpressionEvaluator.cs
+++ b/EPPlus/FormulaParsing/ExcelUtilities/NumericExpressionEvaluator.cs
@@ -37,8 +37,8 @@
 namespace OfficeOpenXml.FormulaParsing.ExcelUtilities;
 
 public class NumericExpressionEvaluator {
-  private ValueMatcher _valueMatcher;
-  private CompileResultFactory _compileResultFactory;
+  private readonly ValueMatcher _valueMatcher;
+  private readonly CompileResultFactory _compileResultFactory;
 
   public NumericExpressionEvaluator()
       : this(new(), new()) {}
diff --git a/EPPlus/FormulaParsing/ExcelUtilities/RangeAddress.cs b/EPPlus/FormulaParsing/ExcelUtilities/RangeAddress.cs
index 5a19ff9..cf62744 100644
--- a/EPPlus/FormulaParsing/ExcelUtilities/RangeAddress.cs
+++ b/EPPlus/FormulaParsing/ExcelUtilities/RangeAddress.cs
@@ -52,7 +52,7 @@
     return Address;
   }
 
-  private static RangeAddress _empty = new();
+  private static readonly RangeAddress _empty = new();
 
   public static RangeAddress Empty => _empty;
 
diff --git a/EPPlus/FormulaParsing/ExcelValues.cs b/EPPlus/FormulaParsing/ExcelValues.cs
index d8fceeb..e4d860b 100644
--- a/EPPlus/FormulaParsing/ExcelValues.cs
+++ b/EPPlus/FormulaParsing/ExcelValues.cs
@@ -75,7 +75,7 @@
     public const string Error = "#ERROR!"; // Bug G0004
     public const string ErrorValueIsNullOrEmpty = "#ERRORVALUEISNULLOREMPTY!"; // Bug G0005
 
-    private static Dictionary<string, eErrorType> _values = new() {
+    private static readonly Dictionary<string, eErrorType> _values = new() {
       { Div0, eErrorType.Div0 },
       { Na, eErrorType.Na },
       { Name, eErrorType.Name },
diff --git a/EPPlus/FormulaParsing/ExpressionGraph/BooleanExpression.cs b/EPPlus/FormulaParsing/ExpressionGraph/BooleanExpression.cs
index dce6b0f..e61bdf6 100644
--- a/EPPlus/FormulaParsing/ExpressionGraph/BooleanExpression.cs
+++ b/EPPlus/FormulaParsing/ExpressionGraph/BooleanExpression.cs
@@ -32,7 +32,7 @@
 namespace OfficeOpenXml.FormulaParsing.ExpressionGraph;
 
 public class BooleanExpression : AtomicExpression {
-  private bool? _precompiledValue;
+  private readonly bool? _precompiledValue;
 
   public BooleanExpression(string expression)
       : base(expression) {}
diff --git a/EPPlus/FormulaParsing/ExpressionGraph/CompileResult.cs b/EPPlus/FormulaParsing/ExpressionGraph/CompileResult.cs
index 1014610..9535d05 100644
--- a/EPPlus/FormulaParsing/ExpressionGraph/CompileResult.cs
+++ b/EPPlus/FormulaParsing/ExpressionGraph/CompileResult.cs
@@ -37,7 +37,7 @@
 namespace OfficeOpenXml.FormulaParsing.ExpressionGraph;
 
 public class CompileResult {
-  private static CompileResult _empty = new(null, DataType.Empty);
+  private static readonly CompileResult _empty = new(null, DataType.Empty);
 
   public static CompileResult Empty => _empty;
 
diff --git a/EPPlus/FormulaParsing/ExpressionGraph/ExcelErrorExpression.cs b/EPPlus/FormulaParsing/ExpressionGraph/ExcelErrorExpression.cs
index fcf4ddd..44770f8 100644
--- a/EPPlus/FormulaParsing/ExpressionGraph/ExcelErrorExpression.cs
+++ b/EPPlus/FormulaParsing/ExpressionGraph/ExcelErrorExpression.cs
@@ -32,7 +32,7 @@
 namespace OfficeOpenXml.FormulaParsing.ExpressionGraph;
 
 public class ExcelErrorExpression : Expression {
-  private ExcelErrorValue _error;
+  private readonly ExcelErrorValue _error;
 
   public ExcelErrorExpression(string expression, ExcelErrorValue error)
       : base(expression) {
diff --git a/EPPlus/FormulaParsing/ExpressionGraph/ExpressionCompiler.cs b/EPPlus/FormulaParsing/ExpressionGraph/ExpressionCompiler.cs
index 49a4ecf..e29c4f2 100644
--- a/EPPlus/FormulaParsing/ExpressionGraph/ExpressionCompiler.cs
+++ b/EPPlus/FormulaParsing/ExpressionGraph/ExpressionCompiler.cs
@@ -37,8 +37,8 @@
 
 public class ExpressionCompiler : IExpressionCompiler {
   private IEnumerable<Expression> _expressions;
-  private IExpressionConverter _expressionConverter;
-  private ICompileStrategyFactory _compileStrategyFactory;
+  private readonly IExpressionConverter _expressionConverter;
+  private readonly ICompileStrategyFactory _compileStrategyFactory;
 
   public ExpressionCompiler()
       : this(new ExpressionConverter(), new CompileStrategyFactory()) {}
diff --git a/EPPlus/FormulaParsing/ExpressionGraph/ExpressionGraph.cs b/EPPlus/FormulaParsing/ExpressionGraph/ExpressionGraph.cs
index d9388aa..98fe430 100644
--- a/EPPlus/FormulaParsing/ExpressionGraph/ExpressionGraph.cs
+++ b/EPPlus/FormulaParsing/ExpressionGraph/ExpressionGraph.cs
@@ -34,7 +34,7 @@
 namespace OfficeOpenXml.FormulaParsing.ExpressionGraph;
 
 public class ExpressionGraph {
-  private List<Expression> _expressions = new();
+  private readonly List<Expression> _expressions = new();
 
   public IEnumerable<Expression> Expressions => _expressions;
 
diff --git a/EPPlus/FormulaParsing/LexicalAnalysis/TokenizerContext.cs b/EPPlus/FormulaParsing/LexicalAnalysis/TokenizerContext.cs
index e87ac14..34fc6f2 100644
--- a/EPPlus/FormulaParsing/LexicalAnalysis/TokenizerContext.cs
+++ b/EPPlus/FormulaParsing/LexicalAnalysis/TokenizerContext.cs
@@ -44,8 +44,8 @@
     _currentToken = new();
   }
 
-  private char[] _chars;
-  private List<Token> _result;
+  private readonly char[] _chars;
+  private readonly List<Token> _result;
   private StringBuilder _currentToken;
 
   public char[] FormulaChars => _chars;
diff --git a/EPPlus/FormulaParsing/ParsingScopes.cs b/EPPlus/FormulaParsing/ParsingScopes.cs
index 51d7bad..66ef836 100644
--- a/EPPlus/FormulaParsing/ParsingScopes.cs
+++ b/EPPlus/FormulaParsing/ParsingScopes.cs
@@ -15,7 +15,7 @@
     _lifetimeEventHandler = lifetimeEventHandler;
   }
 
-  private Stack<ParsingScope> _scopes = new();
+  private readonly Stack<ParsingScope> _scopes = new();
 
   /// <summary>
   /// Creates a new <see cref="ParsingScope"/> and puts it on top of the stack.
diff --git a/EPPlus/OfficeProperties.cs b/EPPlus/OfficeProperties.cs
index 62df7e5..d18b047 100644
--- a/EPPlus/OfficeProperties.cs
+++ b/EPPlus/OfficeProperties.cs
@@ -49,14 +49,14 @@
   private XmlDocument _xmlPropertiesExtended;
   private XmlDocument _xmlPropertiesCustom;
 
-  private Uri _uriPropertiesCore = new("/docProps/core.xml", UriKind.Relative);
-  private Uri _uriPropertiesExtended = new("/docProps/app.xml", UriKind.Relative);
-  private Uri _uriPropertiesCustom = new("/docProps/custom.xml", UriKind.Relative);
+  private readonly Uri _uriPropertiesCore = new("/docProps/core.xml", UriKind.Relative);
+  private readonly Uri _uriPropertiesExtended = new("/docProps/app.xml", UriKind.Relative);
+  private readonly Uri _uriPropertiesCustom = new("/docProps/custom.xml", UriKind.Relative);
 
-  private XmlHelper _coreHelper;
-  private XmlHelper _extendedHelper;
+  private readonly XmlHelper _coreHelper;
+  private readonly XmlHelper _extendedHelper;
   private XmlHelper _customHelper;
-  private ExcelPackage _package;
+  private readonly ExcelPackage _package;
 
   /// <summary>
   /// Provides access to all the office document properties.
diff --git a/EPPlus/Packaging/ZipPackage.cs b/EPPlus/Packaging/ZipPackage.cs
index 4dbed56..843d105 100644
--- a/EPPlus/Packaging/ZipPackage.cs
+++ b/EPPlus/Packaging/ZipPackage.cs
@@ -72,7 +72,8 @@
     }
   }
 
-  private Dictionary<string, ZipPackagePart> Parts = new(StringComparer.InvariantCultureIgnoreCase);
+  private readonly Dictionary<string, ZipPackagePart> Parts = new(
+      StringComparer.InvariantCultureIgnoreCase);
   internal Dictionary<string, ContentType> _contentTypes = new(
       StringComparer.InvariantCultureIgnoreCase);
 
diff --git a/EPPlus/Style/Dxf/ExcelDxfStyle.cs b/EPPlus/Style/Dxf/ExcelDxfStyle.cs
index 4cb8bba..7180b21 100644
--- a/EPPlus/Style/Dxf/ExcelDxfStyle.cs
+++ b/EPPlus/Style/Dxf/ExcelDxfStyle.cs
@@ -6,7 +6,7 @@
 namespace OfficeOpenXml.Style.Dxf;
 
 public class ExcelDxfStyleConditionalFormatting : DxfStyleBase<ExcelDxfStyleConditionalFormatting> {
-  private XmlHelperInstance _helper;
+  private readonly XmlHelperInstance _helper;
 
   internal ExcelDxfStyleConditionalFormatting(
       XmlNamespaceManager nameSpaceManager,
diff --git a/EPPlus/Style/ExcelBorderItem.cs b/EPPlus/Style/ExcelBorderItem.cs
index f46f55a..7708ab9 100644
--- a/EPPlus/Style/ExcelBorderItem.cs
+++ b/EPPlus/Style/ExcelBorderItem.cs
@@ -39,8 +39,8 @@
 /// Cell border style
 /// </summary>
 public sealed class ExcelBorderItem : StyleBase {
-  private eStyleClass _cls;
-  private StyleBase _parent;
+  private readonly eStyleClass _cls;
+  private readonly StyleBase _parent;
 
   internal ExcelBorderItem(
       ExcelStyles styles,
diff --git a/EPPlus/Style/ExcelColor.cs b/EPPlus/Style/ExcelColor.cs
index 935f78e..e673510 100644
--- a/EPPlus/Style/ExcelColor.cs
+++ b/EPPlus/Style/ExcelColor.cs
@@ -40,8 +40,8 @@
 /// Color for cellstyling
 /// </summary>
 public sealed class ExcelColor : StyleBase {
-  private eStyleClass _cls;
-  private StyleBase _parent;
+  private readonly eStyleClass _cls;
+  private readonly StyleBase _parent;
 
   internal ExcelColor(
       ExcelStyles styles,
diff --git a/EPPlus/Style/ExcelParagraphCollection.cs b/EPPlus/Style/ExcelParagraphCollection.cs
index 8c96724..784c4cc 100644
--- a/EPPlus/Style/ExcelParagraphCollection.cs
+++ b/EPPlus/Style/ExcelParagraphCollection.cs
@@ -41,8 +41,8 @@
 /// A collection of Paragraph objects
 /// </summary>
 public class ExcelParagraphCollection : XmlHelper, IEnumerable<ExcelParagraph> {
-  private List<ExcelParagraph> _list = new();
-  private string _path;
+  private readonly List<ExcelParagraph> _list = new();
+  private readonly string _path;
 
   internal ExcelParagraphCollection(
       XmlNamespaceManager ns,
diff --git a/EPPlus/Style/ExcelRichTextCollection.cs b/EPPlus/Style/ExcelRichTextCollection.cs
index 496431d..0f4e29d 100644
--- a/EPPlus/Style/ExcelRichTextCollection.cs
+++ b/EPPlus/Style/ExcelRichTextCollection.cs
@@ -44,8 +44,8 @@
 /// Collection of Richtext objects
 /// </summary>
 public class ExcelRichTextCollection : XmlHelper, IEnumerable<ExcelRichText> {
-  private List<ExcelRichText> _list = new();
-  private ExcelRangeBase _cells;
+  private readonly List<ExcelRichText> _list = new();
+  private readonly ExcelRangeBase _cells;
 
   internal ExcelRichTextCollection(XmlNamespaceManager ns, XmlNode topNode)
       : base(ns, topNode) {
diff --git a/EPPlus/Style/ExcelTextFont.cs b/EPPlus/Style/ExcelTextFont.cs
index 13b7ae1..f098072 100644
--- a/EPPlus/Style/ExcelTextFont.cs
+++ b/EPPlus/Style/ExcelTextFont.cs
@@ -74,8 +74,8 @@
 /// Used by Rich-text and Paragraphs.
 /// </summary>
 public class ExcelTextFont : XmlHelper {
-  private string _path;
-  private XmlNode _rootNode;
+  private readonly string _path;
+  private readonly XmlNode _rootNode;
 
   internal ExcelTextFont(
       XmlNamespaceManager namespaceManager,
@@ -94,7 +94,7 @@
     _path = path;
   }
 
-  private string _fontLatinPath = "a:latin/@typeface";
+  private readonly string _fontLatinPath = "a:latin/@typeface";
 
   public string LatinFont {
     get => GetXmlNodeString(_fontLatinPath);
@@ -111,7 +111,7 @@
     }
   }
 
-  private string _fontCsPath = "a:cs/@typeface";
+  private readonly string _fontCsPath = "a:cs/@typeface";
 
   public string ComplexFont {
     get => GetXmlNodeString(_fontCsPath);
@@ -121,7 +121,7 @@
     }
   }
 
-  private string _boldPath = "@b";
+  private readonly string _boldPath = "@b";
 
   public bool Bold {
     get => GetXmlNodeBool(_boldPath);
@@ -131,7 +131,7 @@
     }
   }
 
-  private string _underLinePath = "@u";
+  private readonly string _underLinePath = "@u";
 
   public eUnderLineType UnderLine {
     get => TranslateUnderline(GetXmlNodeString(_underLinePath));
@@ -141,7 +141,7 @@
     }
   }
 
-  private string _underLineColorPath = "a:uFill/a:solidFill/a:srgbClr/@val";
+  private readonly string _underLineColorPath = "a:uFill/a:solidFill/a:srgbClr/@val";
 
   public Color UnderLineColor {
     get {
@@ -157,7 +157,7 @@
     }
   }
 
-  private string _italicPath = "@i";
+  private readonly string _italicPath = "@i";
 
   public bool Italic {
     get => GetXmlNodeBool(_italicPath);
@@ -167,7 +167,7 @@
     }
   }
 
-  private string _strikePath = "@strike";
+  private readonly string _strikePath = "@strike";
 
   public eStrikeType Strike {
     get => TranslateStrike(GetXmlNodeString(_strikePath));
@@ -177,7 +177,7 @@
     }
   }
 
-  private string _sizePath = "@sz";
+  private readonly string _sizePath = "@sz";
 
   public float Size {
     get => GetXmlNodeInt(_sizePath) / 100;
@@ -187,7 +187,7 @@
     }
   }
 
-  private string _colorPath = "a:solidFill/a:srgbClr/@val";
+  private readonly string _colorPath = "a:solidFill/a:srgbClr/@val";
 
   public Color Color {
     get {
diff --git a/EPPlus/Style/XmlAccess/ExcelNamedStyleXml.cs b/EPPlus/Style/XmlAccess/ExcelNamedStyleXml.cs
index 599052c..8004056 100644
--- a/EPPlus/Style/XmlAccess/ExcelNamedStyleXml.cs
+++ b/EPPlus/Style/XmlAccess/ExcelNamedStyleXml.cs
@@ -38,7 +38,7 @@
 /// Xml access class for named styles
 /// </summary>
 public sealed class ExcelNamedStyleXml : StyleXmlHelper {
-  private ExcelStyles _styles;
+  private readonly ExcelStyles _styles;
 
   internal ExcelNamedStyleXml(XmlNamespaceManager nameSpaceManager, ExcelStyles styles)
       : base(nameSpaceManager) {
diff --git a/EPPlus/Style/XmlAccess/ExcelXfsXml.cs b/EPPlus/Style/XmlAccess/ExcelXfsXml.cs
index 3b6f823..d00ed0e 100644
--- a/EPPlus/Style/XmlAccess/ExcelXfsXml.cs
+++ b/EPPlus/Style/XmlAccess/ExcelXfsXml.cs
@@ -41,7 +41,7 @@
 /// Xml access class xfs records. This is the top level style object.
 /// </summary>
 public sealed class ExcelXfs : StyleXmlHelper {
-  private ExcelStyles _styles;
+  private readonly ExcelStyles _styles;
 
   internal ExcelXfs(XmlNamespaceManager nameSpaceManager, ExcelStyles styles)
       : base(nameSpaceManager) {
@@ -232,7 +232,7 @@
     set => _wrapText = value;
   }
 
-  private string textRotationPath = "d:alignment/@textRotation";
+  private readonly string textRotationPath = "d:alignment/@textRotation";
   private int _textRotation;
 
   /// <summary>
diff --git a/EPPlus/Table/ExcelTableCollection.cs b/EPPlus/Table/ExcelTableCollection.cs
index 08576e4..75c255d 100644
--- a/EPPlus/Table/ExcelTableCollection.cs
+++ b/EPPlus/Table/ExcelTableCollection.cs
@@ -41,9 +41,9 @@
 /// A collection of table objects
 /// </summary>
 public class ExcelTableCollection : IEnumerable<ExcelTable> {
-  private List<ExcelTable> _tables = new();
+  private readonly List<ExcelTable> _tables = new();
   internal Dictionary<string, int> _tableNames = new(StringComparer.InvariantCultureIgnoreCase);
-  private ExcelWorksheet _ws;
+  private readonly ExcelWorksheet _ws;
 
   internal ExcelTableCollection(ExcelWorksheet ws) {
     var pck = ws._package.Package;
diff --git a/EPPlus/Table/ExcelTableColumnCollection.cs b/EPPlus/Table/ExcelTableColumnCollection.cs
index 864e026..57d59d8 100644
--- a/EPPlus/Table/ExcelTableColumnCollection.cs
+++ b/EPPlus/Table/ExcelTableColumnCollection.cs
@@ -42,8 +42,9 @@
 /// A collection of table columns
 /// </summary>
 public class ExcelTableColumnCollection : IEnumerable<ExcelTableColumn> {
-  private List<ExcelTableColumn> _cols = new();
-  private Dictionary<string, int> _colNames = new(StringComparer.InvariantCultureIgnoreCase);
+  private readonly List<ExcelTableColumn> _cols = new();
+  private readonly Dictionary<string, int> _colNames = new(
+      StringComparer.InvariantCultureIgnoreCase);
 
   public ExcelTableColumnCollection(ExcelTable table) {
     Table = table;
diff --git a/EPPlus/Table/PivotTable/ExcelPivotTableCollection.cs b/EPPlus/Table/PivotTable/ExcelPivotTableCollection.cs
index bde8c36..c6c918f 100644
--- a/EPPlus/Table/PivotTable/ExcelPivotTableCollection.cs
+++ b/EPPlus/Table/PivotTable/ExcelPivotTableCollection.cs
@@ -40,9 +40,9 @@
 /// A collection of pivottable objects
 /// </summary>
 public class ExcelPivotTableCollection : IEnumerable<ExcelPivotTable> {
-  private List<ExcelPivotTable> _pivotTables = new();
+  private readonly List<ExcelPivotTable> _pivotTables = new();
   internal Dictionary<string, int> _pivotTableNames = new();
-  private ExcelWorksheet _ws;
+  private readonly ExcelWorksheet _ws;
 
   internal ExcelPivotTableCollection(ExcelWorksheet ws) {
     var pck = ws._package.Package;
diff --git a/EPPlus/Table/PivotTable/ExcelPivotTableFieldItem.cs b/EPPlus/Table/PivotTable/ExcelPivotTableFieldItem.cs
index d4dce2d..b300b73 100644
--- a/EPPlus/Table/PivotTable/ExcelPivotTableFieldItem.cs
+++ b/EPPlus/Table/PivotTable/ExcelPivotTableFieldItem.cs
@@ -39,7 +39,7 @@
 /// A field Item. Used for grouping
 /// </summary>
 public class ExcelPivotTableFieldItem : XmlHelper {
-  private ExcelPivotTableField _field;
+  private readonly ExcelPivotTableField _field;
 
   internal ExcelPivotTableFieldItem(
       XmlNamespaceManager ns,
diff --git a/EPPlus/Utils/Argument.cs b/EPPlus/Utils/Argument.cs
index e95c92b..8519db1 100644
--- a/EPPlus/Utils/Argument.cs
+++ b/EPPlus/Utils/Argument.cs
@@ -37,7 +37,7 @@
     _value = value;
   }
 
-  private T _value;
+  private readonly T _value;
 
   T IArgument<T>.Value => _value;
 }
diff --git a/EPPlus/Utils/ValidationResult.cs b/EPPlus/Utils/ValidationResult.cs
index 2985491..9985fa5 100644
--- a/EPPlus/Utils/ValidationResult.cs
+++ b/EPPlus/Utils/ValidationResult.cs
@@ -11,8 +11,8 @@
     _errorMessage = errorMessage;
   }
 
-  private bool _result;
-  private string _errorMessage;
+  private readonly bool _result;
+  private readonly string _errorMessage;
 
   private void Throw() {
     if (string.IsNullOrEmpty(_errorMessage)) {
diff --git a/NetCoreTests/ExcelPackageTest.cs b/NetCoreTests/ExcelPackageTest.cs
index 975fadc..8785d5d 100644
--- a/NetCoreTests/ExcelPackageTest.cs
+++ b/NetCoreTests/ExcelPackageTest.cs
@@ -20,6 +20,18 @@
     worksheet.Name.Should().Be("Times_csv");
   }
 
+  [TestMethod]
+  public void TestGetAsByteArray_PublicLibrary() {
+    var package = new ExcelPackage(new FileInfo(GetTestWorkbookPath("PublicLibrary.xlsx")));
+    var data = package.GetAsByteArray();
+
+    // Verify that we can reload
+    var newPackage = new ExcelPackage(new MemoryStream(data, false));
+    newPackage.Workbook.Worksheets.Count.Should().Be(1);
+    var worksheet = newPackage.Workbook.Worksheets.First();
+    worksheet.Name.Should().Be("pusum11a");
+  }
+
   private static string GetTestWorkbookPath(string filename) {
     var assemblyPath = Path.GetDirectoryName(typeof(ExcelPackageTest).Assembly.Location)!;
     return Path.Combine(assemblyPath, "TestWorkbooks", filename);
diff --git a/NetCoreTests/TestWorkbooks/PublicLibrary.xlsx b/NetCoreTests/TestWorkbooks/PublicLibrary.xlsx
new file mode 100644
index 0000000..5c51d4c
--- /dev/null
+++ b/NetCoreTests/TestWorkbooks/PublicLibrary.xlsx
Binary files differ
