data.table.writer: supporting xlsx and csv
This commit is contained in:
parent
50aee61a42
commit
9c61ba5ec0
|
@ -10,3 +10,4 @@ pom.xml.asc
|
||||||
/.nrepl-port
|
/.nrepl-port
|
||||||
/.prepl-port
|
/.prepl-port
|
||||||
*.xlsx
|
*.xlsx
|
||||||
|
*.csv
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
[io.forward/clojure-mail "1.0.8"]
|
[io.forward/clojure-mail "1.0.8"]
|
||||||
[clj-tagsoup "0.3.0" :exclusions [org.clojure/clojure org.clojure/data.xml]]
|
[clj-tagsoup "0.3.0" :exclusions [org.clojure/clojure org.clojure/data.xml]]
|
||||||
[org.clojure/data.xml "0.0.8"]
|
[org.clojure/data.xml "0.0.8"]
|
||||||
|
[semantic-csv "0.2.1-alpha1"]
|
||||||
[dk.ative/docjure "1.14.0"]]
|
[dk.ative/docjure "1.14.0"]]
|
||||||
:main ^:skip-aot wpforms-mails.core
|
:main ^:skip-aot wpforms-mails.core
|
||||||
:target-path "target/%s"
|
:target-path "target/%s"
|
||||||
|
|
|
@ -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)))
|
|
@ -6,7 +6,7 @@
|
||||||
[clojure-mail.message :as cmm]
|
[clojure-mail.message :as cmm]
|
||||||
[pl.danieljanus.tagsoup :refer [parse-string]]
|
[pl.danieljanus.tagsoup :refer [parse-string]]
|
||||||
[wpforms-mails.parse-hickup :refer [wpforms_html->edn]]
|
[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]
|
(:import [java.util Properties]
|
||||||
[javax.mail Session]
|
[javax.mail Session]
|
||||||
[javax.mail.internet MimeMessage])
|
[javax.mail.internet MimeMessage])
|
||||||
|
@ -39,21 +39,16 @@
|
||||||
(->> msg:edn :body :body
|
(->> msg:edn :body :body
|
||||||
parse-string))))
|
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
|
(defn -main
|
||||||
[& _args]
|
([] (-main "host-offers.xlsx"))
|
||||||
|
([filename & _args]
|
||||||
(->> (file->messages (:wpforms-mails-file env))
|
(->> (file->messages (:wpforms-mails-file env))
|
||||||
(map (fn [message]
|
(map (fn [message]
|
||||||
(-> message
|
(-> message
|
||||||
message->html
|
message->html
|
||||||
wpforms_html->edn)))
|
wpforms_html->edn)))
|
||||||
rest ;; TODO filter valid entries
|
rest ;; TODO filter valid entries
|
||||||
(save-spreadsheet! "host-offers.xlsx" "Host Offers")))
|
(save-table! filename {:workbook-name "Host Offers"}))))
|
||||||
|
|
||||||
(comment
|
(comment
|
||||||
(count (mbox->emls (:wpforms-mails-file env)))
|
(count (mbox->emls (:wpforms-mails-file env)))
|
||||||
|
|
Loading…
Reference in New Issue