9using NanoXLSX.Interfaces.Writer;
10using NanoXLSX.Registry;
11using NanoXLSX.Registry.Attributes;
12using NanoXLSX.Utils.Xml;
13using System.Collections.Generic;
18 [NanoXlsxQueuePlugIn(PlugInUUID =
"EXTERNAL_LINK_INLINE_WORKSHEET_WRITER", QueueUUID = PlugInUUID.WorksheetInlineWriter, PlugInOrder = 100000)]
19 internal class ExternalLinkWorksheetInlineWriter : IPluginInlineWriter
22 private Worksheet currentWorksheet;
28 public Workbook Workbook {
get;
set; }
32 public IWriteContext WriteContext {
get;
set; }
36 public XmlElement RootElement {
get;
set; }
40 public XmlElement XmlElement {
get; }
49 public void Init(ref XmlElement rootElement, Workbook workbook,
int? index =
null)
52 RootElement = rootElement;
54 currentWorksheet = Workbook.Worksheets.First(w => w.SheetID == index);
62 if (!currentWorksheet.Features.ContainsExternalLinks)
73 private void ReplaceFormulas()
75 Dictionary<int, Dictionary<string, ExternalLinkResolution>> externalLinks =
76 Workbook.AuxiliaryData.GetData<Dictionary<int, Dictionary<string, ExternalLinkResolution>>>(PlugInUUID.CompatibilityInlineProcessor, CompatibilityConstants.EXTERNAL_LINK_RESOLVED_FORMULAS_ENTITY);
77 if (externalLinks ==
null || externalLinks.Count == 0 || !externalLinks.TryGetValue(currentWorksheet.SheetID, out Dictionary<string, ExternalLinkResolution> externalLink))
81 foreach (KeyValuePair<string, ExternalLinkResolution> extLinkFormula
in externalLink)
83 IEnumerable<XmlElement> cells = RootElement.FindChildElementsByNameAndAttribute(
"c",
"r", extLinkFormula.Key);
85 XmlElement cell = cells.FirstOrDefault();
88 IEnumerable<XmlElement> formulas = cell.FindChildElementsByName(
"f");
90 XmlElement formula = formulas.FirstOrDefault();
93 formula.InnerValue = extLinkFormula.Value.Expression;