1.POI結構與常用類
包名稱 說明HSSF 提供讀寫Microsoft Excel XLS格式檔案的功能。XSSF 提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能。HWPF 提供讀寫Microsoft Word DOC格式檔案的功能。HSLF 提供讀寫Microsoft PowerPoint格式檔案的功能。HDGF 提供讀Microsoft Visio格式檔案的功能。HPBF 提供讀Microsoft Publisher格式檔案的功能。HSMF 提供讀Microsoft Outlook格式檔案的功能。
類名 說明
HSSFWorkbook Excel的文檔對象
HSSFSheet Excel的表單
HSSFRow Excel的行
HSSFCell Excel的格子單元
HSSFFont Excel字體
HSSFDataFormat 格子單元的日期格式
HSSFHeader Excel文檔Sheet的頁眉
HSSFFooter Excel文檔Sheet的頁腳
HSSFCellStyle 格子單元樣式
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 錯誤信息表
2.Excel的基本操作
public class Test00
{
public static void main(String[] args) throws IOException
{
String filePath="d:\\users\\lizw\\桌面\\POI\\sample.xls";//文件路徑
HSSFWorkbook workbook = new HSSFWorkbook();//創建Excel文件(Workbook)
HSSFSheet sheet = workbook.createSheet();//創建工作表(Sheet)
sheet = workbook.createSheet("Test");//創建工作表(Sheet)
FileOutputStream out = new FileOutputStream(filePath);
workbook.write(out);//保存Excel文件
out.close();//關閉文件流
System.out.println("OK!");
}
}
HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row = sheet.createRow(0);// 創建行,從0開始
HSSFCell cell = row.createCell(0);// 創建行的單元格,也是從0開始
cell.setCellValue("李志偉");// 設置單元格內容
row.createCell(1).setCellValue(false);// 設置單元格內容,重載
row.createCell(2).setCellValue(new Date());// 設置單元格內容,重載
row.createCell(3).setCellValue(12.345);// 設置單元格內容,重載

workbook.createInformationProperties();//創建文檔信息
DocumentSummaryInformation dsi= workbook.getDocumentSummaryInformation();//摘要信息
dsi.setCategory("類別:Excel文件");//類別
dsi.setManager("管理者:李志偉");//管理者
dsi.setCompany("公司:--");//公司
SummaryInformation si = workbook.getSummaryInformation();//摘要信息
si.setSubject("主題:--");//主題
si.setTitle("標題:測試文檔");//標題
si.setAuthor("作者:李志偉");//作者
si.setComments("備注:POI測試文檔");//備注

HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFPatriarch patr = sheet.createDrawingPatriarch();
HSSFClientAnchor anchor = patr.createAnchor(0, 0, 0, 0, 5, 1, 8, 3);//創建批注位置
HSSFComment comment = patr.createCellComment(anchor);//創建批注
comment.setString(new HSSFRichTextString("這是一個批注段落!"));//設置批注內容
comment.setAuthor("李志偉");//設置批注作者
comment.setVisible(true);//設置批注默認顯示
HSSFCell cell = sheet.createRow(2).createCell(1);
cell.setCellValue("測試");
cell.setCellComment(comment);//把批注賦值給單元格

dx1 第1個單元格中x軸的偏移量
dy1 第1個單元格中y軸的偏移量
dx2 第2個單元格中x軸的偏移量
dy2 第2個單元格中y軸的偏移量
col1 第1個單元格的列號
row1 第1個單元格的行號
col2 第2個單元格的列號
row2 第2個單元格的行號
HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFHeader header =sheet.getHeader();//得到頁眉
header.setLeft("頁眉左邊");
header.setRight("頁眉右邊");
header.setCenter("頁眉中間");
HSSFFooter footer =sheet.getFooter();//得到頁腳
footer.setLeft("頁腳左邊");
footer.setRight("頁腳右邊");
footer.setCenter("頁腳中間");

