最近開發遇到了要經過Java處理Excel文件的場景,因而乎在網上了解了一番,最後本身作了個demo,已上傳gitee:https://gitee.com/github-26930945/JavaCommon/tree/master/officeDemogit
下面是我參考的內容,來源於:https://blog.csdn.net/qq_21137441/article/details/79226171github
下載地址apache
https://archive.apache.org/dist/poi/release/bin/數組
須要的jar包(我用的是3.10final)app
Poi-3.10-Final.jar (用於xls)dom
Poi-ooxml-3.10-Final.jar (用於xlsx)函數
Poi-ooxml-schemas-3.10.jar測試
Xmlbeans-2.30.jar字體
dom4j-1.6.1.jar網站
poi-scratchpad-3.10-FINAL-20140208.jar(用於word,ppt)
讀doc
public static String readWord(String name)
{
FileInputStream in;
String text = null;
try
{
in = new FileInputStream(name);
WordExtractor extractor = new WordExtractor(in);
text = extractor.getText();
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return text;
}
讀docx
public static String readDocx(String path)
{
//都是隻能用String,不能用Stringbuffer,還不知道緣由
String text = null;
try {
InputStream is = new FileInputStream("doc/aaa.docx");
XWPFDocument doc = new XWPFDocument(is);
XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
text = extractor.getText();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return text;
}
讀xls和xlsx
private static Logger log = Logger.getLogger("client");
public static String readXls(String path)
{
String text="";
try
{
FileInputStream is = new FileInputStream(path);
HSSFWorkbook excel=new HSSFWorkbook(is);
//獲取第一個sheet
HSSFSheet sheet0=excel.getSheetAt(0);
for (Iterator rowIterator=sheet0.iterator();rowIterator.hasNext();)
{
HSSFRow row=(HSSFRow) rowIterator.next();
for (Iterator iterator=row.cellIterator();iterator.hasNext();)
{
HSSFCell cell=(HSSFCell) iterator.next();
//根據單元的的類型 讀取相應的結果
if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING) text+=cell.getStringCellValue()+"\t";
else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC) text+=cell.getNumericCellValue()+"\t";
else if(cell.getCellType()==HSSFCell.CELL_TYPE_FORMULA) text+=cell.getCellFormula()+"\t";
}
text+="\n";
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
log.warn(e);
}
return text;
}
public static String readXlsx(String path)
{
String text="";
try
{
OPCPackage pkg=OPCPackage.open(path);
XSSFWorkbook excel=new XSSFWorkbook(pkg);
//獲取第一個sheet
XSSFSheet sheet0=excel.getSheetAt(0);
for (Iterator rowIterator=sheet0.iterator();rowIterator.hasNext();)
{
XSSFRow row=(XSSFRow) rowIterator.next();
for (Iterator iterator=row.cellIterator();iterator.hasNext();)
{
XSSFCell cell=(XSSFCell) iterator.next();
//根據單元的的類型 讀取相應的結果
if(cell.getCellType()==XSSFCell.CELL_TYPE_STRING) text+=cell.getStringCellValue()+"\t";
else if(cell.getCellType()==XSSFCell.CELL_TYPE_NUMERIC) text+=cell.getNumericCellValue()+"\t";
else if(cell.getCellType()==XSSFCell.CELL_TYPE_FORMULA) text+=cell.getCellFormula()+"\t";
}
text+="\n";
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
log.warn(e);
}
return text;
}
1.POI結構與經常使用類
(1)POI介紹
Apache POI是Apache軟件基金會的開源項目,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。 .NET的開發人員則能夠利用NPOI (POI for .NET) 來存取 Microsoft Office文檔的功能。
(2)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格式檔案的功能。
(3)POI經常使用類說明
類名 說明
HSSFWorkbook Excel的文檔對象
HSSFSheet
Excel的表單
HSSFRow
Excel的行
HSSFCell
Excel的格子單元
HSSFFont Excel字體
HSSFDataFormat 格子單元的日期格式
HSSFHeader Excel文檔Sheet的頁眉
HSSFFooter Excel文檔Sheet的頁腳
HSSFCellStyle 格子單元樣式
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 錯誤信息表
2.Excel的基本操做
(1)建立Workbook和Sheet
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!");
}
}
(2)建立單元格
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);// 設置單元格內容,重載
(3)建立文檔摘要信息
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測試文檔");//備註
(4)建立批註
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);//把批註賦值給單元格
建立批註位置HSSFPatriarch.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2)方法參數說明:
dx1 第1個單元格中x軸的偏移量
dy1 第1個單元格中y軸的偏移量
dx2 第2個單元格中x軸的偏移量
dy2 第2個單元格中y軸的偏移量
col1 第1個單元格的列號
row1 第1個單元格的行號
col2 第2個單元格的列號
row2 第2個單元格的行號
(5)建立頁眉和頁腳
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("頁腳中間");
也可使用Office自帶的標籤訂義,你能夠經過HSSFHeader或HSSFFooter訪問到它們,都是靜態屬性,列表以下:
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的單元格操做
(1)設置格式
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);
HSSFDataFormat.getFormat和HSSFDataFormat.getBuiltinFormat的區別: 當使用Excel內嵌的(或者說預約義)的格式時,直接用HSSFDataFormat.getBuiltinFormat靜態方法便可。當使用本身定義的格式時,必須先調用HSSFWorkbook.createDataFormat(),由於這時在底層會先找有沒有匹配的內嵌FormatRecord,若是沒有就會新建一個FormatRecord,因此必須先調用這個方法,而後你就能夠用得到的HSSFDataFormat實例的getFormat方法了,固然相對而言這種方式比較麻煩,因此內嵌格式仍是用HSSFDataFormat.getBuiltinFormat靜態方法更加直接一些。
(2)合併單元格
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);
CellRangeAddress對象其實就是表示一個區域,其構造方法以下:CellRangeAddress(firstRow, lastRow, firstCol, lastCol),參數的說明:
firstRow 區域中第一個單元格的行號
lastRow 區域中最後一個單元格的行號
firstCol 區域中第一個單元格的列號
lastCol 區域中最後一個單元格的列號
提示: 即便你沒有用CreateRow和CreateCell建立過行或單元格,也徹底能夠直接建立區域而後把這一區域合併,Excel的區域合併信息是單獨存儲的,和RowRecord、ColumnInfoRecord不存在直接關係。
(3)單元格對齊
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;
(4)使用邊框
邊框和其餘單元格設置同樣也是調用CellStyle接口,CellStyle有2種和邊框相關的屬性,分別是:
邊框相關屬性
說明
範例
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
(5)設置字體
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);
下劃線選項值:
單下劃線 FontFormatting.U_SINGLE
雙下劃線 FontFormatting.U_DOUBLE
會計用單下劃線 FontFormatting.U_SINGLE_ACCOUNTING
會計用雙下劃線 FontFormatting.U_DOUBLE_ACCOUNTING
無下劃線 FontFormatting.U_NONE
上標下標選項值:
上標 FontFormatting.SS_SUPER
下標 FontFormatting.SS_SUB
普通,默認值 FontFormatting.SS_NONE
(6)背景和紋理
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
(7)設置寬度和高度
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個點
這裏你會發現一個有趣的現象,setColumnWidth的第二個參數要乘以256,這是怎麼回事呢?其實,這個參數的單位是1/256個字符寬度,也就是說,這裏是把B列的寬度設置爲了31個字符。
設置行高使用HSSFRow對象的setHeight和setHeightInPoints方法,這兩個方法的區別在於setHeightInPoints的單位是點,而setHeight的單位是1/20個點,因此setHeight的值永遠是setHeightInPoints的20倍。
你也可使用HSSFSheet.setDefaultColumnWidth、HSSFSheet.setDefaultRowHeight和HSSFSheet.setDefaultRowHeightInPoints方法設置默認的列寬或行高。
(8)判斷單元格是否爲日期
判斷單元格是否爲日期類型,使用DateUtil.isCellDateFormatted(cell)方法,例如:
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公式
(1)基本計算
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");//設置公式
(2)SUM函數
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"
(3)日期函數
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 」表示以天爲單位 ) 。
CONCATENATE( str1,str2, … ) :鏈接字符串。
更多 Excel 的日期函數可參考:http://tonyqus.sinaapp.com/archives/286
(4)字符串相關函數
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 ) :將文本轉換成大寫形式。
PROPER( String ) :將文字串的首字母及任何非字母字符以後的首字母轉換成大寫。將其他的字母轉換成小寫。
更多 Excel 的字符串函數可參考:http://tonyqus.sinaapp.com/archives/289
(5)IF函數
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\")");
以上代碼中的公式說明:
IF(logical_test,value_if_true,value_if_false)用來用做邏輯判斷。其中Logical_test表示計算結果爲 TRUE 或 FALSE 的任意值或表達式 ; value_if_true表示當表達式Logical_test的值爲TRUE時的返回值;value_if_false表示當表達式Logical_test的值爲FALSE時的返回值。
(6)CountIf和SumIf函數
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)");
以上代碼中的公式說明:
COUNTIF(range,criteria):知足某條件的計數的函數。參數range:須要進行讀數的計數;參數criteria:條件表達式,只有當知足此條件時才進行計數。
SumIF(criteria_range, criteria,sum_range):用於統計某區域內知足某條件的值的求和。參數criteria_range:條件測試區域,第二個參數Criteria中的條件將與此區域中的值進行比較;參數criteria:條件測試值,知足條件的對應的sum_range項將進行求和計算;參數sum_range:彙總數據所在區域,求和時會排除掉不知足Criteria條件的對應的項。
(7)Lookup函數
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 中對應的值。
可能有人會問,字典中沒有 75 對應的成績啊,那麼 Excel 中怎麼匹配的呢?答案是模糊匹配,而且 LOOKUP 函數只支持模糊匹配。 Excel 會在 $A$1:$A$4 中找小於 75 的最大值,也就是 A3 對應的 70 ,而後將對應的 $C$1:$C$4 區域中的 C3 中的值返回,這就是最終結果「良好」的由來。
VLOOKUP(lookup_value,lookup_area,result_col,is_fuzzy ) ,第一個參數:須要查找的內容,這裏是 A5 單元格;第二個參數:須要比較的表,這裏是 $A$1:$C$4 ,注意 VLOOKUP 匹配時只與表中的第一列進行匹配。第三個參數:匹配結果對應的列序號。這裏要對應的是成績列,因此爲 3 。第四個參數:指明是否模糊匹配。例子中的 TRUE 表示模糊匹配,與上例中同樣。匹配到的是第三行。若是將此參數改成 FALSE ,由於在表中的第 1 列中找不到 75 ,因此會報「#N/A 」的計算錯誤。
另外,還有與 VLOKUP 相似的 HLOOKUP 。不一樣的是 VLOOKUP 用於在表格或數值數組的首列查找指定的數值,並由此返回表格或數組當前行中指定列處的數值。而HLOOKUP 用於在表格或數值數組的首行查找指定的數值,並由此返回表格或數組當前列中指定行處的數值。讀者能夠自已去嘗試。
(8)隨機數函數
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))");
以上代碼中的公式說明:
上面幾例中除了用到RAND函數之外,還用到了CHAR函數用來將ASCII碼換爲字母,INT函數用來取整。值得注意的是INT函數不會四捨五入,不管小數點後是多少都會被捨去。
(9)得到公式的返回值
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 = newHSSFFormulaEvaluator(workbook);
cell = e.evaluateInCell(cell);//若Excel文件不是POI建立的,則沒必要調用此方法
System.out.println("公式計算結果:"+cell.getNumericCellValue());
5.使用圖形
(1)畫線
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粗的線條。
一般,利用POI畫圖主要有如下幾個步驟:
1. 建立一個Patriarch(注意,一個sheet中一般只建立一個Patriarch對象);
2. 建立一個Anchor,以肯定圖形的位置;
3. 調用Patriarch建立圖形;
4. 設置圖形類型(直線,矩形,圓形等)及樣式(顏色,粗細等)。
關於HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的參數,有必要在這裏說明一下:
dx1:起始單元格的x偏移量,如例子中的0表示直線起始位置距B1單元格左側的距離;
dy1:起始單元格的y偏移量,如例子中的0表示直線起始位置距B1單元格上側的距離;
dx2:終止單元格的x偏移量,如例子中的0表示直線起始位置距E5單元格左側的距離;
dy2:終止單元格的y偏移量,如例子中的0表示直線起始位置距E5單元格上側的距離;
col1:起始單元格列序號,從0開始計算;
row1:起始單元格行序號,從0開始計算,如例子中col1=1,row1=0就表示起始單元格爲B1;
col2:終止單元格列序號,從0開始計算;
row2:終止單元格行序號,從0開始計算,如例子中col2=4,row2=4就表示起始單元格爲E5;
最後,關於LineStyle屬性,有以下一些可選值,對應的效果分別如圖所示:
(2)畫矩形
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);//設置邊框顏色
(3)畫圓形
更改上例的代碼以下:
rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);//設置圖片類型
(4)畫Grid
在POI中,自己沒有畫Grid(網格)的方法。但咱們知道Grid其實就是由橫線和豎線構成的,所在咱們能夠經過畫線的方式來模擬畫Grid。代碼以下:
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;
}
(5)插入圖片
HSSFSheet sheet = workbook.createSheet("Test");// 建立工做表(Sheet)
FileInputStream stream=newFileInputStream("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();//自動調節圖片大小,圖片位置信息可能丟失
(6)從Excel文件提取圖片
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=newFileOutputStream("d:\\POI\\Apache.png");
png.write(pic.getData());
png.close();//保存圖片
}
}
6.Excel表操做
(1)設置默認工做表
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);//設置默認工做表
(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");//重命名工做表
(3)調整表單顯示比例
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%顯示比例
(4)顯示/隱藏網格線
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
(5)遍歷Sheet
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行列操做
(1)組合行、列
HSSFSheet sheet= workbook.createSheet("Test0");// 建立工做表(Sheet)
sheet.groupRow(1, 3);//組合行
sheet.groupRow(2, 4);//組合行
sheet.groupColumn(2, 7);//組合列
這裏簡單的介紹一下什麼叫作組合:組合分爲行組合和列組合,所謂行組合,就是讓n行組合成一個集合,可以進行展開和合攏操做。
使用POI也能夠取消組合,例如:sheet.ungroupColumn(1, 3);//取消列組合
(2)鎖定列
在Excel中,有時可能會出現列數太多或是行數太多的狀況,這時能夠經過鎖定列來凍結部分列,不隨滾動條滑動,方便查看。
HSSFSheet sheet= workbook.createSheet("Test0");// 建立工做表(Sheet)
sheet.createFreezePane(2, 3, 15, 25);//凍結行列
下面對CreateFreezePane的參數做一下說明:
第一個參數表示要凍結的列數;
第二個參數表示要凍結的行數,這裏只凍結列因此爲0;
第三個參數表示右邊區域可見的首列序號,從1開始計算;
第四個參數表示下邊區域可見的首行序號,也是從1開始計算,這裏是凍結列,因此爲0;
(3)上下移動行
FileInputStream stream = new FileInputStream(filePath);
HSSFWorkbook workbook = new HSSFWorkbook(stream);
HSSFSheet sheet = workbook.getSheet("Test0");
sheet.shiftRows(2, 4, 2);//把第3行到第4行向下移動兩行
HSSFSheet.shiftRows(startRow, endRow, n)參數說明
startRow:須要移動的起始行;
endRow:須要移動的結束行;
n:移動的位置,正數表示向下移動,負數表示向上移動;
8.Excel的其餘功能
(1)設置密碼
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");//設置保護密碼
(2)數據有效性
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類表示一個區域,構造函數中的四個參數分別表示起始行序號,終止行序號,起始列序號,終止列序號。65535是一個Sheet的最大行數。另外,CreateDateConstraint的第一個參數除了設置成DVConstraint.OperatorType.BETWEEN外,還能夠設置成以下一些值,你們能夠本身一個個去試看看效果:
驗證的數據類型也有幾種選擇,以下:
(3)生成下拉式菜單
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);
(4)打印基本設置
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頁自適應頁面大小
更詳細的打印設置請參考: http://tonyqus.sinaapp.com/archives/271
(5)超連接
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的基本操做
(1)POI操做Word簡介
POI讀寫Excel功能強大、操做簡單。可是POI操做時,通常只用它讀取word文檔,POI只能可以建立簡單的word文檔,相對而言POI操做時的功能太少。
(2)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 = newFileOutputStream("d:\\POI\\sample.doc");
doc.write(out);
out.close();
(3)POI讀取Word文檔裏的文字
FileInputStream stream = newFileInputStream("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());
}
}
}
下載地址https://archive.apache.org/dist/poi/release/bin/須要的jar包(我用的是3.10final)Poi-3.10-Final.jar (用於xls)Poi-ooxml-3.10-Final.jar (用於xlsx)Poi-ooxml-schemas-3.10.jarXmlbeans-2.30.jardom4j-1.6.1.jarpoi-scratchpad-3.10-FINAL-20140208.jar(用於word,ppt)讀docpublic static String readWord(String name) { FileInputStream in; String text = null; try { in = new FileInputStream(name); WordExtractor extractor = new WordExtractor(in); text = extractor.getText(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return text; }讀docxpublic static String readDocx(String path) { //都是隻能用String,不能用Stringbuffer,還不知道緣由 String text = null; try { InputStream is = new FileInputStream("doc/aaa.docx"); XWPFDocument doc = new XWPFDocument(is); XWPFWordExtractor extractor = new XWPFWordExtractor(doc); text = extractor.getText(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return text; }讀xls和xlsxprivate static Logger log = Logger.getLogger("client"); public static String readXls(String path) { String text=""; try { FileInputStream is = new FileInputStream(path); HSSFWorkbook excel=new HSSFWorkbook(is); //獲取第一個sheet HSSFSheet sheet0=excel.getSheetAt(0); for (Iterator rowIterator=sheet0.iterator();rowIterator.hasNext();) { HSSFRow row=(HSSFRow) rowIterator.next(); for (Iterator iterator=row.cellIterator();iterator.hasNext();) { HSSFCell cell=(HSSFCell) iterator.next(); //根據單元的的類型 讀取相應的結果 if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING) text+=cell.getStringCellValue()+"\t"; else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC) text+=cell.getNumericCellValue()+"\t"; else if(cell.getCellType()==HSSFCell.CELL_TYPE_FORMULA) text+=cell.getCellFormula()+"\t"; } text+="\n"; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); log.warn(e); } return text; } public static String readXlsx(String path) { String text=""; try { OPCPackage pkg=OPCPackage.open(path); XSSFWorkbook excel=new XSSFWorkbook(pkg); //獲取第一個sheet XSSFSheet sheet0=excel.getSheetAt(0); for (Iterator rowIterator=sheet0.iterator();rowIterator.hasNext();) { XSSFRow row=(XSSFRow) rowIterator.next(); for (Iterator iterator=row.cellIterator();iterator.hasNext();) { XSSFCell cell=(XSSFCell) iterator.next(); //根據單元的的類型 讀取相應的結果 if(cell.getCellType()==XSSFCell.CELL_TYPE_STRING) text+=cell.getStringCellValue()+"\t"; else if(cell.getCellType()==XSSFCell.CELL_TYPE_NUMERIC) text+=cell.getNumericCellValue()+"\t"; else if(cell.getCellType()==XSSFCell.CELL_TYPE_FORMULA) text+=cell.getCellFormula()+"\t"; } text+="\n"; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); log.warn(e); } return text; }1.POI結構與經常使用類(1)POI介紹 Apache POI是Apache軟件基金會的開源項目,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。 .NET的開發人員則能夠利用NPOI (POI for .NET) 來存取 Microsoft Office文檔的功能。(2)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格式檔案的功能。(3)POI經常使用類說明類名 說明HSSFWorkbook Excel的文檔對象HSSFSheet Excel的表單HSSFRow Excel的行HSSFCell Excel的格子單元HSSFFont Excel字體 HSSFDataFormat 格子單元的日期格式HSSFHeader Excel文檔Sheet的頁眉HSSFFooter Excel文檔Sheet的頁腳HSSFCellStyle 格子單元樣式HSSFDateUtil 日期HSSFPrintSetup 打印 HSSFErrorConstants 錯誤信息表2.Excel的基本操做(1)建立Workbook和Sheetpublic 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!"); }}(2)建立單元格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);// 設置單元格內容,重載(3)建立文檔摘要信息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測試文檔");//備註(4)建立批註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);//把批註賦值給單元格 建立批註位置HSSFPatriarch.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2)方法參數說明:dx1 第1個單元格中x軸的偏移量dy1 第1個單元格中y軸的偏移量dx2 第2個單元格中x軸的偏移量dy2 第2個單元格中y軸的偏移量col1 第1個單元格的列號row1 第1個單元格的行號col2 第2個單元格的列號row2 第2個單元格的行號(5)建立頁眉和頁腳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("頁腳中間"); 也可使用Office自帶的標籤訂義,你能夠經過HSSFHeader或HSSFFooter訪問到它們,都是靜態屬性,列表以下: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的單元格操做(1)設置格式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); HSSFDataFormat.getFormat和HSSFDataFormat.getBuiltinFormat的區別: 當使用Excel內嵌的(或者說預約義)的格式時,直接用HSSFDataFormat.getBuiltinFormat靜態方法便可。當使用本身定義的格式時,必須先調用HSSFWorkbook.createDataFormat(),由於這時在底層會先找有沒有匹配的內嵌FormatRecord,若是沒有就會新建一個FormatRecord,因此必須先調用這個方法,而後你就能夠用得到的HSSFDataFormat實例的getFormat方法了,固然相對而言這種方式比較麻煩,因此內嵌格式仍是用HSSFDataFormat.getBuiltinFormat靜態方法更加直接一些。(2)合併單元格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); CellRangeAddress對象其實就是表示一個區域,其構造方法以下:CellRangeAddress(firstRow, lastRow, firstCol, lastCol),參數的說明:firstRow 區域中第一個單元格的行號lastRow 區域中最後一個單元格的行號firstCol 區域中第一個單元格的列號lastCol 區域中最後一個單元格的列號 提示: 即便你沒有用CreateRow和CreateCell建立過行或單元格,也徹底能夠直接建立區域而後把這一區域合併,Excel的區域合併信息是單獨存儲的,和RowRecord、ColumnInfoRecord不存在直接關係。(3)單元格對齊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;(4)使用邊框 邊框和其餘單元格設置同樣也是調用CellStyle接口,CellStyle有2種和邊框相關的屬性,分別是:邊框相關屬性說明範例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_DOTTEDHSSFCellStyle. BORDER_HAIRHSSFCellStyle. BORDER_DASH_DOT_DOTHSSFCellStyle. BORDER_DASH_DOTHSSFCellStyle. BORDER_DASHEDHSSFCellStyle. BORDER_THINHSSFCellStyle. BORDER_MEDIUM_DASH_DOT_DOTHSSFCellStyle. BORDER_SLANTED_DASH_DOTHSSFCellStyle. BORDER_MEDIUM_DASH_DOTHSSFCellStyle. BORDER_MEDIUM_DASHEDHSSFCellStyle. BORDER_MEDIUMHSSFCellStyle. BORDER_THICKHSSFCellStyle. BORDER_DOUBLE(5)設置字體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);下劃線選項值:單下劃線 FontFormatting.U_SINGLE雙下劃線 FontFormatting.U_DOUBLE會計用單下劃線 FontFormatting.U_SINGLE_ACCOUNTING會計用雙下劃線 FontFormatting.U_DOUBLE_ACCOUNTING無下劃線 FontFormatting.U_NONE 上標下標選項值:上標 FontFormatting.SS_SUPER下標 FontFormatting.SS_SUB普通,默認值 FontFormatting.SS_NONE(6)背景和紋理HSSFCellStyle style = workbook.createCellStyle();style.setFillForegroundColor(HSSFColor.GREEN.index);//設置圖案顏色style.setFillBackgroundColor(HSSFColor.RED.index);//設置圖案背景色style.setFillPattern(HSSFCellStyle.SQUARES);//設置圖案樣式cell.setCellStyle(style); 圖案樣式及其對應的值:圖案樣式常量HSSFCellStyle. NO_FILLHSSFCellStyle. ALT_BARSHSSFCellStyle. FINE_DOTSHSSFCellStyle. SPARSE_DOTSHSSFCellStyle. LESS_DOTSHSSFCellStyle. LEAST_DOTSHSSFCellStyle. BRICKSHSSFCellStyle. BIG_SPOTSHSSFCellStyle. THICK_FORWARD_DIAGHSSFCellStyle. THICK_BACKWARD_DIAGHSSFCellStyle. THICK_VERT_BANDSHSSFCellStyle. THICK_HORZ_BANDSHSSFCellStyle. THIN_HORZ_BANDSHSSFCellStyle. THIN_VERT_BANDSHSSFCellStyle. THIN_BACKWARD_DIAGHSSFCellStyle. THIN_FORWARD_DIAGHSSFCellStyle. SQUARESHSSFCellStyle. DIAMONDS(7)設置寬度和高度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個點 這裏你會發現一個有趣的現象,setColumnWidth的第二個參數要乘以256,這是怎麼回事呢?其實,這個參數的單位是1/256個字符寬度,也就是說,這裏是把B列的寬度設置爲了31個字符。 設置行高使用HSSFRow對象的setHeight和setHeightInPoints方法,這兩個方法的區別在於setHeightInPoints的單位是點,而setHeight的單位是1/20個點,因此setHeight的值永遠是setHeightInPoints的20倍。 你也可使用HSSFSheet.setDefaultColumnWidth、HSSFSheet.setDefaultRowHeight和HSSFSheet.setDefaultRowHeightInPoints方法設置默認的列寬或行高。(8)判斷單元格是否爲日期 判斷單元格是否爲日期類型,使用DateUtil.isCellDateFormatted(cell)方法,例如:HSSFCell cell = row.createCell(1);cell.setCellValue(new Date());//設置日期數據System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:falseHSSFCellStyle style =workbook.createCellStyle();style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));cell.setCellStyle(style);//設置日期樣式System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:true4.使用Excel公式(1)基本計算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");//設置公式(2)SUM函數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"(3)日期函數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 」表示以天爲單位 ) 。 CONCATENATE( str1,str2, … ) :鏈接字符串。 更多 Excel 的日期函數可參考:http://tonyqus.sinaapp.com/archives/286(4)字符串相關函數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 ) :將文本轉換成大寫形式。 PROPER( String ) :將文字串的首字母及任何非字母字符以後的首字母轉換成大寫。將其他的字母轉換成小寫。 更多 Excel 的字符串函數可參考:http://tonyqus.sinaapp.com/archives/289(5)IF函數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\")"); 以上代碼中的公式說明: IF(logical_test,value_if_true,value_if_false)用來用做邏輯判斷。其中Logical_test表示計算結果爲 TRUE 或 FALSE 的任意值或表達式 ; value_if_true表示當表達式Logical_test的值爲TRUE時的返回值;value_if_false表示當表達式Logical_test的值爲FALSE時的返回值。(6)CountIf和SumIf函數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)"); 以上代碼中的公式說明: COUNTIF(range,criteria):知足某條件的計數的函數。參數range:須要進行讀數的計數;參數criteria:條件表達式,只有當知足此條件時才進行計數。 SumIF(criteria_range, criteria,sum_range):用於統計某區域內知足某條件的值的求和。參數criteria_range:條件測試區域,第二個參數Criteria中的條件將與此區域中的值進行比較;參數criteria:條件測試值,知足條件的對應的sum_range項將進行求和計算;參數sum_range:彙總數據所在區域,求和時會排除掉不知足Criteria條件的對應的項。(7)Lookup函數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 中對應的值。 可能有人會問,字典中沒有 75 對應的成績啊,那麼 Excel 中怎麼匹配的呢?答案是模糊匹配,而且 LOOKUP 函數只支持模糊匹配。 Excel 會在 $A$1:$A$4 中找小於 75 的最大值,也就是 A3 對應的 70 ,而後將對應的 $C$1:$C$4 區域中的 C3 中的值返回,這就是最終結果「良好」的由來。 VLOOKUP(lookup_value,lookup_area,result_col,is_fuzzy ) ,第一個參數:須要查找的內容,這裏是 A5 單元格;第二個參數:須要比較的表,這裏是 $A$1:$C$4 ,注意 VLOOKUP 匹配時只與表中的第一列進行匹配。第三個參數:匹配結果對應的列序號。這裏要對應的是成績列,因此爲 3 。第四個參數:指明是否模糊匹配。例子中的 TRUE 表示模糊匹配,與上例中同樣。匹配到的是第三行。若是將此參數改成 FALSE ,由於在表中的第 1 列中找不到 75 ,因此會報「#N/A 」的計算錯誤。 另外,還有與 VLOKUP 相似的 HLOOKUP 。不一樣的是 VLOOKUP 用於在表格或數值數組的首列查找指定的數值,並由此返回表格或數組當前行中指定列處的數值。而HLOOKUP 用於在表格或數值數組的首行查找指定的數值,並由此返回表格或數組當前列中指定行處的數值。讀者能夠自已去嘗試。(8)隨機數函數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))"); 以上代碼中的公式說明: 上面幾例中除了用到RAND函數之外,還用到了CHAR函數用來將ASCII碼換爲字母,INT函數用來取整。值得注意的是INT函數不會四捨五入,不管小數點後是多少都會被捨去。(9)得到公式的返回值HSSFSheet sheet = workbook.createSheet("Test");// 建立工做表(Sheet)HSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue(7);//A1row.createCell(1).setCellValue(8);//B1HSSFCell cell=row.createCell(2);cell.setCellFormula("A1*B1+14");HSSFFormulaEvaluator e = newHSSFFormulaEvaluator(workbook);cell = e.evaluateInCell(cell);//若Excel文件不是POI建立的,則沒必要調用此方法System.out.println("公式計算結果:"+cell.getNumericCellValue());5.使用圖形(1)畫線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粗的線條。 一般,利用POI畫圖主要有如下幾個步驟: 1. 建立一個Patriarch(注意,一個sheet中一般只建立一個Patriarch對象); 2. 建立一個Anchor,以肯定圖形的位置; 3. 調用Patriarch建立圖形; 4. 設置圖形類型(直線,矩形,圓形等)及樣式(顏色,粗細等)。 關於HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的參數,有必要在這裏說明一下: dx1:起始單元格的x偏移量,如例子中的0表示直線起始位置距B1單元格左側的距離; dy1:起始單元格的y偏移量,如例子中的0表示直線起始位置距B1單元格上側的距離; dx2:終止單元格的x偏移量,如例子中的0表示直線起始位置距E5單元格左側的距離; dy2:終止單元格的y偏移量,如例子中的0表示直線起始位置距E5單元格上側的距離; col1:起始單元格列序號,從0開始計算; row1:起始單元格行序號,從0開始計算,如例子中col1=1,row1=0就表示起始單元格爲B1; col2:終止單元格列序號,從0開始計算; row2:終止單元格行序號,從0開始計算,如例子中col2=4,row2=4就表示起始單元格爲E5; 最後,關於LineStyle屬性,有以下一些可選值,對應的效果分別如圖所示:(2)畫矩形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);//設置邊框顏色(3)畫圓形 更改上例的代碼以下: rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);//設置圖片類型(4)畫Grid 在POI中,自己沒有畫Grid(網格)的方法。但咱們知道Grid其實就是由橫線和豎線構成的,所在咱們能夠經過畫線的方式來模擬畫Grid。代碼以下: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;} (5)插入圖片HSSFSheet sheet = workbook.createSheet("Test");// 建立工做表(Sheet)FileInputStream stream=newFileInputStream("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();//自動調節圖片大小,圖片位置信息可能丟失(6)從Excel文件提取圖片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=newFileOutputStream("d:\\POI\\Apache.png");png.write(pic.getData());png.close();//保存圖片 }}6.Excel表操做(1)設置默認工做表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);//設置默認工做表(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");//重命名工做表(3)調整表單顯示比例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%顯示比例(4)顯示/隱藏網格線HSSFWorkbook workbook = new HSSFWorkbook();// 建立Excel文件(Workbook)HSSFSheet sheet1= workbook.createSheet("Test0");// 建立工做表(Sheet)HSSFSheet sheet2=workbook.createSheet("Test1");// 建立工做表(Sheet)sheet1.setDisplayGridlines(false);//隱藏Excel網格線,默認值爲truesheet2.setGridsPrinted(true);//打印時顯示網格線,默認值爲false(5)遍歷SheetString filePath = "d:\\users\\lizw\\桌面\\POI\\sample.xls";FileInputStream stream = new FileInputStream(filePath);HSSFWorkbook workbook = new HSSFWorkbook(stream);//讀取現有的ExcelHSSFSheet sheet= workbook.getSheet("Test0");//獲得指定名稱的Sheetfor (Row row : sheet){ for (Cell cell : row) { System.out.print(cell + "\t"); } System.out.println();}7.Excel行列操做(1)組合行、列HSSFSheet sheet= workbook.createSheet("Test0");// 建立工做表(Sheet)sheet.groupRow(1, 3);//組合行sheet.groupRow(2, 4);//組合行sheet.groupColumn(2, 7);//組合列 這裏簡單的介紹一下什麼叫作組合:組合分爲行組合和列組合,所謂行組合,就是讓n行組合成一個集合,可以進行展開和合攏操做。 使用POI也能夠取消組合,例如:sheet.ungroupColumn(1, 3);//取消列組合(2)鎖定列 在Excel中,有時可能會出現列數太多或是行數太多的狀況,這時能夠經過鎖定列來凍結部分列,不隨滾動條滑動,方便查看。HSSFSheet sheet= workbook.createSheet("Test0");// 建立工做表(Sheet)sheet.createFreezePane(2, 3, 15, 25);//凍結行列 下面對CreateFreezePane的參數做一下說明: 第一個參數表示要凍結的列數; 第二個參數表示要凍結的行數,這裏只凍結列因此爲0; 第三個參數表示右邊區域可見的首列序號,從1開始計算; 第四個參數表示下邊區域可見的首行序號,也是從1開始計算,這裏是凍結列,因此爲0;(3)上下移動行FileInputStream stream = new FileInputStream(filePath);HSSFWorkbook workbook = new HSSFWorkbook(stream);HSSFSheet sheet = workbook.getSheet("Test0");sheet.shiftRows(2, 4, 2);//把第3行到第4行向下移動兩行 HSSFSheet.shiftRows(startRow, endRow, n)參數說明 startRow:須要移動的起始行; endRow:須要移動的結束行; n:移動的位置,正數表示向下移動,負數表示向上移動; 8.Excel的其餘功能(1)設置密碼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");//設置保護密碼(2)數據有效性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類表示一個區域,構造函數中的四個參數分別表示起始行序號,終止行序號,起始列序號,終止列序號。65535是一個Sheet的最大行數。另外,CreateDateConstraint的第一個參數除了設置成DVConstraint.OperatorType.BETWEEN外,還能夠設置成以下一些值,你們能夠本身一個個去試看看效果:驗證的數據類型也有幾種選擇,以下:(3)生成下拉式菜單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);(4)打印基本設置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頁自適應頁面大小更詳細的打印設置請參考: http://tonyqus.sinaapp.com/archives/271(5)超連接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的基本操做(1)POI操做Word簡介POI讀寫Excel功能強大、操做簡單。可是POI操做時,通常只用它讀取word文檔,POI只能可以建立簡單的word文檔,相對而言POI操做時的功能太少。(2)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 = newFileOutputStream("d:\\POI\\sample.doc");doc.write(out);out.close();(3)POI讀取Word文檔裏的文字FileInputStream stream = newFileInputStream("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()); } }}--------------------- 做者:林中靜月下仙 來源:CSDN 原文:https://blog.csdn.net/qq_21137441/article/details/79226171 版權聲明:本文爲博主原創文章,轉載請附上博文連接!