POI使用指南

使用首先需要了解他的工作原理

1.POI結構與常用類

(1)創(chuàng)建Workbook和Sheet

(2)創(chuàng)建單元格

(1)POI介紹

Apache POI是Apache軟件基金會的開源項目,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。 .NET的開發(fā)人員則可以利用NPOI (POI for .NET) 來存取 Microsoft Office文檔的功能。

(2)POI結構說明

包名稱說明

HSSF提供讀寫Microsoft Excel XLS格式檔案的功能。(97-03)

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)創(chuàng)建Workbook和Sheet

publicclassTest00

{

publicstaticvoidmain(String[]args)throwsIOException

{

StringfilePath="d:\\users\\lizw\\桌面\\POI\\sample.xls";//文件路徑

HSSFWorkbookworkbook=newHSSFWorkbook();//創(chuàng)建Excel文件(Workbook)

HSSFSheetsheet=workbook.createSheet();//創(chuàng)建工作表(Sheet)

sheet=workbook.createSheet("Test");//創(chuàng)建工作表(Sheet)

FileOutputStreamout=newFileOutputStream(filePath);

workbook.write(out);//保存Excel文件

out.close();//關閉文件流

System.out.println("OK!");

}

}

(2)創(chuàng)建單元格

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=sheet.createRow(0);// 創(chuàng)建行,從0開始

HSSFCellcell=row.createCell(0);// 創(chuàng)建行的單元格,也是從0開始

cell.setCellValue("李志偉");// 設置單元格內容

row.createCell(1).setCellValue(false);// 設置單元格內容,重載

row.createCell(2).setCellValue(newDate());// 設置單元格內容,重載

row.createCell(3).setCellValue(12.345);// 設置單元格內容,重載

(3)創(chuàng)建文檔摘要信息

workbook.createInformationProperties();//創(chuàng)建文檔信息

DocumentSummaryInformationdsi=workbook.getDocumentSummaryInformation();//摘要信息

dsi.setCategory("類別:Excel文件");//類別

dsi.setManager("管理者:李志偉");//管理者

dsi.setCompany("公司:--");//公司

SummaryInformationsi=workbook.getSummaryInformation();//摘要信息

si.setSubject("主題:--");//主題

si.setTitle("標題:測試文檔");//標題

si.setAuthor("作者:李志偉");//作者

si.setComments("備注:POI測試文檔");//備注

(4)創(chuàng)建批注

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFPatriarchpatr=sheet.createDrawingPatriarch();

HSSFClientAnchoranchor=patr.createAnchor(0,0,0,0,5,1,8,3);//創(chuàng)建批注位置

HSSFCommentcomment=patr.createCellComment(anchor);//創(chuàng)建批注

comment.setString(newHSSFRichTextString("這是一個批注段落!"));//設置批注內容

comment.setAuthor("李志偉");//設置批注作者

comment.setVisible(true);//設置批注默認顯示

HSSFCellcell=sheet.createRow(2).createCell(1);

cell.setCellValue("測試");

cell.setCellComment(comment);//把批注賦值給單元格

創(chuàng)建批注位置HSSFPatriarch.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2)方法參數(shù)說明:

dx1第1個單元格中x軸的偏移量

dy1第1個單元格中y軸的偏移量

dx2第2個單元格中x軸的偏移量

dy2第2個單元格中y軸的偏移量

col1第1個單元格的列號

row1第1個單元格的行號

col2第2個單元格的列號

row2第2個單元格的行號

(5)創(chuàng)建頁眉和頁腳

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFHeaderheader=sheet.getHeader();//得到頁眉

header.setLeft("頁眉左邊");

header.setRight("頁眉右邊");

header.setCenter("頁眉中間");

HSSFFooterfooter=sheet.getFooter();//得到頁腳

footer.setLeft("頁腳左邊");

footer.setRight("頁腳右邊");

footer.setCenter("頁腳中間");

也可以使用Office自帶的標簽定義,你可以通過HSSFHeader或HSSFFooter訪問到它們,都是靜態(tài)屬性,列表如下:

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總頁面數(shù)

HSSFHeader.page&P當前頁號

3.Excel的單元格操作