HSSFHeader.tab &A 表名
HSSFHeader.file &F 文件名
HSSFHeader.startBold &B 粗體開始
HSSFHeader.endBold &B 粗體結束
HSSFHeader.startUnderline &U 下划線開始
HSSFHeader.endUnderline &U 下划線結束
HSSFHeader.startDoubleUnderline &E 雙下划線開始
HSSFHeader.endDoubleUnderline &E 雙下划線結束
HSSFHeader.time &T 時間
HSSFHeader.date &D 日期
HSSFHeader.numPages &N 總頁面數
HSSFHeader.page &P 當前頁號
3.Excel的單元格操作
HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row=sheet.createRow(0);
//設置日期格式--使用Excel內嵌的格式
HSSFCell cell=row.createCell(0);
cell.setCellValue(new Date());
HSSFCellStyle style=workbook.createCellStyle();
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
cell.setCellStyle(style);
//設置保留2位小數--使用Excel內嵌的格式
cell=row.createCell(1);
cell.setCellValue(12.3456789);
style=workbook.createCellStyle();
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
cell.setCellStyle(style);
//設置貨幣格式--使用自定義的格式
cell=row.createCell(2);
cell.setCellValue(12345.6789);
style=workbook.createCellStyle();
style.setDataFormat(workbook.createDataFormat().getFormat("¥#,##0"));
cell.setCellStyle(style);
//設置百分比格式--使用自定義的格式
cell=row.createCell(3);
cell.setCellValue(0.123456789);
style=workbook.createCellStyle();
style.setDataFormat(workbook.createDataFormat().getFormat("0.00%"));
cell.setCellStyle(style);
//設置中文大寫格式--使用自定義的格式
cell=row.createCell(4);
cell.setCellValue(12345);
style=workbook.createCellStyle();
style.setDataFormat(workbook.createDataFormat().getFormat("[DbNum2][$-804]0"));
cell.setCellStyle(style);
//設置科學計數法格式--使用自定義的格式
cell=row.createCell(5);
cell.setCellValue(12345);
style=workbook.createCellStyle();
style.setDataFormat(workbook.createDataFormat().getFormat("0.00E+00"));
cell.setCellStyle(style);

HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row=sheet.createRow(0);
//合並列
HSSFCell cell=row.createCell(0);
cell.setCellValue("合並列");
CellRangeAddress region=new CellRangeAddress(0, 0, 0, 5);
sheet.addMergedRegion(region);
//合並行
cell=row.createCell(6);
cell.setCellValue("合並行");
region=new CellRangeAddress(0, 5, 6, 6);
sheet.addMergedRegion(region);

firstRow 區域中第一個單元格的行號
lastRow 區域中最后一個單元格的行號
firstCol 區域中第一個單元格的列號
lastCol 區域中最后一個單元格的列號
HSSFCell cell=row.createCell(0);
cell.setCellValue("單元格對齊");
HSSFCellStyle style=workbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
style.setWrapText(true);//自動換行
style.setIndention((short)5);//縮進
style.setRotation((short)60);//文本旋轉,這里的取值是從-90到90,而不是0-180度。
cell.setCellStyle(style);

如果是左側對齊就是 HSSFCellStyle.ALIGN_FILL;
如果是居中對齊就是 HSSFCellStyle.ALIGN_CENTER;
如果是右側對齊就是 HSSFCellStyle.ALIGN_RIGHT;
如果是跨列舉中就是 HSSFCellStyle.ALIGN_CENTER_SELECTION;
如果是兩端對齊就是 HSSFCellStyle.ALIGN_JUSTIFY;
如果是填充就是 HSSFCellStyle.ALIGN_FILL;
如果是靠上就是 HSSFCellStyle.VERTICAL_TOP;
如果是居中就是 HSSFCellStyle.VERTICAL_CENTER;
如果是靠下就是 HSSFCellStyle.VERTICAL_BOTTOM;
如果是兩端對齊就是 HSSFCellStyle.VERTICAL_JUSTIFY;
邊框相關屬性
|
說明
|
范例
|
Border+方向
|
邊框類型
|
BorderLeft, BorderRight等
|
方向+BorderColor
|
邊框顏色
|
TopBorderColor,BottomBorderColor等
|
HSSFCell cell=row.createCell(1);
cell.setCellValue("設置邊框");
HSSFCellStyle style=workbook.createCellStyle();
style.setBorderTop(HSSFCellStyle.BORDER_DOTTED);//上邊框
style.setBorderBottom(HSSFCellStyle.BORDER_THICK);//下邊框
style.setBorderLeft(HSSFCellStyle.BORDER_DOUBLE);//左邊框
style.setBorderRight(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);//右邊框
style.setTopBorderColor(HSSFColor.RED.index);//上邊框顏色
style.setBottomBorderColor(HSSFColor.BLUE.index);//下邊框顏色
style.setLeftBorderColor(HSSFColor.GREEN.index);//左邊框顏色
style.setRightBorderColor(HSSFColor.PINK.index);//右邊框顏色
cell.setCellStyle(style);

