版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> POI操作Excel----------(轉(zhuǎn)載)</p><p> java當(dāng)初把核心處理設(shè)成Unicode,帶來(lái)的好處是另代碼適應(yīng)了多語(yǔ)言環(huán)境。然而由于老外的英語(yǔ)只有26個(gè)字母,有些情況下,一些程序員用8 位的byte處理,一不小心就去掉了CJK的高位?;蛘呤怯捎诹?xí)慣在程序中采用硬編碼,還有多種原因,使得許多java應(yīng)用在CJK的處理上很煩惱。期貨開(kāi)戶(hù)流程還好 在POI HSSF中考慮到
2、這個(gè)問(wèn)題,可以設(shè)置encoding為雙字節(jié)。POI可以到www.apache.org下載到。編譯好的jar主要有這樣4個(gè):poi包,poi Browser包,poi hdf包,poi hssf例程包。實(shí)際運(yùn)行時(shí),需要有poi包就可以了。如果用Jakarta ant編譯和運(yùn)行,下載apache Jakarta POI的release中的src包,它里面已經(jīng)為你生成好了build文件了。只要運(yùn)行ant就可以了(ant 的安裝和使用在此不
3、說(shuō)了)。如果是用Jbuilder 運(yùn)行,請(qǐng)?jiān)谛陆ǖ捻?xiàng)目中加入poi包。以Jbuilder6為例,選擇Tools菜單項(xiàng)的config libraries...選項(xiàng),新建一個(gè)lib。在彈出的菜單中選擇poi包,如這個(gè)jakarta-poi-</p><p> [java] view plaincopyprint?</p><p> <span style="fon
4、t-family:Microsoft YaHei;font-size:12px;color:#333333;">Java代碼 </p><p> import org.apache.poi.hssf.usermodel.HSSFWorkbook; </p><p&g
5、t; import java.io.FileOutputStream; </p><p> import java.io.IOException; </p><p> public class NewWorkbook &
6、#160;</p><p><b> { </b></p><p> public static void main(String[] args) </p><p> throws IOExcept
7、ion </p><p><b> { </b></p><p> HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook對(duì)象 &l
8、t;/p><p> FileOutputStream fileOut = new FileOutputStream("workbook.xls"); </p><p> wb.write(fileOut);//把Workbook對(duì)象輸出到文件workbook.xls中
9、60; </p><p> fileOut.close(); </p><p><b> } </b></p><p><b> } </b></p&
10、gt;<p> 通過(guò)這個(gè)例子,商品期貨開(kāi)戶(hù)我們建立的是一個(gè)空白的xls文件(不是空文件)。在此基礎(chǔ)上,我們可以進(jìn)一步看其它的例子。 </p><p> import org.apache.poi.hssf.usermodel.*; </p><p> import
11、60;java.io.FileOutputStream; </p><p> import java.io.IOException; </p><p> public class CreateCells </p&g
12、t;<p><b> { </b></p><p> public static void main(String[] args) </p><p> throws IOException
13、0; </p><p><b> { </b></p><p> HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook對(duì)象 </p><
14、;p> HSSFSheet sheet = wb.createSheet("new sheet");//建立新的sheet對(duì)象 </p><p> // Create a row and put some cells
15、in it. Rows are 0 based. </p><p> HSSFRow row = sheet.createRow((short)0);//建立新行 </p><p> // Create
16、 a cell and put a value in it. </p><p> HSSFCell cell = row.createCell((short)0);//建立新cell </p>
17、<p> cell.setCellValue(1);//設(shè)置cell的整數(shù)類(lèi)型的值 </p><p> // Or do it on one line. </p><p> row.createCell((short)1
18、).setCellValue(1.2);//設(shè)置cell浮點(diǎn)類(lèi)型的值 </p><p> row.createCell((short)2).setCellValue("test");//設(shè)置cell字符類(lèi)型的值 </p><p> row.createCell((shor
19、t)3).setCellValue(true);//設(shè)置cell布爾類(lèi)型的值 </p><p> HSSFCellStyle cellStyle = wb.createCellStyle();//建立新的cell樣式 </p><p> cellStyle.se
20、tDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));//設(shè)置cell樣式為定制的日期格式 </p><p> HSSFCell dCell =row.createCell((short)4); </p>
21、<p> dCell.setCellValue(new Date());//設(shè)置cell為日期類(lèi)型的值 </p><p> dCell.setCellStyle(cellStyle); //設(shè)置該cell日期的顯示格式 </p><p> HSSFCell&
22、#160;csCell =row.createCell((short)5); </p><p> csCell.setEncoding(HSSFCell.ENCODING_UTF_16);//設(shè)置cell編碼解決中文高位字節(jié)截?cái)?#160; </p><p> csCell.setCellVal
23、ue("中文測(cè)試_Chinese Words Test");//設(shè)置中西文結(jié)合字符串 </p><p> row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);//建立錯(cuò)誤cell </p>
24、<p> // Write the output to a file </p><p> FileOutputStream fileOut = new FileOutputStream("workbook.xls");
25、160; </p><p> wb.write(fileOut); </p><p> fileOut.close(); </p><p><b> } </b></p>
26、;<p><b> } </b></p><p> 我稍微修改了原來(lái)的examples包中的CreateCells類(lèi)寫(xiě)了上面的功能測(cè)試類(lèi)。通過(guò)這個(gè)例子,我們可以清楚的看到xls文件從大到小包 括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell這樣幾個(gè)對(duì)象。我
27、們可以在cell中設(shè)置各種類(lèi)型的值。尤其要注意的是如果你想正確的顯示非歐美的字符時(shí),尤其象中日韓這樣的語(yǔ)言,必須 股指期貨開(kāi)戶(hù)設(shè)置編碼為16位的即是HSSFCell.ENCODING_UTF_16,才能保證字符的高8位不被截?cái)喽鹁幋a失真形成亂碼。 </p><p> 其他測(cè)試可以通過(guò)參考examples包中的測(cè)試?yán)诱莆誴oi的詳細(xì)用法,包括字體的設(shè)置
28、,cell大小和低紋的設(shè)置等。需要注意的是POI是一 個(gè)仍然在完善中的公開(kāi)代碼的項(xiàng)目,所以有些功能正在不斷的擴(kuò)充。如HSSFSheet的getFooter() getHeader()和setFooter(HSSFFooter hsf) setHeader(HSSFHeader hsh)是在POI1.7中才有的,而POI1.5中就沒(méi)有。運(yùn)行測(cè)試熟悉代碼或者使用它做項(xiàng)目時(shí)請(qǐng)注意POI的版本。
29、 </p><p> 另外需要注意的是HSSF也有它的對(duì)xls基于事件的解析??梢詤⒖祭讨械腅ventExample.java。它通過(guò)實(shí)現(xiàn) HSSFListener完成從普通流認(rèn)知Xls中包含的內(nèi)容,在apache Cocoon中的org.apache.cocoon.serialization.HSSFSerializer中用到了這個(gè)解析。因?yàn)?/p>
30、Cocoon2 是基于事件的,所以POI為了提供快速的解析也提供了相應(yīng)的事件。當(dāng)然我們自己也可以實(shí)現(xiàn)這個(gè)事件接口。 </p><p> 因?yàn)镻OI還不是一個(gè)足夠成熟的項(xiàng)目,所以有必要做進(jìn)一步的開(kāi)發(fā)和測(cè)試。但是它已經(jīng)為我們用純java操作ole2對(duì)象提供了可能,而且克服了ole對(duì)象調(diào)用的缺陷,提供了服務(wù)器端的Excel解決方案。
31、60; </p><p> ====================================================== </p><p> 利用Java 創(chuàng)建和讀取Excel文檔 </p><p> 為了保證示例程序的運(yùn)
32、行,必須安裝Java 2 sdk1.4.0 和Jakarta POI,Jakarta POI的Web站點(diǎn)是: http://jakarta.apache.org/poi/ </p><p> 示例1將演示如何利用Jakarta POI API 創(chuàng)建Excel 文檔。
33、 </p><p> 示例1程序如下: </p><p> import org.apache.poi.hssf.usermodel.HSSFWorkbook; </p><p> import org.
34、apache.poi.hssf.usermodel.HSSFSheet; </p><p> import org.apache.poi.hssf.usermodel.HSSFRow; </p><p> import org.apache.poi.hssf.usermode
35、l.HSSFCell; </p><p> import java.io.FileOutputStream; </p><p> public class CreateXL { </p><
36、p> /** Excel 文件要存放的位置,假定在D盤(pán)JTest目錄下*/ </p><p> public static String outputFile="D:/JTest/ gongye.xls"; </p>&
37、lt;p> public static void main(String argv[]) </p><p><b> { </b></p><p><b> try &l
38、t;/b></p><p><b> { </b></p><p> // 創(chuàng)建新的Excel 工作簿 </p><p> HSSFWorkbook workbook = new
39、HSSFWorkbook(); </p><p> // 在Excel工作簿中建一工作表,其名為缺省值 </p><p> // 如要新建一名為"效益指標(biāo)"的工作表,其語(yǔ)句為: </p>&l
40、t;p> // HSSFSheet sheet = workbook.createSheet("效益指標(biāo)"); </p><p> HSSFSheet sheet = workbook.createSheet(); <
41、;/p><p> // 在索引0的位置創(chuàng)建行(最頂端的行) </p><p> HSSFRow row = sheet.createRow((short)0); </p><p> //在索引0的位置創(chuàng)建單元格(左上端)
42、 </p><p> HSSFCell cell = row.createCell((short) 0); </p><p> // 定義單元格為字符串類(lèi)型 </p><p> ce
43、ll.setCellType(HSSFCell.CELL_TYPE_STRING); </p><p> // 在單元格中輸入一些內(nèi)容 </p><p> cell.setCellValue("增加值"); </
44、p><p> // 新建一輸出文件流 </p><p> FileOutputStream fOut = new FileOutputStream(outputFile); </p><p> // 把相應(yīng)的Ex
45、cel 工作簿存盤(pán) </p><p> workbook.write(fOut); </p><p> fOut.flush(); </p><p> // 操作結(jié)束,關(guān)閉文件
46、 </p><p> fOut.close(); </p><p> System.out.println("文件生成..."); </p><p> }catch(Exception e) { &
47、#160; </p><p> System.out.println("已運(yùn)行 xlCreate() : " + e ); </p><p><b> } </b><
48、/p><p><b> } </b></p><p><b> } </b></p><p> 讀取Excel文檔中的數(shù)據(jù) </p><p> 示例2將演示如
49、何讀取Excel文檔中的數(shù)據(jù)。假定在D盤(pán)JTest目錄下有一個(gè)文件名為gongye.xls的Excel文件。 </p><p> 示例2程序如下: </p><p> import org.apache.poi.hssf.usermodel.HSSFWorkbook;
50、60; </p><p> import org.apache.poi.hssf.usermodel.HSSFSheet; </p><p> import org.apache.poi.hssf.usermodel.HSSFRow; </p>
51、;<p> import org.apache.poi.hssf.usermodel.HSSFCell; </p><p> import java.io.FileInputStream; </p><p> public class Re
52、adXL { </p><p> /** Excel文件的存放位置。注意是正斜線(xiàn)*/ </p><p> public static String fileToBeRead="D:/JTest/ gongye.xls"
53、;; </p><p> public static void main(String argv[]){ </p><p><b> try{ </b></p>
54、<p> // 創(chuàng)建對(duì)Excel工作簿文件的引用 </p><p> HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead)); </p>
55、<p> // 創(chuàng)建對(duì)工作表的引用。 </p><p> // 本例是按名引用(讓我們假定那張表有著缺省名"Sheet1") </p><p> HSSFSheet sheet = workbook.getSh
56、eet("Sheet1"); </p><p> // 也可用getSheetAt(int index)按索引引用, </p><p> // 在Excel文檔中,第一張工作表的缺省索引是0, &
57、lt;/p><p> // 其語(yǔ)句為:HSSFSheet sheet = workbook.getSheetAt(0); </p><p> // 讀取左上端單元 </p><p> HSSFRow row
58、160;= sheet.getRow(0); </p><p> HSSFCell cell = row.getCell((short)0); </p><p> // 輸出單元內(nèi)容,cell.getStringCellValue()就是取所在單
59、元的值 </p><p> System.out.println("左上端單元是: " + cell.getStringCellValue()); </p><p> }catch(Exception e) {&
60、#160; </p><p> System.out.println("已運(yùn)行xlRead() : " + e ); </p><p><b> } </b></p
61、><p><b> } </b></p><p><b> } </b></p><p> 設(shè)置單元格格式 </p><p> 在這里,我們將只介紹一些和格式
62、設(shè)置有關(guān)的語(yǔ)句,我們假定workbook就是對(duì)一個(gè)工作簿的引用。在Java </p><p> 中,第一步要做的就是創(chuàng)建和設(shè)置字體和單元格的格式,然后再應(yīng)用這些格式: </p><p> 1、創(chuàng)建字體,設(shè)置其為紅色、粗體: </p>&
63、lt;p> HSSFFont font = workbook.createFont(); </p><p> font.setColor(HSSFFont.COLOR_RED); </p><p> font.setBoldweight(HSSFFont.B
64、OLDWEIGHT_BOLD); </p><p> 2、創(chuàng)建格式 </p><p> HSSFCellStyle cellStyle= workbook.createCellStyle(); </p><p&
65、gt; cellStyle.setFont(font); </p><p> 3、應(yīng)用格式 </p><p> HSSFCell cell = row.createCell((short) 0);
66、;</p><p> cell.setCellStyle(cellStyle); </p><p> cell.setCellType(HSSFCell.CELL_TYPE_STRING); </p><p> cell.setCellValue("標(biāo)題
67、60;"); </p><p> 總之,如本篇文章所演示的一樣,Java程序員不必?fù)?dān)心Excel工作表中的數(shù)據(jù)了,利用Jakarta POI API, </p><p> 我們就可以輕易的在程序中存取Excel文檔。 &
68、lt;/p><p> ============================================== </p><p> 首先說(shuō)說(shuō)現(xiàn)在我所知道的Java編輯Excel文件的兩大開(kāi)源工具: </p><p> jakarta POI和JavaExcel
69、API(簡(jiǎn)稱(chēng)JXL),這兩套工具我都試用了一這段時(shí)間,感覺(jué)各有優(yōu)劣吧。POI在某些細(xì)節(jié)有些小Bug并且不支持寫(xiě)入圖片,其他方面都挺不錯(cuò)的; </p><p> JXL就慘了,除了支持寫(xiě)入圖片外,我暫時(shí)看不到它比POI好的地方,我碰到的主要的問(wèn)題就是對(duì)公式支持不是很好,很多帶有公式的Excel文件用 JXL打開(kāi)后,公式就丟失了(比如now(),today()
70、),在網(wǎng)上看到其他大蝦評(píng)論說(shuō)JXL寫(xiě)入公式也有問(wèn)題,另外,JXL操作Excel文件的效 率比POI低一點(diǎn)。經(jīng)過(guò)比較后,我選擇了POI開(kāi)發(fā)我的項(xiàng)目。 </p><p> 現(xiàn)在我要做的東西基本完成啦,我把這段時(shí)間使用POI的一些心得總結(jié)出來(lái),希望能對(duì)和我遇到相同問(wèn)題的朋友有所幫助,至于POI基本的使用方法,自己去看文檔吧。 &
71、#160;</p><p> 1、設(shè)置分頁(yè)符的bug </p><p> POI里的HSSFSheet類(lèi)提供了setRowBreak方法可以設(shè)置Sheet的分頁(yè)符。 </p><p> Bug:如果你要設(shè)置分頁(yè)符的Sheet是本來(lái)就有的,并且你沒(méi)有在里面插入過(guò)分頁(yè)符,那
72、么調(diào)用setRowBreak時(shí)POI會(huì)拋出空指針的異常。 </p><p> 解決方法:在Excel里給這個(gè)sheet插入一個(gè)分頁(yè)符,用POI打開(kāi)后再把它刪掉,然后你就可以隨意插入分頁(yè)符了。 </p><p> 如果sheet是由POI生成的則沒(méi)有這個(gè)問(wèn)題。我跟蹤了setRowBreak的源代碼
73、,發(fā)現(xiàn)是Sheet.Java下的 PageBreakRecord rowBreaks這個(gè)變量在搞鬼,如果Sheet里原來(lái)沒(méi)有分頁(yè)符,開(kāi)發(fā)這個(gè)模塊的那位兄臺(tái)忘了為這個(gè)對(duì)象new實(shí)例,所以只能我們先手工給Excel 插入一個(gè)分頁(yè)符來(lái)觸發(fā)POI為rowBreaks創(chuàng)建實(shí)例。 </p><p> 2、如何拷貝行
74、; </p><p> 我在gmane.org的POI用戶(hù)論壇翻遍了每個(gè)相關(guān)的帖子,找遍了api,也沒(méi)看到一個(gè)拷貝行的方法,沒(méi)辦法,只能自己寫(xiě): </p><p> //注:this.fWorkbook是一個(gè)HSSHWorkbook,請(qǐng)自行在外部new </p><
75、;p> public void copyRows </p><p> (String pSourceSheetName, </p><p> String pTargetSheetName,
76、; </p><p> int pStartRow, int pEndRow, </p><p> int pPosition) </p><p><b> { &
77、lt;/b></p><p> HSSFRow sourceRow = null; </p><p> HSSFRow targetRow = null; </p><p> HSSFCell
78、sourceCell = null; </p><p> HSSFCell targetCell = null; </p><p> HSSFSheet sourceSheet = null;
79、 </p><p> HSSFSheet targetSheet = null; </p><p> Region region = null; </p><p> int cT
80、ype; </p><p> int i; </p><p> short j; </p><p> int targetRowFrom; <
81、/p><p> int targetRowTo; </p><p> if ((pStartRow == -1) || (pEndRow == -1)) </p><p><b> {
82、 </b></p><p> return; </p><p><b> } </b></p><p> sourceSheet = this.fWorkbook.get
83、Sheet(pSourceSheetName); </p><p> targetSheet = this.fWorkbook.getSheet(pTargetSheetName); </p><p> //拷貝合并的單元格 &
84、lt;/p><p> for (i = 0; i < sourceSheet.getNumMergedRegions(); i++) </p><p><b> { </b></p>&l
85、t;p> region = sourceSheet.getMergedRegionAt(i); </p><p> if ((region.getRowFrom() >= pStartRow) && (region.getRowTo() <=
86、;pEndRow)) </p><p><b> { </b></p><p> targetRowFrom = region.getRowFrom() - pStartRow + pPosition;
87、 </p><p> targetRowTo = region.getRowTo() - pStartRow + pPosition; </p><p> region.setRowFrom(targetRowFrom); &
88、#160; </p><p> region.setRowTo(targetRowTo); </p><p> targetSheet.addMergedRegion(region); </p><p><b> }
89、; </b></p><p><b> } </b></p><p> //設(shè)置列寬 </p><p> for (i = pStartRow; i <=&
90、#160;pEndRow; i++) </p><p><b> { </b></p><p> sourceRow = sourceSheet.getRow(i); </p><
91、;p> if (sourceRow != null) </p><p><b> { </b></p><p> for (j = sourceRow.getFirstCellNum(); j
92、160;< sourceRow.getLastCellNum(); j++) </p><p><b> { </b></p><p> targetSheet.setColumnWidth(j, sourceSheet.getColum
93、nWidth(j)); </p><p><b> } </b></p><p> break; </p><p><b> } </b&g
94、t;</p><p><b> } </b></p><p> //拷貝行并填充數(shù)據(jù) </p><p> for (;i <= pEndRow; i++)
95、;</p><p><b> { </b></p><p> sourceRow = sourceSheet.getRow(i); </p><p> if (sourceRow == null)&
96、#160; </p><p><b> { </b></p><p> continue; </p><p><b> } </b></p&
97、gt;<p> targetRow = targetSheet.createRow(i - pStartRow + pPosition); </p><p> targetRow.setHeight(sourceRow.getHeight());
98、;</p><p> for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++) </p><p><b> { <
99、;/b></p><p> sourceCell = sourceRow.getCell(j); </p><p> if (sourceCell == null) </p><p><b> {
100、0; </b></p><p> continue; </p><p><b> } </b></p><p> targetCell = targetRow.createCell(
101、j); </p><p> targetCell.setEncoding(sourceCell.getEncoding()); </p><p> targetCell.setCellStyle(sourceCell.getCellStyle());
102、;</p><p> cType = sourceCell.getCellType(); </p><p> targetCell.setCellType(cType); </p><p> switch (cType)
103、0; </p><p><b> { </b></p><p> case HSSFCell.CELL_TYPE_BOOLEAN: </p><p> targetCell.setCellValue(so
104、urceCell.getBooleanCellValue()); </p><p> break; </p><p> case HSSFCell.CELL_TYPE_ERROR: </p><p> target
105、Cell.setCellErrorValue(sourceCell.getErrorCellValue()); </p><p> break; </p><
106、p> case HSSFCell.CELL_TYPE_FORMULA: </p><p> //parseFormula這個(gè)函數(shù)的用途在后面說(shuō)明 </p><p> targetCell.setCellFormula(parseFormula(sourceCell.getCe
107、llFormula())); </p><p> break; </p><p> case HSSFCell.CELL_TYPE_NUMERIC: </p><p> targetCell.setCellValu
108、e(sourceCell.getNumericCellValue()); </p><p> break; </p><p> case HSSFCell.CELL_TYPE_STRING: </p><p> t
109、argetCell.setCellValue(sourceCell.getStringCellValue()); </p><p> break; </p><p><b> } </b></p><p>
110、;<b> } </b></p><p><b> } </b></p><p><b> } </b></p><p> 這個(gè)函數(shù)有兩個(gè)問(wèn)題暫時(shí)無(wú)法解決:
111、 </p><p> a、只能在同一個(gè)Workbook里面使用,跨Workbook總是拷不過(guò)去,不知道為什么? </p><p> b、由于在拷貝行時(shí)也把行高也拷過(guò)去了,如果往這些單元格里寫(xiě)入的數(shù)據(jù)長(zhǎng)度超過(guò)單元格長(zhǎng)度,那么他們不會(huì)自動(dòng)調(diào)整行高! &l
112、t;/p><p> 3、公式的問(wèn)題 </p><p> POI對(duì)Excel公式的支持是相當(dāng)好的,但是我發(fā)現(xiàn)一個(gè)問(wèn)題,如果公式里面的函數(shù)不帶參數(shù),比如now()或today(),那么你通過(guò) getCellFormula()取出來(lái)的值就是now(ATTR(semiVolatile))和today(ATTR (semiVolati
113、le)),這樣的值寫(xiě)入Excel是會(huì)出錯(cuò)的,這也是我上面copyRow的函數(shù)在寫(xiě)入公式前要調(diào)用parseFormula的原 因,parseFormula這個(gè)函數(shù)的功能很簡(jiǎn)單,就是把ATTR(semiVolatile)刪掉,我把它的代碼貼出來(lái): </p><p> private String parseFormula(String
114、60;pPOIFormula) </p><p><b> { </b></p><p> final String cstReplaceString = "ATTR(semiVolatile)"; //
115、$NON-NLS-1$ </p><p> StringBuffer result = null; </p><p> int index; </p><p> result
116、0;= new StringBuffer(); </p><p> index = pPOIFormula.indexOf(cstReplaceString); </p><p> if (index >= 0)
117、0; </p><p><b> { </b></p><p> result.append(pPOIFormula.substring(0, index)); </p><p> result.appe
118、nd(pPOIFormula.substring(index + cstReplaceString.length())); </p><p><b> } </b></p><p><b> else
119、0;</b></p><p><b> { </b></p><p> result.append(pPOIFormula); </p><p><b> } </b>
120、</p><p> return result.toString(); </p><p><b> } </b></p><p> 至于為什么會(huì)出現(xiàn)ATTR(semiVolatile),還需要大家的探索精神!
121、60; </p><p> 4、向Excel寫(xiě)入圖片的問(wèn)題。 </p><p> 我上POI論壇查相關(guān)帖子,得到兩種結(jié)論: </p><p> 1、不支持寫(xiě)入圖片; </p><p> 2
122、、支持寫(xiě)入圖片,通過(guò)EscherGraphics2d這個(gè)Class實(shí)現(xiàn)。于是我就去查EscherGraphics2d這個(gè)Class,發(fā)現(xiàn) 這個(gè)Class提供了N個(gè)drawImage方法,喜出望外的我開(kāi)始寫(xiě)代碼,結(jié)果調(diào)了一天,一直看不到效果,黔驢技窮的我在萬(wàn)般無(wú)奈下只好跟蹤進(jìn) drawImage這個(gè)函數(shù)內(nèi)部,經(jīng)過(guò)N個(gè)函數(shù)調(diào)用后在最底層函數(shù)發(fā)現(xiàn)了最終答案: </p>
123、;<p> public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, </p><
124、p> int sx2, int sy2, Color bgColor, ImageObserver imageobserver) </p><p><b> { </b></p><p> if&
125、#160;(logger.check( POILogger.WARN )) </p><p> logger.log(POILogger.WARN,"drawImage() not supported"); </p><p> retu
126、rn true; </p><p><b> } </b></p><p> 所以我強(qiáng)烈建議大家,以后使用第三方開(kāi)發(fā)包一定盡量下載它的源代碼,這樣你在碰到問(wèn)題時(shí),看看它的的內(nèi)部是怎么實(shí)現(xiàn)的,很多時(shí)候就可以不必重蹈我的 覆轍了。既然POI不能寫(xiě)入圖片,那我
127、們只能把目光投向JXL,我用JXL寫(xiě)入圖片功能是實(shí)現(xiàn)了,付出的代價(jià)是now()和today()這些函數(shù)丟失掉 了,魚(yú)與熊掌不能兼得吧。 </p><p> ==========================jsp操作=============================== </p><
128、;p> <%@ page contentType="application/msexcel;charset=gb2312" %> </p><p> response.setHeader("Content-disposition","inline; file
129、name=test1.xls"); </p><p> //以上這行設(shè)定傳送到前端瀏覽器時(shí)的檔名為test1.xls </p><p> //就是靠這一行,讓前端瀏覽器以為接收到一個(gè)excel檔 </p><p>
130、; 下面正常顯示要轉(zhuǎn)化的表 </p><p> -------------------------------------------------------------------------- </p><p><b> 介紹: &l
131、t;/b></p><p> Jakarta_POI 使用Java讀寫(xiě)Excel(97-2002)文件,可以滿(mǎn)足大部分的需要。 </p><p> 因?yàn)閯偤糜幸粋€(gè)項(xiàng)目使用到了這個(gè)工具,花了點(diǎn)時(shí)間順便翻譯了一下POI本身 </p><p> 帶的一個(gè)Gui
132、de.有一些節(jié)減和修改,希望給使用這個(gè)項(xiàng)目的人一些入門(mén)幫助。 </p><p> POI 下面有幾個(gè)自項(xiàng)目:HSSF用來(lái)實(shí)現(xiàn)Excel 的讀寫(xiě).以下是HSSF的主頁(yè) </p><p> http://jakarta.apache.org/poi/hssf/index.html
133、 </p><p> 下面的介紹是基于以下地址的翻譯: </p><p> http://jakarta.apache.org/poi/hssf/quick-guide.html </p><p> 目前的版本為1.51
134、應(yīng)該是很長(zhǎng)時(shí)間之內(nèi)的一個(gè)穩(wěn)定版,但HSSF提供的Sample不是基于 </p><p> 1.51所寫(xiě),所以使用的時(shí)候需要適當(dāng)?shù)淖⒁? </p><p> 其實(shí)POI下面的幾個(gè)子項(xiàng)目側(cè)重不同讀寫(xiě) Word 的HDF正在開(kāi)發(fā)當(dāng)中.
135、</p><p> XML下的FOP(http://xml.apache.org/fop/index.html) </p><p> 可以輸出pdf文件,也是比較好的一個(gè)工具 </p><p><b> 目錄:
136、</b></p><p> 創(chuàng)建一個(gè)workbook </p><p> 創(chuàng)建一個(gè)sheet </p><p> 創(chuàng)建cells </p><p> 創(chuàng)建日期cells
137、60; </p><p> 設(shè)定單元格格式 </p><p><b> 說(shuō)明: </b></p><p> 以下可能需要使用到如下的類(lèi) </p><p>
138、 import org.apache.poi.hssf.usermodel.HSSFCell; </p><p> import org.apache.poi.hssf.usermodel.HSSFCellStyle; </p><p> import org.ap
139、ache.poi.hssf.usermodel.HSSFDataFormat; </p><p> import org.apache.poi.hssf.usermodel.HSSFFont; </p><p> import org.apache.poi.hssf.user
140、model.HSSFRow; </p><p> import org.apache.poi.hssf.usermodel.HSSFSheet; </p><p> import org.apache.poi.hssf.usermodel.HSSFWorkbook;
141、; </p><p> import org.apache.poi.hssf.util.HSSFColor; </p><p> 創(chuàng)建workbook </p><p> HSSFWorkbook wb =
142、 new HSSFWorkbook(); </p><p> //使用默認(rèn)的構(gòu)造方法創(chuàng)建workbook </p><p> FileOutputStream fileOut = new FileOutputStream("
143、workbook.xls"); </p><p> //指定文件名 </p><p> wb.write(fileOut); </p><p> //輸出到文件 &
144、lt;/p><p> fileOut.close(); </p><p> 創(chuàng)建一個(gè)sheet </p><p> HSSFWorkbook wb = new HSSFWorkbook();
145、0;</p><p> HSSFSheet sheet1 = wb.createSheet("new sheet"); </p><p> //workbook創(chuàng)建sheet </p><p> HSSFSh
146、eet sheet2 = wb.createSheet("second sheet"); </p><p> //workbook創(chuàng)建另外的sheet </p><p> FileOutputStream fileOut
147、160;= new FileOutputStream("workbook.xls"); </p><p> wb.write(fileOut); </p><p> fileOut.close(); </
148、p><p> 創(chuàng)建cells </p><p> HSSFWorkbook wb = new HSSFWorkbook(); </p><p> HSSFSheet sheet = wb.createSh
149、eet("new sheet"); </p><p> //注意以下的代碼很多方法的參數(shù)是short 而不是int 所以需要做一次類(lèi)型轉(zhuǎn)換 </p><p> HSSFRow row = sheet.createR
150、ow((short)0); </p><p> //sheet 創(chuàng)建一行 </p><p> HSSFCell cell = row.createCell((short)0); </p><
151、;p> //行創(chuàng)建一個(gè)單元格 </p><p> cell.setCellValue(1); </p><p> //設(shè)定單元格的值 </p><p> //值的類(lèi)型參數(shù)有多中double ,Strin
152、g ,boolean, </p><p> row.createCell((short)1).setCellValue(1.2); </p><p> row.createCell((short)2).setCellValue("This is a
153、60;string"); </p><p> row.createCell((short)3).setCellValue(true); </p><p> // Write the output to a file
154、 </p><p> FileOutputStream fileOut = new FileOutputStream("workbook.xls"); </p><p> wb.write(fileOut); &
155、#160;</p><p> fileOut.close(); </p><p> 創(chuàng)建日期cells </p><p> HSSFWorkbook wb = new HSSFWorkbook();
156、0; </p><p> HSSFSheet sheet = wb.createSheet("new sheet"); </p><p> HSSFRow row = sheet.createRow((short)0);
157、; </p><p> HSSFCell cell = row.createCell((short)0); </p><p> //設(shè)定值為日期 </p><p> cell.setCellValue(new
158、0;Date()); </p><p> HSSFCellStyle cellStyle = wb.createCellStyle(); </p><p> //指定日期顯示格式 </p><p&g
159、t; cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm")); </p><p> cell = row.createCell((short)1); </p><p>
160、cell.setCellValue(new Date()); </p><p> //設(shè)定單元格日期顯示格式 </p><p> cell.setCellStyle(cellStyle); </p><p> F
161、ileOutputStream fileOut = new FileOutputStream("workbook.xls"); </p><p> wb.write(fileOut); </p><p> fileOut.close()
162、; </p><p> 設(shè)定單元格格式 </p><p> 單元格格式的設(shè)定有很多形式包括單元格的對(duì)齊方式,內(nèi)容的字體設(shè)置, </p><p> 單元格的背景色等,因?yàn)樾问奖容^多,只舉一些例子.以下的例子在
163、60; </p><p> POI1.5中可能會(huì)有所改變具體查看API. </p><p> .......... </p><p> // Aqua background <
164、;/p><p> HSSFCellStyle style = wb.createCellStyle(); </p><p> //創(chuàng)建一個(gè)樣式 </p><p> style.setFillBackgroundColor(HSSFCellSt
165、yle.AQUA); </p><p> //設(shè)定此樣式的的背景顏色填充 </p><p> style.setFillPattern(HSSFCellStyle.BIG_SPOTS); </p><p> //樣式的填充
166、類(lèi)型。 </p><p> //有多種式樣如: </p><p> //HSSFCellStyle.BIG_SPOTS </p><p> //HSSFCellStyle.FINE_DOTS &
167、#160; </p><p> //HSSFCellStyle.SPARSE_DOTS等 </p><p> style.setAlignment(HSSFCellStyle.ALIGN_CENTER ); </p><p> //居中對(duì)齊
168、0; </p><p> style.setFillBackgroundColor(HSSFColor.GREEN.index); </p><p> //設(shè)定單元個(gè)背景顏色 </p><p> style.setFillForeg
169、roundColor(HSSFColor.RED.index); </p><p> //設(shè)置單元格顯示顏色 </p><p> HSSFCell cell = row.createCell((short) 1);
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- poi操作excel大全
- poi導(dǎo)入導(dǎo)出excel文件
- poi控制excel方法技術(shù)
- excel操作技巧
- excel操作大全
- vb操作excel
- excel操作題庫(kù)
- excel操作技巧培訓(xùn)
- 鍵盤(pán)操作excel表格
- python對(duì)excel操作教程
- excel操作練習(xí)題
- excel操作題庫(kù) 新
- excel操作題題目
- excel操作練習(xí)題
- excel上機(jī)操作試題
- excel函數(shù)學(xué)習(xí)(高級(jí))_excel操作使用技巧大全
- excel表格的基本操作實(shí)例
- excel操作技巧與實(shí)例(大全)
- excel表格的各種基本操作
- excel操作指南描述統(tǒng)計(jì)
評(píng)論
0/150
提交評(píng)論