(1)設置格式

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=sheet.createRow(0);

//設置日期格式--使用Excel內嵌的格式

HSSFCellcell=row.createCell(0);

cell.setCellValue(newDate());

HSSFCellStylestyle=workbook.createCellStyle();

style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));

cell.setCellStyle(style);

//設置保留2位小數(shù)--使用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);

//設置科學計數(shù)法格式--使用自定義的格式

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的區(qū)別:當使用Excel內嵌的(或者說預定義)的格式時,直接用HSSFDataFormat.getBuiltinFormat靜態(tài)方法即可。當使用自己定義的格式時,必須先調用HSSFWorkbook.createDataFormat(),因為這時在底層會先找有沒有匹配的內嵌FormatRecord,如果沒有就會新建一個FormatRecord,所以必須先調用這個方法,然后你就可以用獲得的HSSFDataFormat實例的getFormat方法了,當然相對而言這種方式比較麻煩,所以內嵌格式還是用HSSFDataFormat.getBuiltinFormat靜態(tài)方法更加直接一些。

(2)合并單元格

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=sheet.createRow(0);

//合并列

HSSFCellcell=row.createCell(0);

cell.setCellValue("合并列");

CellRangeAddressregion=newCellRangeAddress(0,0,0,5);

sheet.addMergedRegion(region);

//合并行

cell=row.createCell(6);

cell.setCellValue("合并行");

region=newCellRangeAddress(0,5,6,6);

sheet.addMergedRegion(region);

CellRangeAddress對象其實就是表示一個區(qū)域,其構造方法如下:CellRangeAddress(firstRow, lastRow, firstCol, lastCol),參數(shù)的說明:

firstRow區(qū)域中第一個單元格的行號

lastRow區(qū)域中最后一個單元格的行號

firstCol區(qū)域中第一個單元格的列號

lastCol區(qū)域中最后一個單元格的列號

提示:即使你沒有用CreateRow和CreateCell創(chuàng)建過行或單元格,也完全可以直接創(chuàng)建區(qū)域然后把這一區(qū)域合并,Excel的區(qū)域合并信息是單獨存儲的,和RowRecord、ColumnInfoRecord不存在直接關系。

(3)單元格對齊

HSSFCellcell=row.createCell(0);

cell.setCellValue("單元格對齊");

HSSFCellStylestyle=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);

水平對齊相關參數(shù)

如果是左側對齊就是HSSFCellStyle.ALIGN_FILL;

如果是居中對齊就是HSSFCellStyle.ALIGN_CENTER;

如果是右側對齊就是HSSFCellStyle.ALIGN_RIGHT;

如果是跨列舉中就是HSSFCellStyle.ALIGN_CENTER_SELECTION;

如果是兩端對齊就是HSSFCellStyle.ALIGN_JUSTIFY;

如果是填充就是HSSFCellStyle.ALIGN_FILL;

垂直對齊相關參數(shù)

如果是靠上就是HSSFCellStyle.VERTICAL_TOP;

如果是居中就是HSSFCellStyle.VERTICAL_CENTER;

如果是靠下就是HSSFCellStyle.VERTICAL_BOTTOM;

如果是兩端對齊就是HSSFCellStyle.VERTICAL_JUSTIFY;

(4)使用邊框

邊框和其他單元格設置一樣也是調用CellStyle接口,CellStyle有2種和邊框相關的屬性,分別是:

邊框相關屬性

說明

范例

Border+?方向

邊框類型

BorderLeft, BorderRight?等

方向+BorderColor

邊框顏色

TopBorderColor,BottomBorderColor?等

HSSFCellcell=row.createCell(1);

cell.setCellValue("設置邊框");

HSSFCellStylestyle=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);

其中邊框類型分為以下幾種:

邊框范例圖

對應的靜態(tài)值

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)設置字體

HSSFCellcell=row.createCell(1);

cell.setCellValue("設置字體");

HSSFCellStylestyle=workbook.createCellStyle();

HSSFFontfont=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)背景和紋理

HSSFCellStylestyle=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)設置寬度和高度

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=sheet.createRow(1);

HSSFCellcell=row.createCell(1);

