From 5d81a773e49c7a0f60c79ceb372ce700598b2a43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Norb=C3=A4ck=20Olivers?= Date: Fri, 25 Oct 2024 16:16:08 +0200 Subject: [PATCH] Add defined_names to Workbook --- lib/elixlsx/workbook.ex | 15 +++++++++++++-- lib/elixlsx/xml_templates.ex | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/lib/elixlsx/workbook.ex b/lib/elixlsx/workbook.ex index f09d557..ab675b1 100644 --- a/lib/elixlsx/workbook.ex +++ b/lib/elixlsx/workbook.ex @@ -6,15 +6,18 @@ defmodule Elixlsx.Workbook do The datetime property can optionally be set to override the "created at" date. It defaults to the current time. + + The defined_names property is a map of defined names in the workbook. """ alias Elixlsx.Sheet alias Elixlsx.Workbook - defstruct sheets: [], datetime: nil + defstruct sheets: [], datetime: nil, defined_names: %{} @type t :: %Workbook{ sheets: nonempty_list(Sheet.t()), - datetime: String.t() | integer | nil + datetime: String.t() | integer | nil, + defined_names: %{String.t() => String.t()} } @doc "Append a sheet at the end." @@ -30,4 +33,12 @@ defmodule Elixlsx.Workbook do def insert_sheet(workbook, sheet, at \\ 0) do update_in(workbook.sheets, &List.insert_at(&1, at, sheet)) end + + @doc """ + Add a defined name to the workbook. + """ + @spec add_defined_name(Workbook.t(), String.t(), String.t()) :: Workbook.t() + def add_defined_name(workbook, name, definition) do + update_in(workbook.defined_names, &Map.put(&1, name, definition)) + end end diff --git a/lib/elixlsx/xml_templates.ex b/lib/elixlsx/xml_templates.ex index d3dffd8..70fcc96 100644 --- a/lib/elixlsx/xml_templates.ex +++ b/lib/elixlsx/xml_templates.ex @@ -775,6 +775,24 @@ defmodule Elixlsx.XMLTemplates do |> Enum.map_join(&make_xl_workbook_xml_sheet_entry/1) end + defp workbook_defined_names(%{}) do + "" + end + + defp workbook_defined_names(defined_names) do + """ + + #{Enum.map_join(defined_names, &make_defined_name/1)} + + """ + end + + defp make_defined_name({name, definition}) do + """ + #{xml_escape(definition)} + """ + end + @doc ~S""" Return the data for /xl/workbook.xml """ @@ -791,6 +809,9 @@ defmodule Elixlsx.XMLTemplates do workbook_sheet_entries(data.sheets, sci) <> ~S""" + """ <> + workbook_defined_names(data.defined_names) <> + """ """