defmodule ExCompose do require IEx @moduledoc """ Documentation for Excompose. Template path and destination relative path should be relative to the project root. """ alias ExCompose.{TempDir,Packer,Composer,Pathfinder} def write_xlsx(mappings, :gsub, template_proj_path, dest_proj_path, options \\ %{}) when is_map(mappings) and is_binary(template_proj_path) and is_binary(dest_proj_path) do # generate working folder {:ok, tmp_proj_path, folder_name} = TempDir.generate_new(options[:tmp_dir_header]) # unpack xlsx to working folder folder_proj_path = Pathfinder.join([:cwd, tmp_proj_path, folder_name]) {:ok, _xlsx_datafiles} = Packer.unpack_xlsx(template_proj_path, folder_proj_path) # read SharedStrings file celldata_file = Pathfinder.join(folder_proj_path, "xl/sharedStrings.xml") {:ok, string_content} = File.read(celldata_file) # REPLACE! {:ok, new_string_content} = Composer.gsub(string_content, mappings, options[:delimiter] || {"{{", "}}"}) # write SharedStrings file :ok = File.write(celldata_file, new_string_content) # repackage xlsx dest_path = Pathfinder.join(:cwd, dest_proj_path) Packer.pack_xlsx(folder_proj_path, dest_path, options) end end # ExCompose.write_xlsx(%{"merch_name" => "SEIYIAN REALMS INC"}, :gsub, "test/data/before.xlsx", "test/data/produce.xlsx", %{tmp_dir_header: "WEWIN"})