cell.setCellValue("123456789012345678901234567890");

sheet.setColumnWidth(1,31*256);//設置第一列的寬度是31個字符寬度

row.setHeightInPoints(50);//設置行的高度是50個點

這里你會發(fā)現(xiàn)一個有趣的現(xiàn)象,setColumnWidth的第二個參數(shù)要乘以256,這是怎么回事呢?其實,這個參數(shù)的單位是1/256個字符寬度,也就是說,這里是把B列的寬度設置為了31個字符。

設置行高使用HSSFRow對象的setHeight和setHeightInPoints方法,這兩個方法的區(qū)別在于setHeightInPoints的單位是點,而setHeight的單位是1/20個點,所以setHeight的值永遠是setHeightInPoints的20倍。

你也可以使用HSSFSheet.setDefaultColumnWidth、HSSFSheet.setDefaultRowHeight和HSSFSheet.setDefaultRowHeightInPoints方法設置默認的列寬或行高。

(8)判斷單元格是否為日期

判斷單元格是否為日期類型,使用DateUtil.isCellDateFormatted(cell)方法,例如:

HSSFCellcell=row.createCell(1);

cell.setCellValue(newDate());//設置日期數(shù)據(jù)

System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:false

HSSFCellStylestyle=workbook.createCellStyle();

style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));

cell.setCellStyle(style);//設置日期樣式

System.out.println(DateUtil.isCellDateFormatted(cell));//輸出:true

4.使用Excel公式

(1)基本計算

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=sheet.createRow(0);

HSSFCellcell=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函數(shù)

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=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)日期函數(shù)

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFCellStylestyle=workbook.createCellStyle();

style.setDataFormat(workbook.createDataFormat().getFormat("yyyy-mm-dd"));

HSSFRowrow=sheet.createRow(0);

Calendardate=Calendar.getInstance();//日歷對象

HSSFCellcell=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?的日期函數(shù)可參考:http://tonyqus.sinaapp.com/archives/286

(4)字符串相關函數(shù)

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=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?的字符串函數(shù)可參考:http://tonyqus.sinaapp.com/archives/289

(5)IF函數(shù)

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=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函數(shù)

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=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):滿足某條件的計數(shù)的函數(shù)。參數(shù)range:需要進行讀數(shù)的計數(shù);參數(shù)criteria:條件表達式,只有當滿足此條件時才進行計數(shù)。

SumIF(criteria_range, criteria,sum_range):用于統(tǒng)計某區(qū)域內滿足某條件的值的求和。參數(shù)criteria_range:條件測試區(qū)域,第二個參數(shù)Criteria中的條件將與此區(qū)域中的值進行比較;參數(shù)criteria:條件測試值,滿足條件的對應的sum_range項將進行求和計算;參數(shù)sum_range:匯總數(shù)據(jù)所在區(qū)域,求和時會排除掉不滿足Criteria條件的對應的項。

(7)Lookup函數(shù)

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=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("優(yōu)秀");

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)?,第一個參數(shù):需要查找的內容,本例中指向A5?單元格,也就是75?;第二個參數(shù):比較對象區(qū)域,本例中的成績需要與$A$1:$A$4?中的各單元格中的值進行比較;第三個參數(shù):查找結果區(qū)域,如果匹配到會將此區(qū)域中對應的數(shù)據(jù)返回。如本例中返回$C$1:$C$4?中對應的值。

可能有人會問,字典中沒有75?對應的成績啊,那么Excel?中怎么匹配的呢?答案是模糊匹配,并且LOOKUP?函數(shù)只支持模糊匹配。Excel?會在$A$1:$A$4?中找小于75?的最大值,也就是A3?對應的70?,然后將對應的$C$1:$C$4?區(qū)域中的C3?中的值返回,這就是最終結果“良好”的由來。

VLOOKUP(lookup_value,lookup_area,result_col,is_fuzzy )?,第一個參數(shù):需要查找的內容,這里是A5?單元格;第二個參數(shù):需要比較的表,這里是$A$1:$C$4?,注意VLOOKUP?匹配時只與表中的第一列進行匹配。第三個參數(shù):匹配結果對應的列序號。這里要對應的是成績列,所以為3?。第四個參數(shù):指明是否模糊匹配。例子中的TRUE?表示模糊匹配,與上例中一樣。匹配到的是第三行。如果將此參數(shù)改為FALSE?,因為在表中的第1?列中找不到75?,所以會報“#N/A?”的計算錯誤。

