35 lines
1.2 KiB
Clojure
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)))
|