data.table.writer: supporting xlsx and csv

This commit is contained in:
Johannes Lötzsch 2022-03-05 22:13:18 +01:00
parent 50aee61a42
commit 9c61ba5ec0
4 changed files with 40 additions and 9 deletions

View File

@ -10,3 +10,4 @@ pom.xml.asc
/.nrepl-port
/.prepl-port
*.xlsx
*.csv

View File

@ -8,6 +8,7 @@
[io.forward/clojure-mail "1.0.8"]
[clj-tagsoup "0.3.0" :exclusions [org.clojure/clojure org.clojure/data.xml]]
[org.clojure/data.xml "0.0.8"]
[semantic-csv "0.2.1-alpha1"]
[dk.ative/docjure "1.14.0"]]
:main ^:skip-aot wpforms-mails.core
:target-path "target/%s"

View File

@ -0,0 +1,34 @@
(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)))

View File

@ -6,7 +6,7 @@
[clojure-mail.message :as cmm]
[pl.danieljanus.tagsoup :refer [parse-string]]
[wpforms-mails.parse-hickup :refer [wpforms_html->edn]]
[dk.ative.docjure.spreadsheet :refer [create-workbook save-workbook!]])
[data.table.writer :refer [save-table!]])
(:import [java.util Properties]
[javax.mail Session]
[javax.mail.internet MimeMessage])
@ -39,21 +39,16 @@
(->> msg:edn :body :body
parse-string))))
(defn save-spreadsheet! [filename sheet data]
(let [wb (create-workbook sheet
(concat [(keys (first data))]
(map vals data)))]
(save-workbook! filename wb)))
(defn -main
[& _args]
([] (-main "host-offers.xlsx"))
([filename & _args]
(->> (file->messages (:wpforms-mails-file env))
(map (fn [message]
(-> message
message->html
wpforms_html->edn)))
rest ;; TODO filter valid entries
(save-spreadsheet! "host-offers.xlsx" "Host Offers")))
(save-table! filename {:workbook-name "Host Offers"}))))
(comment
(count (mbox->emls (:wpforms-mails-file env)))