另外,還有與VLOKUP?類似的HLOOKUP?。不同的是VLOOKUP?用于在表格或數(shù)值數(shù)組的首列查找指定的數(shù)值,并由此返回表格或數(shù)組當前行中指定列處的數(shù)值。而HLOOKUP?用于在表格或數(shù)值數(shù)組的首行查找指定的數(shù)值,并由此返回表格或數(shù)組當前列中指定行處的數(shù)值。讀者可以自已去嘗試。

(8)隨機數(shù)函數(shù)

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=sheet.createRow(0);

row.createCell(0).setCellFormula("RAND()");//取0-1之間的隨機數(shù)

row.createCell(1).setCellFormula("int(RAND()*100)");//取0-100之間的隨機整數(shù)

row.createCell(2).setCellFormula("rand()*10+10");//取10-20之間的隨機實數(shù)

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函數(shù)以外,還用到了CHAR函數(shù)用來將ASCII碼換為字母,INT函數(shù)用來取整。值得注意的是INT函數(shù)不會四舍五入,無論小數(shù)點后是多少都會被舍去。

(9)獲得公式的返回值

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=sheet.createRow(0);

row.createCell(0).setCellValue(7);//A1

row.createCell(1).setCellValue(8);//B1

HSSFCellcell=row.createCell(2);

cell.setCellFormula("A1*B1+14");

HSSFFormulaEvaluatore=newHSSFFormulaEvaluator(workbook);

cell=e.evaluateInCell(cell);//若Excel文件不是POI創(chuàng)建的,則不必調用此方法

System.out.println("公式計算結果:"+cell.getNumericCellValue());

5.使用圖形

(1)畫線

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFPatriarchpatriarch=sheet.createDrawingPatriarch();

HSSFClientAnchoranchor=newHSSFClientAnchor(0,0,0,0,(short)1,0,(short)4,4);

HSSFSimpleShapeline=patriarch.createSimpleShape(anchor);

line.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);//設置圖形類型

line.setLineStyle(HSSFShape.LINESTYLE_SOLID);//設置圖形樣式

line.setLineWidth(6350);//在POI中線的寬度12700表示1pt,所以這里是0.5pt粗的線條。

通常,利用POI畫圖主要有以下幾個步驟:

1. 創(chuàng)建一個Patriarch(注意,一個sheet中通常只創(chuàng)建一個Patriarch對象);

2. 創(chuàng)建一個Anchor,以確定圖形的位置;

3. 調用Patriarch創(chuàng)建圖形;

4. 設置圖形類型(直線,矩形,圓形等)及樣式(顏色,粗細等)。

關于HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的參數(shù),有必要在這里說明一下:

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)畫矩形

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFPatriarchpatriarch=sheet.createDrawingPatriarch();

HSSFClientAnchoranchor=newHSSFClientAnchor(255,122,255,122,(short)1,0,(short)4,3);

HSSFSimpleShaperec=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。代碼如下:

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=sheet.createRow(2);

row.createCell(1);

row.setHeightInPoints(240);

sheet.setColumnWidth(2,9000);

intlinesCount=20;

HSSFPatriarchpatriarch=sheet.createDrawingPatriarch();

//因為HSSFClientAnchor中dx只能在0-1023之間,dy只能在0-255之間,這里采用比例的方式

doublexRatio=1023.0/(linesCount*10);

doubleyRatio=255.0/(linesCount*10);

// 畫豎線

intx1=0;

inty1=0;

intx2=0;

inty2=200;

for(inti=0;i

{

HSSFClientAnchora2=newHSSFClientAnchor();

a2.setAnchor((short)2,2,(int)(x1*xRatio),

(int)(y1*yRatio),(short)2,2,(int)(x2*xRatio),

(int)(y2*yRatio));

HSSFSimpleShapeshape2=patriarch.createSimpleShape(a2);

shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);

x1+=10;

x2+=10;

}

