beherbergung/import/api/wpforms-mails/src/data/table/writer.clj

35 lines
1.2 KiB
Clojure

(ns data.table.writer
(:require [dk.ative.docjure.spreadsheet :as xls]
[semantic-csv.core :as sc]
[clojure.spec.alpha :as s]
[clojure.string :refer [ends-with?]]))
;; TODO check that cells are literals, not compounds
(s/def ::table-map (s/coll-of map?))
(s/def ::table-vec (s/coll-of vector?))
(s/def ::table (s/or :map ::table-map
:vec ::table-vec))
(defn vectorize-if-needed [table]
(assert (s/valid? ::table table))
(if (s/valid? ::table-map table)
(sc/vectorize table)
table))
(defn table2xls [filename args table]
(let [workbook-name (:workbook-name args filename)
wb (xls/create-workbook workbook-name (vectorize-if-needed table))]
(xls/save-workbook! filename wb)))
(defn save-table!
([filename table]
(save-table! filename {} table))
([filename args table]
(assert (or (ends-with? filename ".xlsx")
(ends-with? filename ".csv")))
(if (ends-with? filename ".xlsx")
(table2xls filename args table)
(let [args+defaults (merge {:writer-opts {:delimiter ";"}} args)]
(sc/spit-csv filename args+defaults table)))
(println "Saved " filename)))