邊框范例圖
|
對應的靜態值
|
|
HSSFCellStyle.BORDER_DOTTED
|
|
HSSFCellStyle.BORDER_HAIR
|
|
HSSFCellStyle.BORDER_DASH_DOT_DOT
|
|
HSSFCellStyle.BORDER_DASH_DOT
|
|
HSSFCellStyle.BORDER_DASHED
|
|
HSSFCellStyle.BORDER_THIN
|
|
HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT
|
|
HSSFCellStyle.BORDER_SLANTED_DASH_DOT
|
|
HSSFCellStyle.BORDER_MEDIUM_DASH_DOT
|
|
HSSFCellStyle.BORDER_MEDIUM_DASHED
|
|
HSSFCellStyle.BORDER_MEDIUM
|
|
HSSFCellStyle.BORDER_THICK
|
|
HSSFCellStyle.BORDER_DOUBLE |
HSSFCell cell = row.createCell(1);
cell.setCellValue("設置字體");
HSSFCellStyle style = workbook.createCellStyle();
HSSFFont font = workbook.createFont();
font.setFontName("華文行楷");//設置字體名稱
font.setFontHeightInPoints((short)28);//設置字號
font.setColor(HSSFColor.RED.index);//設置字體顏色
font.setUnderline(FontFormatting.U_SINGLE);//設置下划線
font.setTypeOffset(FontFormatting.SS_SUPER);//設置上標下標
font.setStrikeout(true);//設置刪除線
style.setFont(font);
cell.setCellStyle(style);

HSSFCellStyle style = workbook.createCellStyle();
style.setFillForegroundColor(HSSFColor.GREEN.index);//設置圖案顏色
style.setFillBackgroundColor(HSSFColor.RED.index);//設置圖案背景色
style.setFillPattern(HSSFCellStyle.SQUARES);//設置圖案樣式
cell.setCellStyle(style);

圖案樣式
|
常量
|
|
HSSFCellStyle.NO_FILL
|
|
HSSFCellStyle.ALT_BARS
|
|
HSSFCellStyle.FINE_DOTS
|
|
HSSFCellStyle.SPARSE_DOTS
|
|
HSSFCellStyle.LESS_DOTS
|
|
HSSFCellStyle.LEAST_DOTS
|
|
HSSFCellStyle.BRICKS
|
|
HSSFCellStyle.BIG_SPOTS
|
|
HSSFCellStyle.THICK_FORWARD_DIAG
|
|
HSSFCellStyle.THICK_BACKWARD_DIAG
|
|
HSSFCellStyle.THICK_VERT_BANDS
|
|
HSSFCellStyle.THICK_HORZ_BANDS
|
|
HSSFCellStyle.THIN_HORZ_BANDS
|
|
HSSFCellStyle.THIN_VERT_BANDS
|
|
HSSFCellStyle.THIN_BACKWARD_DIAG
|
|
HSSFCellStyle.THIN_FORWARD_DIAG
|
|
HSSFCellStyle.SQUARES
|
|
HSSFCellStyle.DIAMONDS
|
HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row = sheet.createRow(1);
HSSFCell cell = row.createCell(1);
cell.setCellValue("123456789012345678901234567890");
sheet.setColumnWidth(1, 31 * 256);//設置第一列的寬度是31個字符寬度
row.setHeightInPoints(50);//設置行的高度是50個點

HSSFCell cell = row.createCell(1);
cell.setCellValue(new Date());//設置日期數據
System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:false
HSSFCellStyle style =workbook.createCellStyle();
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
cell.setCellStyle(style);//設置日期樣式
System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:true
4.使用Excel公式
HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellFormula("2+3*4");//設置公式
cell = row.createCell(1);
cell.setCellValue(10);
cell = row.createCell(2);
cell.setCellFormula("A1*B1");//設置公式

HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue(1);
row.createCell(1).setCellValue(2);
row.createCell(2).setCellValue(3);
row.createCell(3).setCellValue(4);
row.createCell(4).setCellValue(5);
row = sheet.createRow(1);
row.createCell(0).setCellFormula("sum(A1,C1)");//等價於"A1+C1"
row.createCell(1).setCellFormula("sum(B1:D1)");//等價於"B1+C1+D1"

HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFCellStyle style=workbook.createCellStyle();
style.setDataFormat(workbook.createDataFormat().getFormat("yyyy-mm-dd"));
HSSFRow row = sheet.createRow(0);
Calendar date=Calendar.getInstance();//日歷對象
HSSFCell cell=row.createCell(0);
date.set(2011,2, 7);
cell.setCellValue(date.getTime());
cell.setCellStyle(style);//第一個單元格開始時間設置完成
cell=row.createCell(1);
date.set(2014,4, 25);
cell.setCellValue(date.getTime());
cell.setCellStyle(style);//第一個單元格結束時間設置完成
cell=row.createCell(3);
cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"y\"),\"年\")");
cell=row.createCell(4);
cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"m\"),\"月\")");
cell=row.createCell(5);
cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"d\"),\"日\")");

DATEDIF(A1,B1,\"y\"):取得A1單元格的日期與B1單元格的日期的時間間隔。(“y”:表示以年為單位,”m”表示以月為單位;”d”表示以天為單位)。
HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue("abcdefg");
row.createCell(1).setCellValue("aa bb cc dd ee fF GG");
row.createCell(3).setCellFormula("UPPER(A1)");
row.createCell(4).setCellFormula("PROPER(B1)");

UPPER(String):將文本轉換成大寫形式。
HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue(12);
row.createCell(1).setCellValue(23);
row.createCell(3).setCellFormula("IF(A1>B1,\"A1大於B1\",\"A1小於等於B1\")");

HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue(57);
row.createCell(1).setCellValue(89);
row.createCell(2).setCellValue(56);
row.createCell(3).setCellValue(67);
row.createCell(4).setCellValue(60);
row.createCell(5).setCellValue(73);
row.createCell(7).setCellFormula("COUNTIF(A1:F1,\">=60\")");
row.createCell(8).setCellFormula("SUMIF(A1:F1,\">=60\",A1:F1)");

HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue(0);
row.createCell(1).setCellValue(59);
row.createCell(2).setCellValue("不及格");
row = sheet.createRow(1);
row.createCell(0).setCellValue(60);
row.createCell(1).setCellValue(69);
row.createCell(2).setCellValue("及格");
row = sheet.createRow(2);
row.createCell(0).setCellValue(70);
row.createCell(1).setCellValue(79);
row.createCell(2).setCellValue("良好");
row = sheet.createRow(3);
row.createCell(0).setCellValue(80);
row.createCell(1).setCellValue(100);
row.createCell(2).setCellValue("優秀");
row = sheet.createRow(4);
row.createCell(0).setCellValue(75);
row.createCell(1).setCellFormula("LOOKUP(A5,$A$1:$A$4,$C$1:$C$4)");
row.createCell(2).setCellFormula("VLOOKUP(A5,$A$1:$C$4,3,true)");

LOOKUP(lookup_value,lookup_vector,result_vector),第一個參數:需要查找的內容,本例中指向A5單元格,也就是75;第二個參數:比較對象區域,本例中的成績需要與$A$1:$A$4中的各單元格中的值進行比較;第三個參數:查找結果區域,如果匹配到會將此區域中對應的數據返回。如本例中返回$C$1:$C$4中對應的值。
VLOOKUP(lookup_value,lookup_area,result_col,is_fuzzy ),第一個參數:需要查找的內容,這里是A5單元格;第二個參數:需要比較的表,這里是$A$1:$C$4,注意VLOOKUP匹配時只與表中的第一列進行匹配。第三個參數:匹配結果對應的列序號。這里要對應的是成績列,所以為3。第四個參數:指明是否模糊匹配。例子中的TRUE表示模糊匹配,與上例中一樣。匹配到的是第三行。如果將此參數改為FALSE,因為在表中的第1列中找不到75,所以會報“#N/A”的計算錯誤。
HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row = sheet.createRow(0);
row.createCell(0).setCellFormula("RAND()");//取0-1之間的隨機數
row.createCell(1).setCellFormula("int(RAND()*100)");//取0-100之間的隨機整數
row.createCell(2).setCellFormula("rand()*10+10");//取10-20之間的隨機實數
row.createCell(3).setCellFormula("CHAR(INT(RAND()*26)+97)");//隨機小寫字母
row.createCell(4).setCellFormula("CHAR(INT(RAND()*26)+65)");//隨機大寫字母
//隨機大小寫字母
row.createCell(5).setCellFormula("CHAR(INT(RAND()*26)+if(INT(RAND()*2)=0,97,65))");

HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue(7);//A1
row.createCell(1).setCellValue(8);//B1
HSSFCell cell=row.createCell(2);
cell.setCellFormula("A1*B1+14");
HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook);
cell = e.evaluateInCell(cell);//若Excel文件不是POI創建的,則不必調用此方法
System.out.println("公式計算結果:"+cell.getNumericCellValue());