// 畫橫線

x1=0;

y1=0;

x2=200;

y2=0;

for(inti=0;i

{

HSSFClientAnchora2=newHSSFClientAnchor();

a2.setAnchor((short)2,2,(int)(x1*xRatio),

(int)(y1*yRatio),(short)2,2,(int)(x2*xRatio),

(int)(y2*yRatio));

HSSFSimpleShapeshape2=patriarch.createSimpleShape(a2);

shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);

y1+=10;

y2+=10;

}

(5)插入圖片

HSSFSheetsheet=workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet)

FileInputStreamstream=newFileInputStream("d:\\POI\\Apache.gif");

byte[]bytes=newbyte[(int)stream.getChannel().size()];

stream.read(bytes);//讀取圖片到二進制數(shù)組

intpictureIdx=workbook.addPicture(bytes,HSSFWorkbook.PICTURE_TYPE_JPEG);

HSSFPatriarchpatriarch=sheet.createDrawingPatriarch();

HSSFClientAnchoranchor=newHSSFClientAnchor(0,0,0,0,(short)0,0,(short)5,5);

HSSFPicturepict=patriarch.createPicture(anchor,pictureIdx);

//pict.resize();//自動調節(jié)圖片大小,圖片位置信息可能丟失

(6)從Excel文件提取圖片

InputStreaminp=newFileInputStream(filePath);

HSSFWorkbookworkbook=newHSSFWorkbook(inp);//讀取現(xiàn)有的Excel文件

Listpictures=workbook.getAllPictures();

for(inti=0;i

{

HSSFPictureDatapic=pictures.get(i);

Stringext=pic.suggestFileExtension();

if(ext.equals("png"))//判斷文件格式

{

FileOutputStreampng=newFileOutputStream("d:\\POI\\Apache.png");

png.write(pic.getData());

png.close();//保存圖片

}

}

6.Excel表操作

(1)設置默認工作表

HSSFWorkbookworkbook=newHSSFWorkbook();// 創(chuàng)建Excel文件(Workbook)

workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)

workbook.createSheet("Test1");// 創(chuàng)建工作表(Sheet)

workbook.createSheet("Test2");// 創(chuàng)建工作表(Sheet)

workbook.createSheet("Test3");// 創(chuàng)建工作表(Sheet)

workbook.setActiveSheet(2);//設置默認工作表

(2)重命名工作表

HSSFWorkbookworkbook=newHSSFWorkbook();// 創(chuàng)建Excel文件(Workbook)

workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)

workbook.createSheet("Test1");// 創(chuàng)建工作表(Sheet)

workbook.createSheet("Test2");// 創(chuàng)建工作表(Sheet)

workbook.createSheet("Test3");// 創(chuàng)建工作表(Sheet)

workbook.setSheetName(2,"1234");//重命名工作表

(3)調整表單顯示比例

HSSFWorkbookworkbook=newHSSFWorkbook();// 創(chuàng)建Excel文件(Workbook)

HSSFSheetsheet1=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)

HSSFSheetsheet2=workbook.createSheet("Test1");// 創(chuàng)建工作表(Sheet)

HSSFSheetsheet3=workbook.createSheet("Test2");// 創(chuàng)建工作表(Sheet)

sheet1.setZoom(1,2);//50%顯示比例

sheet2.setZoom(2,1);//200%顯示比例

sheet3.setZoom(1,10);//10%顯示比例

(4)顯示/隱藏網格線

HSSFWorkbookworkbook=newHSSFWorkbook();// 創(chuàng)建Excel文件(Workbook)

HSSFSheetsheet1=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)

HSSFSheetsheet2=workbook.createSheet("Test1");// 創(chuàng)建工作表(Sheet)

sheet1.setDisplayGridlines(false);//隱藏Excel網格線,默認值為true

sheet2.setGridsPrinted(true);//打印時顯示網格線,默認值為false

(5)遍歷Sheet

StringfilePath="d:\\users\\lizw\\桌面\\POI\\sample.xls";

FileInputStreamstream=newFileInputStream(filePath);

