java生成EXCEL表格(POI vs JXL)
??? 后來因?yàn)樽鲰?xiàng)目的關(guān)系,知道了還有個(gè)JXL(java excel),也是個(gè)開源項(xiàng)目,用起來的感覺跟POI很類似,因?yàn)橛玫降墓δ芏己芎唵?,也沒覺得有什么大的差距。網(wǎng)上找了一些他們的區(qū)別,算是給自己掃盲了。
?
?????以下為轉(zhuǎn)貼,紅色為自己標(biāo)注。
?
??? 自從 MS 公開了 OFFICE 的編碼格式以來,很多開源的組織都提供了對 Excel 支持讀寫操作的插件包。Java 世界里,Apache應(yīng)該算是開源世界中的領(lǐng)頭羊。他的 Jakarta Project 中的 POI Project 就提供了對OFFICE的完美支持(不過最近好像他對Word的支持項(xiàng)目已經(jīng)停止,而且公開在網(wǎng)站上圈人呢,如果你對Word文件的編碼格式非常熟悉,可以發(fā)封郵件哦?。?,當(dāng)然除此之外,還有很多其他開源組織也對 Excel 的讀寫操作提供了很好的支持,其中簡單而且實(shí)用的便是 Display-tag ,程序員根本就不需要考慮如何將數(shù)據(jù)合理地寫入Excel中,這一切都是由其 Servlet 自動(dòng)完成,但也正是由于他對程序員是透明的,因此為很多操作也帶來了不便。在接下來的文字中我會(huì)介紹另外一種同樣對Excel提供了完美支持的第三方插件 JXL ,Java Excel是一開放源碼項(xiàng)目,通過它Java開發(fā)人員可以讀取Excel文件的內(nèi)容、創(chuàng)建新的Excel文件、更新已經(jīng)存在的Excel文件。使用該API非Windows操作系統(tǒng)也可以通過純Java應(yīng)用來處理Excel數(shù)據(jù)表。因?yàn)槭鞘褂肑ava編寫的,所以我們在Web應(yīng)用中可以通過JSP、Servlet來調(diào)用API實(shí)現(xiàn)對Excel數(shù)據(jù)表的訪問。
?
1、遍歷workbook
- //?load源文件 ??
- POIFSFileSystem?fs?=? new ?POIFSFileSystem( new ?FileInputStream(filePath)); ??
- HSSFWorkbook?wb?=? new ?HSSFWorkbook(fs); ??
- for ?( int ?i?=? 0 ;?i?<?wb.getNumberOfSheets();?i++)?{ ??
- ????HSSFSheet?sheet?=?wb.getSheetAt(i); ??
- ???? for ?( int ?i?=?sheet.getFirstRowNum();?i?<?sheet.getLastRowNum();?i?++)?{ ??
- ????HSSFRow?row?=?sheet.getRow(i); ??
- ???????????? if ?(row?!=? null )?{ ??
- ????????。。。操作} ??
- ???????} ??
- ?????} ??
- //?目標(biāo)文件 ??
- FileOutputStream?fos?=? new ?FileOutputStream(objectPath); ??
- //寫文件 ??
- swb.write(fos); ??
- fos.close();??
// load源文件 POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filePath)); HSSFWorkbook wb = new HSSFWorkbook(fs); for (int i = 0; i < wb.getNumberOfSheets(); i++) { HSSFSheet sheet = wb.getSheetAt(i); for (int i = sheet.getFirstRowNum(); i < sheet.getLastRowNum(); i ++) { HSSFRow row = sheet.getRow(i); if (row != null) { 。。。操作} } } // 目標(biāo)文件 FileOutputStream fos = new FileOutputStream(objectPath); //寫文件 swb.write(fos); fos.close();
2、得到列和單元格
- HSSFRow?row?=?sheet.getRow(i); ??
- HSSFCell?cell?=?row.getCell(( short )?j);??
HSSFRow row = sheet.getRow(i); HSSFCell cell = row.getCell((short) j);
3、設(shè)置sheet名稱和單元格內(nèi)容為中文
- wb.setSheetName(n,? "中文" ,HSSFCell.ENCODING_UTF_16);???? ??
- cell.setEncoding(( short )? 1 ); ??
- cell.setCellValue( "中文" );??
wb.setSheetName(n, "中文",HSSFCell.ENCODING_UTF_16); cell.setEncoding((short) 1); cell.setCellValue("中文");
4、單元格內(nèi)容未公式或數(shù)值,可以這樣讀寫
- cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); ??
- cell.getNumericCellValue()??
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); cell.getNumericCellValue()
5、設(shè)置列寬、行高
- sheet.setColumnWidth(( short )column,( short )width); ??
- row.setHeight(( short )height);??
sheet.setColumnWidth((short)column,(short)width); row.setHeight((short)height);
6、添加區(qū)域,合并單元格
- Region?region?=? new ?Region(( short )rowFrom,( short )columnFrom,( short )rowTo,( short )columnTo); ??
- sheet.addMergedRegion(region); ??
- //得到所有區(qū)域 ??
- sheet.getNumMergedRegions()??
Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo,(short)columnTo); sheet.addMergedRegion(region); //得到所有區(qū)域 sheet.getNumMergedRegions()
7、常用方法
根據(jù)單元格不同屬性返回字符串?dāng)?shù)值
- public ?String?getCellStringValue(HSSFCell?cell)?{ ??
- ????????String?cellValue?=? "" ; ??
- ???????? switch ?(cell.getCellType())?{ ??
- ???????? case ?HSSFCell.CELL_TYPE_STRING: ??
- ????????????cellValue?=?cell.getStringCellValue(); ??
- ???????????? if (cellValue.trim().equals( "" )||cellValue.trim().length()<= 0 ) ??
- ????????????????cellValue= "?" ; ??
- ???????????? break ; ??
- ???????? case ?HSSFCell.CELL_TYPE_NUMERIC: ??
- ????????????cellValue?=?String.valueOf(cell.getNumericCellValue()); ??
- ???????????? break ; ??
- ???????? case ?HSSFCell.CELL_TYPE_FORMULA: ??
- ????????????cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); ??
- ????????????cellValue?=?String.valueOf(cell.getNumericCellValue()); ??
- ???????????? break ; ??
- ???????? case ?HSSFCell.CELL_TYPE_BLANK: ??
- ????????????cellValue= "?" ; ??
- ???????????? break ; ??
- ???????? case ?HSSFCell.CELL_TYPE_BOOLEAN: ??
- ???????????? break ; ??
- ???????? case ?HSSFCell.CELL_TYPE_ERROR: ??
- ???????????? break ; ??
- ???????? default : ??
- ???????????? break ; ??
- ????????} ??
- ???????? return ?cellValue; ??
- ????}??
public String getCellStringValue(HSSFCell cell) { String cellValue = ""; switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: cellValue = cell.getStringCellValue(); if(cellValue.trim().equals("")||cellValue.trim().length()<=0) cellValue=" "; break; case HSSFCell.CELL_TYPE_NUMERIC: cellValue = String.valueOf(cell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_FORMULA: cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); cellValue = String.valueOf(cell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_BLANK: cellValue="?"; break; case HSSFCell.CELL_TYPE_BOOLEAN: break; case HSSFCell.CELL_TYPE_ERROR: break; default: break; } return cellValue; }
8、常用單元格邊框格式
虛線HSSFCellStyle.BORDER_DOTTED
實(shí)線HSSFCellStyle.BORDER_THIN
- public ? static ?HSSFCellStyle?getCellStyle( short ?type) ??
- ????{??? ??
- ???????HSSFWorkbook?wb?=? new ?HSSFWorkbook(); ??
- ???????HSSFCellStyle?style?=?wb.createCellStyle(); ??
- ???????style.setBorderBottom(type); //下邊框? ??
- ????????style.setBorderLeft(type); //左邊框? ??
- ????????style.setBorderRight(type); //右邊框? ??
- ????????style.setBorderTop(type); //上邊框? ??
- ??????? return ?style; ??
- ????}??
public static HSSFCellStyle getCellStyle(short type) { HSSFWorkbook wb = new HSSFWorkbook(); HSSFCellStyle style = wb.createCellStyle(); style.setBorderBottom(type);//下邊框 style.setBorderLeft(type);//左邊框 style.setBorderRight(type);//右邊框 style.setBorderTop(type);//上邊框 return style; }
9、設(shè)置字體和內(nèi)容位置
- HSSFFont?f??=?wb.createFont(); ??
- f.setFontHeightInPoints(( short )? 11 ); //字號(hào) ??
- f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); //加粗 ??
- style.setFont(f); ??
- style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //左右居中 ??
- style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //上下居中 ??
- style.setRotation( short ?rotation); //單元格內(nèi)容的旋轉(zhuǎn)的角度 ??
- HSSFDataFormat?df?=?wb.createDataFormat(); ??
- style1.setDataFormat(df.getFormat( "0.00%" )); //設(shè)置單元格數(shù)據(jù)格式 ??
- cell.setCellFormula(string); //給單元格設(shè)公式 ??
- style.setRotation( short ?rotation); //單元格內(nèi)容的旋轉(zhuǎn)的角度 ??
- cell.setCellStyle(style);??
HSSFFont f = wb.createFont(); f.setFontHeightInPoints((short) 11);//字號(hào) f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗 style.setFont(f); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中 style.setRotation(short rotation);//單元格內(nèi)容的旋轉(zhuǎn)的角度 HSSFDataFormat df = wb.createDataFormat(); style1.setDataFormat(df.getFormat("0.00%"));//設(shè)置單元格數(shù)據(jù)格式 cell.setCellFormula(string);//給單元格設(shè)公式 style.setRotation(short rotation);//單元格內(nèi)容的旋轉(zhuǎn)的角度 cell.setCellStyle(style);
10、插入圖片
論壇里看到的
- //先把讀進(jìn)來的圖片放到一個(gè)ByteArrayOutputStream中,以便產(chǎn)生ByteArray ??
- ??????ByteArrayOutputStream?byteArrayOut?=? new ?ByteArrayOutputStream(); ??
- ??????BufferedImage?bufferImg?=?ImageIO.read( new ?File( "ok.jpg" )); ??
- ??????ImageIO.write(bufferImg, "jpg" ,byteArrayOut); ??
- //讀進(jìn)一個(gè)excel模版 ??
- FileInputStream?fos?=? new ?FileInputStream(filePathName+ "/stencil.xlt" );? ??
- fs?=? new ?POIFSFileSystem(fos); ??
- //創(chuàng)建一個(gè)工作薄 ??
- HSSFWorkbook?wb?=? new ?HSSFWorkbook(fs); ??
- HSSFSheet?sheet?=?wb.getSheetAt( 0 ); ??
- HSSFPatriarch?patriarch?=?sheet.createDrawingPatriarch(); ??
- HSSFClientAnchor?anchor?=? new ?HSSFClientAnchor( 0 , 0 , 1023 , 255 ,( short )? 0 , 0 ,( short ) 10 , 10 );????? ??
- patriarch.createPicture(anchor?,?wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));??
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