5.使用圖形
HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFPatriarch patriarch=sheet.createDrawingPatriarch();
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short)1, 0,(short)4, 4);
HSSFSimpleShape line = patriarch.createSimpleShape(anchor);
line.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);//設置圖形類型
line.setLineStyle(HSSFShape.LINESTYLE_SOLID);//設置圖形樣式
line.setLineWidth(6350);//在POI中線的寬度12700表示1pt,所以這里是0.5pt粗的線條。


HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFPatriarch patriarch=sheet.createDrawingPatriarch();
HSSFClientAnchor anchor = new HSSFClientAnchor(255,122, 255, 122, (short)1, 0,(short)4, 3);
HSSFSimpleShape rec = patriarch.createSimpleShape(anchor);
rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
rec.setLineStyle(HSSFShape.LINESTYLE_DASHGEL);//設置邊框樣式
rec.setFillColor(255, 0, 0);//設置填充色
rec.setLineWidth(25400);//設置邊框寬度
rec.setLineStyleColor(0, 0, 255);//設置邊框顏色


HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
HSSFRow row = sheet.createRow(2);
row.createCell(1);
row.setHeightInPoints(240);
sheet.setColumnWidth(2, 9000);
int linesCount = 20;
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
//因為HSSFClientAnchor中dx只能在0-1023之間,dy只能在0-255之間,這里采用比例的方式
double xRatio = 1023.0 / (linesCount * 10);
double yRatio = 255.0 / (linesCount * 10);
// 畫豎線
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 200;
for (int i = 0; i < linesCount; i++)
{
HSSFClientAnchor a2 = new HSSFClientAnchor();
a2.setAnchor((short) 2, 2, (int) (x1 * xRatio),
(int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio),
(int) (y2 * yRatio));
HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2);
shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
x1 += 10;
x2 += 10;
}
// 畫橫線
x1 = 0;
y1 = 0;
x2 = 200;
y2 = 0;
for (int i = 0; i < linesCount; i++)
{
HSSFClientAnchor a2 = new HSSFClientAnchor();
a2.setAnchor((short) 2, 2, (int) (x1 * xRatio),
(int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio),
(int) (y2 * yRatio));
HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2);
shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
y1 += 10;
y2 += 10;
}

HSSFSheet sheet = workbook.createSheet("Test");// 創建工作表(Sheet)
FileInputStream stream=new FileInputStream("d:\\POI\\Apache.gif");
byte[] bytes=new byte[(int)stream.getChannel().size()];
stream.read(bytes);//讀取圖片到二進制數組
int pictureIdx = workbook.addPicture(bytes, HSSFWorkbook.PICTURE_TYPE_JPEG);
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short)0, 0, (short)5, 5);
HSSFPicture pict = patriarch.createPicture(anchor, pictureIdx);
//pict.resize();//自動調節圖片大小,圖片位置信息可能丟失

