Re: [問題] 有關Java Excel
好吧,把我們公司的商業機密教妳,不過這只適合一次性的exporting
這個寫出大量資料到xls的我們公司的產品(商業智慧軟體)也會碰到
客戶數十tb的dwh做出來的報表動輒上百萬筆資料,在網頁上還可以一頁一頁
顯示,但是要直接一次dump到binary format的excel記憶體一下就被吃完了,
怎麼辦呢?
好,第一步,請先開啟excel新建一個xls檔,把他做成妳要輸出的格式。
第二步,檔案-另存新檔-請存成xml格式。 用notepad或textpad打開這個檔案妳會發現
這是一個標準的xml檔案,標頭長的像這樣:
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
..
原來excel檔裡面的每一個cell就成了xml裡面的一個element。
再來,把這個xml檔的副檔名改成.xls。再用excel開啟 -- 顯示的跟原來的binary
的excel一樣耶~看出trick了嗎?
只要把標頭和格式的xml elements 先寫出去,然後每從TXT檔讀近一筆資料就加上
xml tag寫到file system裡,就不會有outofmemory的issue了。
※ 引述《kojinvhfsk (野砲蕃薯)》之銘言:
: 最近增加了一項需求,需要將Txt檔同樣輸出至Xls檔
: 但這Txt檔算是蠻大的(都是n個欄位*n萬筆資料)
: 於是,就造成了記憶體不足的情況(問題1)
: 問題1: 當我新增資料至Xls檔時,新增了一堆Cell至Sheet時,這些Cell都是存在記憶體
: 直到最後workbook.write()時,才一次寫入至檔案,只能這樣子使用嗎?
: 無法自己控制哪些Cell要先寫入檔案,而不放在記憶體裡嗎?
: 問題2: 透過JDBC將Xls當做資料庫來使用,同樣要建立Table(也就是Sheet),
: 並設定其欄位型態,為何設定為varchar的欄位,在用Excel開啟Xls檔後,
: 他的欄位資料都會多加個「'」呢?(ex.男,就會變成'男)
: 問題3: 當我用JDBC將n欄*n萬筆資料,全部輸出至Xls檔後,但接下來,
: 我在別的功能裡,需要再新增Sheet到這個Xls檔,
: 但…卻在createWorkbook的時候出現記憶體不足!!!
: 我想請問的是,Java Excel開啟一個Xls檔後,是將其內的所有資料(Sheet、Cell)
: 全都放到記憶體嗎…?有可能是這樣子嗎?
: 以上…還煩請有經驗的前輩們指點一二…頭痛啊…頭痛…
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 98.204.128.203
推
03/29 14:23, , 1F
03/29 14:23, 1F
推
03/29 14:59, , 2F
03/29 14:59, 2F
推
03/29 19:31, , 3F
03/29 19:31, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 4 篇):