[NWD] Fix EPPlus loading issue with certain spreadsheets.

ExcelPackage.Workbook was being accessed before it was initialized; this
change just passes the workbook to the constructor of the classes that
need it.

Change-Id: I7ebd4dfe02011ab117ecffc35168f0b2066ccfdf
Reviewed-on: https://gnocchi-internal-review.git.corp.google.com/c/third_party/epplus/+/207700
Reviewed-by: Hughes Hilton <hugheshilton@google.com>
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