一.POI簡介
Jakarta POI 是apache的子項目,目標(biāo)是處理ole2對象。它提供了一組操縱Windows文檔的Java API
目前比較成熟的是HSSF接口,處理MS Excel(97-2002)對象。它不象我們僅僅是用csv生成的沒有格式的可以由Excel轉(zhuǎn)換的東西,而是真正的Excel對象,你可以控制一些屬性如sheet,cell等等。
二.HSSF概況
HSSF 是Horrible SpreadSheet Format的縮寫,也即“討厭的電子表格格式”。也許HSSF的名字有點滑稽,就本質(zhì)而言它是一個非常嚴(yán)肅、正規(guī)的API。通過HSSF,你可以用純Java代碼來讀取、寫入、修改Excel文件。
HSSF 為讀取操作提供了兩類API:usermodel和eventusermodel,即“用戶模型”和“事件-用戶模型”。前者很好理解,后者比較抽象,但操作效率要高得多。
三.開始編碼
1 . 準(zhǔn)備工作
要求:JDK 1.4+POI開發(fā)包
可以到
http://www.apache.org/dyn/closer.cgi/jakarta/poi/
最新的POI工具包
2 . EXCEL 結(jié)構(gòu)
HSSFWorkbook excell 文檔對象介紹
HSSFSheet excell的表單
HSSFRow excell的行
HSSFCell excell的格子單元
HSSFFont excell字體
HSSFName 名稱
HSSFDataFormat 日期格式
在poi1.7中才有以下2項:
HSSFHeader sheet頭
HSSFFooter sheet尾
和這個樣式
HSSFCellStyle cell樣式
輔助操作包括
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 錯誤信息表
3 .具體用法實例 (采用 usermodel )
如何讀Excel
讀取Excel文件時,首先生成一個POIFSFileSystem對象,由POIFSFileSystem對象構(gòu)造一個HSSFWorkbook,該HSSFWorkbook對象就代表了Excel文檔。下面代碼讀取上面生成的Excel文件寫入的消息字串:
try{
?? POIFSFileSystem fs=new POIFSFileSystem(new FileInputStream("d:/workbook.xls"));
?? HSSFWorkbook wb = new HSSFWorkbook(fs);
?? HSSFSheet sheet = wb.getSheetAt(0);
?? HSSFRow row = sheet.getRow(0);
?? HSSFCell cell = row.getCell((short) 0);
?? String msg = cell.getStringCellValue();
?? System.out.println(msg);
? }catch(Exception e){
?? e.printStackTrace();
? }
如何寫excel,
將excel的第一個表單第一行的第一個單元格的值寫成“a test”。
POIFSFileSystem fs =new POIFSFileSystem(new FileInputStream("workbook.xls"));
??? HSSFWorkbook wb = new HSSFWorkbook(fs);
??? HSSFSheet sheet = wb.getSheetAt(0);
??? HSSFRow row = sheet.getRow(0);
??? HSSFCell cell = row.getCell((short)0);
??? cell.setCellValue("a test");
??? // Write the output to a file
??? FileOutputStream fileOut = new FileOutputStream("workbook.xls");
??? wb.write(fileOut);
fileOut.close();
4 . 可參考文檔
POI 主頁:
http://jakarta.apache.org/poi/
,
初學(xué)者如何快速上手使用POI HSSF
http://jakarta.apache.org/poi/hssf/quick-guide.html
。
里面有很多例子代碼,可以很方便上手。
四.使用心得
POI HSSF 的usermodel包把Excel文件映射成我們熟悉的結(jié)構(gòu),諸如Workbook、Sheet、Row、Cell等,它把整個結(jié)構(gòu)以一組對象的形式保存在內(nèi)存之中,便于理解,操作方便,基本上能夠滿足我們的要求,所以說這個一個不錯的選擇。
-------------------------------
前面已經(jīng)講過利用POI讀寫Excel,下面是一個用POI向Excel中插入圖片的例子。
官方文檔:
Images are part of the drawing support. To add an image just call createPicture() on the drawing patriarch. At the time of writing the following types are supported:
PNG
JPG
DIB
It is not currently possible to read existing images and it should be noted that any existing drawings may be erased once you add a image to a sheet.
// Create the drawing patriarch. This is the top level container for
// all shapes. This will clear out any existing shapes for that sheet.
通過HSSFPatriarch類createPicture方法的在指定的wb中的sheet創(chuàng)建圖片,它接受二個參數(shù),第一個是HSSFClientAnchor,設(shè)定圖片的大小。
?1
package
?com.poi.hssf.test;
?2
?3
import
?java.io.FileOutputStream;
?4
import
?java.io.File;
?5
import
?java.io.ByteArrayOutputStream;
?6
import
?java.io.IOException;
?7
?8
import
?java.awt.image.BufferedImage;
?9
import
?javax.imageio.
*
;
10
11
import
?org.apache.poi.hssf.usermodel.HSSFWorkbook;
12
import
?org.apache.poi.hssf.usermodel.HSSFSheet;
13
import
?org.apache.poi.hssf.usermodel.HSSFPatriarch;
14
import
?org.apache.poi.hssf.usermodel.HSSFClientAnchor;;
15
16
public
?
class
?TestPOI?
{
17
18
????
public
?
static
?
void
?main(String[]?args)?
{
19
????????????FileOutputStream?fileOut?
=
?
null
;
20
????????????BufferedImage?bufferImg?
=
null
;
21
????????????BufferedImage?bufferImg1?
=
?
null
;
22
????????????
try
{
23
????????????????
24
??????????
//
先把讀進(jìn)來的圖片放到一個ByteArrayOutputStream中,以便產(chǎn)生ByteArray
25
??????????ByteArrayOutputStream?byteArrayOut?
=
?
new
?ByteArrayOutputStream();
26
??????????ByteArrayOutputStream?byteArrayOut1?
=
?
new
?ByteArrayOutputStream();
27
??????????bufferImg?
=
?ImageIO.read(
new
?File(
"
d:/PieChart.jpg
"
));
28
??????????bufferImg1?
=
?ImageIO.read(
new
?File(
"
d:/fruitBarChart.jpg
"
));
29
??????????ImageIO.write(bufferImg,
"
jpg
"
,byteArrayOut);
30
??????????ImageIO.write(bufferImg1,
"
jpg
"
,byteArrayOut1);
31
??????????
32
????????
//
創(chuàng)建一個工作薄
33
????????HSSFWorkbook?wb?
=
?
new
?HSSFWorkbook();
34
????????HSSFSheet?sheet1?
=
?wb.createSheet(
"
new?sheet
"
);
35
????????
//
HSSFRow?row?=?sheet1.createRow(2);
36
????????HSSFPatriarch?patriarch?
=
?sheet1.createDrawingPatriarch();
37
????????HSSFClientAnchor?anchor?
=
?
new
?HSSFClientAnchor(
0
,
0
,
512
,
255
,(
short
)?
1
,
1
,(
short
)
10
,
20
);
38
????????HSSFClientAnchor?anchor1?
=
?
new
?HSSFClientAnchor(
0
,
0
,
512
,
255
,(
short
)?
2
,
30
,(
short
)
10
,
60
);
39
????????anchor1.setAnchorType(
2
);
40
????????
//
插入圖片
41
????????patriarch.createPicture(anchor?,?wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
42
????????patriarch.createPicture(anchor1?,?wb.addPicture(byteArrayOut1.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
43
????????
44
????????????fileOut?
=
?
new
?FileOutputStream(
"
d:/workbook.xls
"
);
45
????????????
//
寫入excel文件
46
????????????wb.write(fileOut);
47
????????????fileOut.close();
48
????????
49
????????????}
catch
(IOException?io)
{
50
????????????????????io.printStackTrace();
51
????????????????????System.out.println(
"
io?erorr?:??
"
+
?io.getMessage());
52
????????????}
?
finally
53
????????????
{
54
????????????????
if
?(fileOut?
!=
?
null
)
55
????????????????
{
56
???????????????????????????
57
????????????????????
try
?
{
58
??????????????????????????????fileOut.close();
59
?????????????????????????}
60
????????????????????
catch
?(IOException?e)
61
????????????????????
{
62
????????????????????????????
//
?TODO?Auto-generated?catch?block
63
????????????????????????????e.printStackTrace();
64
?????????????????????}
65
????????????????}
66
????????????}
67
????}
68
}