InputStream inp = new FileInputStream(filePath);
HSSFWorkbook workbook = new HSSFWorkbook(inp);//讀取現有的Excel文件
List<HSSFPictureData> pictures = workbook.getAllPictures();
for(int i=0;i<pictures.size();i++)
{
HSSFPictureData pic=pictures.get(i);
String ext = pic.suggestFileExtension();
if (ext.equals("png"))//判斷文件格式
{
FileOutputStream png=new FileOutputStream("d:\\POI\\Apache.png");
png.write(pic.getData());
png.close();//保存圖片
}
}
6.Excel表操作
HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook)
workbook.createSheet("Test0");// 創建工作表(Sheet)
workbook.createSheet("Test1");// 創建工作表(Sheet)
workbook.createSheet("Test2");// 創建工作表(Sheet)
workbook.createSheet("Test3");// 創建工作表(Sheet)
workbook.setActiveSheet(2);//設置默認工作表
HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook)
workbook.createSheet("Test0");// 創建工作表(Sheet)
workbook.createSheet("Test1");// 創建工作表(Sheet)
workbook.createSheet("Test2");// 創建工作表(Sheet)
workbook.createSheet("Test3");// 創建工作表(Sheet)
workbook.setSheetName(2, "1234");//重命名工作表
HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook)
HSSFSheet sheet1= workbook.createSheet("Test0");// 創建工作表(Sheet)
HSSFSheet sheet2=workbook.createSheet("Test1");// 創建工作表(Sheet)
HSSFSheet sheet3=workbook.createSheet("Test2");// 創建工作表(Sheet)
sheet1.setZoom(1,2);//50%顯示比例
sheet2.setZoom(2,1);//200%顯示比例
sheet3.setZoom(1,10);//10%顯示比例



HSSFWorkbook workbook = new HSSFWorkbook();// 創建Excel文件(Workbook)
HSSFSheet sheet1= workbook.createSheet("Test0");// 創建工作表(Sheet)
HSSFSheet sheet2=workbook.createSheet("Test1");// 創建工作表(Sheet)
sheet1.setDisplayGridlines(false);//隱藏Excel網格線,默認值為true
sheet2.setGridsPrinted(true);//打印時顯示網格線,默認值為false

String filePath = "d:\\users\\lizw\\桌面\\POI\\sample.xls";
FileInputStream stream = new FileInputStream(filePath);
HSSFWorkbook workbook = new HSSFWorkbook(stream);//讀取現有的Excel
HSSFSheet sheet= workbook.getSheet("Test0");//得到指定名稱的Sheet
for (Row row : sheet)
{
for (Cell cell : row)
{
System.out.print(cell + "\t");
}
System.out.println();
}


7.Excel行列操作
HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
sheet.groupRow(1, 3);//組合行
sheet.groupRow(2, 4);//組合行
sheet.groupColumn(2, 7);//組合列

HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
sheet.createFreezePane(2, 3, 15, 25);//凍結行列

FileInputStream stream = new FileInputStream(filePath);
HSSFWorkbook workbook = new HSSFWorkbook(stream);
HSSFSheet sheet = workbook.getSheet("Test0");
sheet.shiftRows(2, 4, 2);//把第3行到第4行向下移動兩行


8.Excel的其他功能
HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
HSSFRow row=sheet.createRow(1);
HSSFCell cell=row.createCell(1);
cell.setCellValue("已鎖定");
HSSFCellStyle locked = workbook.createCellStyle();
locked.setLocked(true);//設置鎖定
cell.setCellStyle(locked);
cell=row.createCell(2);
cell.setCellValue("未鎖定");
HSSFCellStyle unlocked = workbook.createCellStyle();
unlocked.setLocked(false);//設置不鎖定
cell.setCellStyle(unlocked);
sheet.protectSheet("password");//設置保護密碼

HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
HSSFRow row=sheet.createRow(0);
HSSFCell cell=row.createCell(0);
cell.setCellValue("日期列");
CellRangeAddressList regions = new CellRangeAddressList(1, 65535, 0, 0);//選定一個區域
DVConstraint constraint = DVConstraint.createDateConstraint(
DVConstraint.OperatorType.BETWEEN, "1993-01-01", "2014-12-31", "yyyy-MM-dd");HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
dataValidate.createErrorBox("錯誤", "你必須輸入一個時間!");
sheet.addValidationData(dataValidate);