HSSFWorkbookworkbook=newHSSFWorkbook(stream);//讀取現(xiàn)有的Excel

HSSFSheetsheet=workbook.getSheet("Test0");//得到指定名稱的Sheet

for(Rowrow:sheet)

{

for(Cellcell:row)

{

System.out.print(cell+"\t");

}

System.out.println();

}

7.Excel行列操作

(1)組合行、列

HSSFSheetsheet=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)

sheet.groupRow(1,3);//組合行

sheet.groupRow(2,4);//組合行

sheet.groupColumn(2,7);//組合列

這里簡單的介紹一下什么叫做組合:組合分為行組合和列組合,所謂行組合,就是讓n行組合成一個集合,能夠進行展開和合攏操作。

使用POI也可以取消組合,例如:sheet.ungroupColumn(1, 3);//取消列組合

(2)鎖定列

在Excel中,有時可能會出現(xiàn)列數(shù)太多或是行數(shù)太多的情況,這時可以通過鎖定列來凍結部分列,不隨滾動條滑動,方便查看。

HSSFSheetsheet=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)

sheet.createFreezePane(2,3,15,25);//凍結行列

下面對CreateFreezePane的參數(shù)作一下說明:

第一個參數(shù)表示要凍結的列數(shù);

第二個參數(shù)表示要凍結的行數(shù),這里只凍結列所以為0;

第三個參數(shù)表示右邊區(qū)域可見的首列序號,從1開始計算;

第四個參數(shù)表示下邊區(qū)域可見的首行序號,也是從1開始計算,這里是凍結列,所以為0;

(3)上下移動行

FileInputStreamstream=newFileInputStream(filePath);

HSSFWorkbookworkbook=newHSSFWorkbook(stream);

HSSFSheetsheet=workbook.getSheet("Test0");

sheet.shiftRows(2,4,2);//把第3行到第4行向下移動兩行

HSSFSheet.shiftRows(startRow, endRow, n)參數(shù)說明

startRow:需要移動的起始行;

endRow:需要移動的結束行;

n:移動的位置,正數(shù)表示向下移動,負數(shù)表示向上移動;

8.Excel的其他功能

(1)設置密碼

HSSFSheetsheet=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=sheet.createRow(1);

HSSFCellcell=row.createCell(1);

cell.setCellValue("已鎖定");

HSSFCellStylelocked=workbook.createCellStyle();

locked.setLocked(true);//設置鎖定

cell.setCellStyle(locked);

cell=row.createCell(2);

cell.setCellValue("未鎖定");

HSSFCellStyleunlocked=workbook.createCellStyle();

unlocked.setLocked(false);//設置不鎖定

cell.setCellStyle(unlocked);

sheet.protectSheet("password");//設置保護密碼

(2)數(shù)據(jù)有效性

HSSFSheetsheet=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)

HSSFRowrow=sheet.createRow(0);

HSSFCellcell=row.createCell(0);

cell.setCellValue("日期列");

CellRangeAddressListregions=newCellRangeAddressList(1,65535,0,0);//選定一個區(qū)域

DVConstraintconstraint=DVConstraint.createDateConstraint(DVConstraint?.?OperatorType?.?BETWEEN?,?"1993-01-01"?,"2014-12-31"?,?"yyyy-MM-dd"?);

HSSFDataValidationdataValidate=newHSSFDataValidation(regions,constraint);

dataValidate.createErrorBox("錯誤","你必須輸入一個時間!");

sheet.addValidationData(dataValidate);

CellRangeAddressList類表示一個區(qū)域,構造函數(shù)中的四個參數(shù)分別表示起始行序號,終止行序號,起始列序號,終止列序號。65535是一個Sheet的最大行數(shù)。另外,CreateDateConstraint的第一個參數(shù)除了設置成DVConstraint.OperatorType.BETWEEN外,還可以設置成如下一些值,大家可以自己一個個去試看看效果:

驗證的數(shù)據(jù)類型也有幾種選擇,如下:

(3)生成下拉式菜單

CellRangeAddressListregions=newCellRangeAddressList(0,65535,0,0);

DVConstraintconstraint=DVConstraint.createExplicitListConstraint(newString[]{"C++","Java","C#"});

