我需要根据需要即时创建excel文件,并使用clojure.ring通过响应将其提供给用户。
我使用docjure创建一个excel文件并将其写入输出流(请参见以下函数:https : //github.com/mjul/docjure/blob/master/src/dk/ative/docjure/spreadsheet.clj#L86) ,然后从中获得输出流piped-input-stream(请参阅https://github.com/ring-clojure/ring/blob/1.5.0/ring-core/src/ring/util/io.clj#L11)。
代码的相关部分:
(defn excel-response
[params]
(-> (response (piped-input-stream (fn [out-stream]
(create-excel-into-stream out-stream
params))))
(assoc :headers {"Content-Type"
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})))
Run Code Online (Sandbox Code Playgroud)
使用此功能,由于某些原因,我总是得到一个空的.xlsx文件。piped-input-stream在我可以将其用作响应主体之前,似乎已经结束。
我如何正确使用它,以便可以写入输出流,将其传递给输入流,然后用作响应主体?
你的excel-response函数对我来说看起来是正确的,我之前写过非常相似的东西。create-excel-into-stream你的函数是什么样的?
这在过去对我有用。
(ns my.data.handler
(:require [clojure.data.csv :as csv]
[clojure.java.io :as io]))
(defn create-excel-into-stream
[out-stream params]
(let [excel-data (get-excel-data params)]
(with-open [writer (io/writer out-stream)]
(csv/write-csv writer excel-data))))
Run Code Online (Sandbox Code Playgroud)