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) <>
+ """
"""