CellRangeAddressList regions = new CellRangeAddressList(0, 65535, 0, 0);
DVConstraint constraint = DVConstraint.createExplicitListConstraint(new String[] { "C++", "Java", "C#" });
HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
sheet.addValidationData(dataValidate);

HSSFSheet sheet= workbook.createSheet("Test0");// 創建工作表(Sheet)
HSSFPrintSetup print = sheet.getPrintSetup();//得到打印對象
print.setLandscape(false);//true,則表示頁面方向為橫向;否則為縱向
print.setScale((short)80);//縮放比例80%(設置為0-100之間的值)
print.setFitWidth((short)2);//設置頁寬
print.setFitHeight((short)4);//設置頁高
print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//紙張設置
print.setUsePage(true);//設置打印起始頁碼不使用"自動"
print.setPageStart((short)6);//設置打印起始頁碼
sheet.setPrintGridlines(true);//設置打印網格線
print.setNoColor(true);//值為true時,表示單色打印
print.setDraft(true);//值為true時,表示用草稿品質打印
print.setLeftToRight(true);//true表示“先行后列”;false表示“先列后行”
print.setNotes(true);//設置打印批注
sheet.setAutobreaks(false);//Sheet頁自適應頁面大小
HSSFSheet sheet = workbook.createSheet("Test0");
CreationHelper createHelper = workbook.getCreationHelper();
// 關聯到網站
Hyperlink link = createHelper.createHyperlink(Hyperlink.LINK_URL);
link.setAddress("http://poi.apache.org/");
sheet.createRow(0).createCell(0).setHyperlink(link);
// 關聯到當前目錄的文件
link = createHelper.createHyperlink(Hyperlink.LINK_FILE);
link.setAddress("sample.xls");
sheet.createRow(0).createCell(1).setHyperlink(link);
// e-mail 關聯
link = createHelper.createHyperlink(Hyperlink.LINK_EMAIL);
link.setAddress("mailto:poi@apache.org?subject=Hyperlinks");
sheet.createRow(0).createCell(2).setHyperlink(link);
//關聯到工作簿中的位置
link = createHelper.createHyperlink(Hyperlink.LINK_DOCUMENT);
link.setAddress("'Test0'!C3");//Sheet名為Test0的C3位置
sheet.createRow(0).createCell(3).setHyperlink(link);

9.POI對Word的基本操作
XWPFDocument doc = new XWPFDocument();// 創建Word文件
XWPFParagraph p = doc.createParagraph();// 新建一個段落
p.setAlignment(ParagraphAlignment.CENTER);// 設置段落的對齊方式
p.setBorderBottom(Borders.DOUBLE);//設置下邊框
p.setBorderTop(Borders.DOUBLE);//設置上邊框
p.setBorderRight(Borders.DOUBLE);//設置右邊框
p.setBorderLeft(Borders.DOUBLE);//設置左邊框
XWPFRun r = p.createRun();//創建段落文本
r.setText("POI創建的Word段落文本");
r.setBold(true);//設置為粗體
r.setColor("FF0000");//設置顏色
p = doc.createParagraph();// 新建一個段落
r = p.createRun();
r.setText("POI讀寫Excel功能強大、操作簡單。");
XWPFTable table= doc.createTable(3, 3);//創建一個表格
table.getRow(0).getCell(0).setText("表格1");
table.getRow(1).getCell(1).setText("表格2");
table.getRow(2).getCell(2).setText("表格3");
FileOutputStream out = new FileOutputStream("d:\\POI\\sample.doc");
doc.write(out);
out.close();

FileInputStream stream = new FileInputStream("d:\\POI\\sample.doc");
XWPFDocument doc = new XWPFDocument(stream);// 創建Word文件
for(XWPFParagraph p : doc.getParagraphs())//遍歷段落
{
System.out.print(p.getParagraphText());
}
for(XWPFTable table : doc.getTables())//遍歷表格
{
for(XWPFTableRow row : table.getRows())
{
for(XWPFTableCell cell : row.getTableCells())
{
System.out.print(cell.getText());
}
}
}
