Hmmm... good to know POI still needs work.  I guess I'll just stick
with CSV & tab delimited for now.  Thanks!

On Jul 1, 1:56 pm, Richard Newman <holyg...@gmail.com> wrote:
> > Has anyone out there written an Apache POI wrapper yet?
>
> I started to (for Excel processing), only to abandon it in disgust.  
> POI is just too incomplete: I have to choose between loading  
> everything into memory (impossible), or essentially parsing XLSX  
> myself (so what's the point of using POI?) in a different fashion to  
> XLS. There's no streaming API for XLSX.
>
> I switched to JavaCSV, simply requiring that the input be pre-
> converted. Fine for my situation.
>
> For writing Excel, it's probably worth the time investment. For small  
> worksheets it's fine. For non-trivial data, particularly in XLSX -- I  
> was dealing with a 230,000-row table -- it's more trouble than it's  
> worth.
>
> Sorry to be a downer :/
>
> Some scratch code from me -- sorry it's neither tidy nor complete, but  
> I don't have the time right now. Hope it helps.
>
> ;; Lots of redundancy here from experimentation.
> (ns com.foo.xls
>    (:refer-clojure)
>    (:use clojure.contrib.duck-streams)
>    (:use clojure.contrib.pprint)
>    (:use clojure.contrib.seq-utils)
>
>    (:require [clojure.zip :as zip])
>    (:require [clojure.xml :as xml])
>    (:require [clojure.contrib.lazy-xml :as lazy-xml])
>    (:require [clojure.contrib.zip-filter :as zf])
>    (:require [clojure.contrib.zip-filter.xml :as zfx])
>    (:import (com.csvreader CsvReader))
>    (:import
>       (org.apache.poi.poifs.filesystem POIFSFileSystem)
>       (org.apache.poi.hssf.usermodel HSSFWorkbook)
>       (org.apache.poi.hssf.eventusermodel HSSFRequest
>                                           HSSFListener
>                                           HSSFEventFactory)
>       (org.apache.poi.ss.usermodel Workbook
>                                    WorkbookFactory
>                                    Row
>                                    Cell)
>       (org.apache.poi.hslf.model Sheet)
>       (java.io FileInputStream
>                FileOutputStream
>                InputStream
>                IOException)))
>
> (defn sheets
>    "Returns a lazy sequence of sheets in the workbook."
>    ([#^Workbook wb]
>     (sheets wb (.getNumberOfSheets wb) 0))
>    ([#^Workbook wb c i]
>     (lazy-seq
>       (when (< i c)
>         (cons (.getSheetAt wb i)
>               (sheets wb c (inc i)))))))
>
> (defmacro with-workbook [[wb path] & body]
>    `(with-open [in# (new FileInputStream ~path)]
>      (let [~wb (WorkbookFactory/create in#)]
>       �...@body)))
>
> ;; Another approach:
> (defmacro do-xls-rows [[path] & process-record]
>    `(let [pr#
>           (proxy [HSSFListener] []
>             (processRecord [#^Record ~'record]
>               ~...@process-record))]
>       (with-open [in# (new FileInputStream ~path)]
>         (let [poifs# (new POIFSFileSystem in#)]
>           (with-open [din# (.createDocumentInputStream poifs#  
> "Workbook")]
>             (let [req# (new HSSFRequest)
>                        factory# (new HSSFEventFactory)]
>               (.addListenerForAllRecords req# pr#)
>               (.processEvents factory# req# din#)))))))
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to