10using NanoXLSX.Registry;
11using NanoXLSX.Registry.Attributes;
14using NanoXLSX.Utils.Xml;
22 [NanoXlsxPlugIn(PlugInUUID = PlugInUUID.WorkbookWriter)]
23 internal class WorkbookWriter : IPlugInWriter
25 private XmlElement workbook;
26 private IPasswordWriter passwordWriter;
32 public Workbook Workbook {
get;
set; }
37 public XmlElement XmlElement {
get => workbook; }
44 internal WorkbookWriter()
54 public void Init(IBaseWriter baseWriter)
56 this.Workbook = baseWriter.Workbook;
57 IPassword passwordInstance = Workbook.WorkbookProtectionPassword;
58 this.passwordWriter = PlugInLoader.GetPlugIn<IPasswordWriter>(PlugInUUID.PasswordWriter,
new LegacyPasswordWriter());
59 this.passwordWriter.Init(PasswordType.WorkbookProtection, passwordInstance.PasswordHash);
67 Workbook wb = Workbook;
68 workbook = XmlElement.CreateElement(
"workbook");
69 workbook.AddDefaultXmlNameSpace(
"http://schemas.openxmlformats.org/spreadsheetml/2006/main");
70 workbook.AddNameSpaceAttribute(
"r",
"xmlns",
"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
71 XmlElement workbookPr = workbook.AddChildElement(
"workbookPr");
72 if (wb.WorkbookTheme !=
null)
74 workbookPr.AddAttribute(
"defaultThemeVersion", Theme.DefaultThemeVersion);
77 if (wb.SelectedWorksheet > 0 || wb.Hidden || HasPaneSplitting())
79 XmlElement bookViews = workbook.AddChildElement(
"bookViews");
80 XmlElement workbookView = bookViews.AddChildElement(
"workbookView");
83 workbookView.AddAttribute(
"visibility",
"hidden");
87 workbookView.AddAttribute(
"activeTab", ParserUtils.ToString(wb.SelectedWorksheet));
90 workbook.AddChildElement(GetWorkbookProtectionElement());
91 XmlElement sheets = workbook.AddChildElement(
"sheets");
92 if (wb.Worksheets.Count > 0)
94 foreach (Worksheet item
in wb.Worksheets)
96 XmlElement sheet = sheets.AddChildElementWithAttribute(
"sheet",
"id",
"rId" + ParserUtils.ToString(item.SheetID),
"",
"r");
97 sheet.AddAttribute(
"sheetId", item.SheetID.ToString());
98 sheet.AddAttribute(
"name", XmlUtils.SanitizeXmlValue(item.SheetName));
101 sheet.AddAttribute(
"state",
"hidden");
108 XmlElement sheet = sheets.AddChildElementWithAttribute(
"sheet",
"id",
"rId1",
"",
"r");
109 sheet.AddAttribute(
"sheetId",
"1");
110 sheet.AddAttribute(
"name",
"sheet1");
113 WriterPlugInHandler.HandleInlineQueuePlugins(ref workbook, Workbook, PlugInUUID.WorkbookInlineWriter);
120 private XmlElement GetWorkbookProtectionElement()
122 Workbook workbook = Workbook;
123 XmlElement workbookProtection =
null;
124 if (workbook.UseWorkbookProtection)
126 workbookProtection = XmlElement.CreateElement(
"workbookProtection");
127 if (workbook.LockWindowsIfProtected)
129 workbookProtection.AddAttribute(
"lockWindows",
"1");
131 if (workbook.LockStructureIfProtected)
133 workbookProtection.AddAttribute(
"lockStructure",
"1");
135 if (passwordWriter.PasswordIsSet())
137 workbookProtection.AddAttributes(passwordWriter.GetAttributes());
140 return workbookProtection;
147 private bool HasPaneSplitting()
149 foreach (Worksheet worksheet
in Workbook.Worksheets)
151 if (worksheet.PaneSplitLeftWidth !=
null || worksheet.PaneSplitTopHeight !=
null || worksheet.PaneSplitAddress !=
null)
Static class that contains enums for password handling.