HSSFDataValidationdataValidate=newHSSFDataValidation(regions,constraint);

sheet.addValidationData(dataValidate);

(4)打印基本設置

HSSFSheetsheet=workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet)

HSSFPrintSetupprint=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)超鏈接

HSSFSheetsheet=workbook.createSheet("Test0");

CreationHelpercreateHelper=workbook.getCreationHelper();

// 關聯(lián)到網站

Hyperlinklink=createHelper.createHyperlink(Hyperlink.LINK_URL);

link.setAddress("http://poi.apache.org/");

sheet.createRow(0).createCell(0).setHyperlink(link);

// 關聯(lián)到當前目錄的文件

link=createHelper.createHyperlink(Hyperlink.LINK_FILE);

link.setAddress("sample.xls");

sheet.createRow(0).createCell(1).setHyperlink(link);

// e-mail 關聯(lián)

link=createHelper.createHyperlink(Hyperlink.LINK_EMAIL);

link.setAddress("mailto:poi@apache.org?subject=Hyperlinks");

sheet.createRow(0).createCell(2).setHyperlink(link);

//關聯(lián)到工作簿中的位置

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只能能夠創(chuàng)建簡單的word文檔,相對而言POI操作時的功能太少。

(2)POI創(chuàng)建Word文檔的簡單示例

XWPFDocumentdoc=newXWPFDocument();// 創(chuàng)建Word文件

XWPFParagraphp=doc.createParagraph();// 新建一個段落

p.setAlignment(ParagraphAlignment.CENTER);// 設置段落的對齊方式

p.setBorderBottom(Borders.DOUBLE);//設置下邊框

p.setBorderTop(Borders.DOUBLE);//設置上邊框

p.setBorderRight(Borders.DOUBLE);//設置右邊框

p.setBorderLeft(Borders.DOUBLE);//設置左邊框

XWPFRunr=p.createRun();//創(chuàng)建段落文本

r.setText("POI創(chuàng)建的Word段落文本");

r.setBold(true);//設置為粗體

r.setColor("FF0000");//設置顏色

p=doc.createParagraph();// 新建一個段落

r=p.createRun();

r.setText("POI讀寫Excel功能強大、操作簡單。");

XWPFTabletable=doc.createTable(3,3);//創(chuàng)建一個表格

table.getRow(0).getCell(0).setText("表格1");

table.getRow(1).getCell(1).setText("表格2");

table.getRow(2).getCell(2).setText("表格3");

FileOutputStreamout=newFileOutputStream("d:\\POI\\sample.doc");

doc.write(out);

out.close();

(3)POI讀取Word文檔里的文字

FileInputStreamstream=newFileInputStream("d:\\POI\\sample.doc");

XWPFDocumentdoc=newXWPFDocument(stream);// 創(chuàng)建Word文件

for(XWPFParagraphp:doc.getParagraphs())//遍歷段落

{

System.out.print(p.getParagraphText());

}

for(XWPFTabletable:doc.getTables())//遍歷表格

{

for(XWPFTableRowrow:table.getRows())

{

for(XWPFTableCellcell:row.getTableCells())

{

System.out.print(cell.getText());

}

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容

  • POI操作Excel Excel簡介一個excel文件就是一個工作簿workbook,一個工作簿中可以創(chuàng)建多張工作...
    灰氣球閱讀 4,731評論 2 48
  • 轉自鏈接 目錄 1.認識NPOI 2.使用NPOI生成xls文件 2.1創(chuàng)建基本內容 2.1.1創(chuàng)建Workboo...
    腿毛褲閱讀 10,642評論 1 3
  • Apache POI 是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Ja...
    玩味Orz閱讀 2,632評論 0 0
  • 最近在網上爬取奧運項目資料,并寫入Excel中。在寫到Excel中是用到了OpenPyXL,翻譯了一部分自己用到的...
    LeeLom閱讀 200,823評論 7 78
  • 實習第二周 No.2 項目功能里要求能夠將展示的報表導出excel,因為報表的數(shù)據(jù)都是動態(tài)從list傳進來的,所...
    蘇筱筑閱讀 2,386評論 2 7