Clojure代理追加到excel文件

我一直在使用docjure写入excel文件。 大多数情况下,我想追加行已经存在的文件,通常一次一个。 当我这样做没有代理/将来,我加载文件,使用添加行来添加数据,然后重写这样的文件:

(defn append [filename data] "data is in the same format as create-workbook, ie [[\"n\" \"m\"] [1 2] [3 4]]" (let [workbook (load-workbook filename)) sheet (select-sheet workbook "Sheet1")] (add-rows! sheet data) (save-workbook! filename workbook))) 

我打了很多电话追加,所以我发现这个: http : //blakesmith.me/2012/05/25/understanding-clojure-concurrency-part-2.html ,它显示了如何使用代理写入一个使用未来的文件。

首先,我使用的FileOutputStream而不是FileWriter,它仍然会工作,除非在教程的例子中,你只是将string追加到文件的末尾使用.write然后closures,我需要重写文件,每次我“append”(我认为?),因为在.xlsx工作簿中的字节数多于字符数。

我不知道如何设置这个,因为在教程的日志logging示例中,write-out返回BufferedWriter的更新实例,我不知道这将是什么。

我的另一个select是将数据同时添加到vector(加载文件一次,并保持返回新vector[[\“n \”\“m \”] [1 2] [3 4]])但是我打算做这些电话的10000-100000个,这似乎很多跟踪…虽然要公平地阅读和写许多次的数据可能不是那么好。

如果您对我如何做到这一点有什么build议,我会很感激。 如果有更好的方法来追加,我也愿意打电话给Apache POI本身。 谢谢。

— UDPATE —

我只是重写了logging器的例子,而不是输出stream的代理文件,它似乎工作。 如果它最终与docjure / Apache POI一起工作,我会让你知道的。

 (def logfile (agent (File. "blah.txt"))) (defn write-out [file msg] (with-open [out (BufferedWriter. (FileWriter. file true))] (.write out msg)) file) 

— UDPATE 2 —

我有一个与docjure编写的类似的版本,但不幸的是,因为打开文件发生在写出和发生在每一个将来(如果我使用文件作为代理,我没有看到一个解决方法,我不除此之外,看另一种方式)大多数读取空文件并写入该行,因为它们都是并行完成的,最终的结果是大多数文件相互覆盖。

最终,我决定只是将每个行向量添加到整个数据向量并写入一次。 我可以用pmap来做,所以它很整洁。 一个缺点是,如果出现错误,根本没有数据被写入文件,但好处在于写入所花费的时间减less了,因为只有一个写入调用。 另外,我每次都要把大量的数据加载到内存中,这需要花费时间。 内存使用情况是相同的。

如果有人仍然想回答这个问题,我还是有兴趣的,但是我第一次更新的方法不起作用(每个将来读入一个空文件并使用它附加到)。 我会张贴代码incase它帮助任何人 – 上述教程的docjure版本:

 (def file (agent (File. "blah.xlsx"))) (defn write-out [file workbook] (with-open [out (FileOutputStream. file)] (.write workbook out)) file) (defn write-workbook [file data] (let [filename (.getPath @file) workbook (try (load-workbook filename) (catch Exception e (create-workbook "Sheet1" []))) sheet (select-sheet "Sheet1" workbook)] (add-rows! sheet data) (send file write-out workbook))) (defn test [file] (write-workbook file [["n" "m"]]) (dotimes [i 5] (future (write-workbook file [[i (inc i)]])))) 

谢谢