java生成EXCEL表格(POI vs JXL)
??? 后來因為做項目的關系,知道了還有個JXL(java excel),也是個開源項目,用起來的感覺跟POI很類似,因為用到的功能都很簡單,也沒覺得有什么大的差距。網上找了一些他們的區別,算是給自己掃盲了。
?
?????以下為轉貼,紅色為自己標注。
?
??? 自從 MS 公開了 OFFICE 的編碼格式以來,很多開源的組織都提供了對 Excel 支持讀寫操作的插件包。Java 世界里,Apache應該算是開源世界中的領頭羊。他的 Jakarta Project 中的 POI Project 就提供了對OFFICE的完美支持(不過最近好像他對Word的支持項目已經停止,而且公開在網站上圈人呢,如果你對Word文件的編碼格式非常熟悉,可以發封郵件哦!),當然除此之外,還有很多其他開源組織也對 Excel 的讀寫操作提供了很好的支持,其中簡單而且實用的便是 Display-tag ,程序員根本就不需要考慮如何將數據合理地寫入Excel中,這一切都是由其 Servlet 自動完成,但也正是由于他對程序員是透明的,因此為很多操作也帶來了不便。在接下來的文字中我會介紹另外一種同樣對Excel提供了完美支持的第三方插件 JXL ,Java Excel是一開放源碼項目,通過它Java開發人員可以讀取Excel文件的內容、創建新的Excel文件、更新已經存在的Excel文件。使用該API非Windows操作系統也可以通過純Java應用來處理Excel數據表。因為是使用Java編寫的,所以我們在Web應用中可以通過JSP、Servlet來調用API實現對Excel數據表的訪問。
?
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 )?{ ??
- ????????。。。操作} ??
- ???????} ??
- ?????} ??
- //?目標文件 ??
- 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) { 。。。操作} } } // 目標文件 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、設置sheet名稱和單元格內容為中文
- 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、單元格內容未公式或數值,可以這樣讀寫
- cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); ??
- cell.getNumericCellValue()??
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); cell.getNumericCellValue()
5、設置列寬、行高
- sheet.setColumnWidth(( short )column,( short )width); ??
- row.setHeight(( short )height);??
sheet.setColumnWidth((short)column,(short)width); row.setHeight((short)height);
6、添加區域,合并單元格
- Region?region?=? new ?Region(( short )rowFrom,( short )columnFrom,( short )rowTo,( short )columnTo); ??
- sheet.addMergedRegion(region); ??
- //得到所有區域 ??
- sheet.getNumMergedRegions()??
Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo,(short)columnTo); sheet.addMergedRegion(region); //得到所有區域 sheet.getNumMergedRegions()
7、常用方法
根據單元格不同屬性返回字符串數值
- 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
實線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、設置字體和內容位置
- HSSFFont?f??=?wb.createFont(); ??
- f.setFontHeightInPoints(( short )? 11 ); //字號 ??
- f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); //加粗 ??
- style.setFont(f); ??
- style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //左右居中 ??
- style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //上下居中 ??
- style.setRotation( short ?rotation); //單元格內容的旋轉的角度 ??
- HSSFDataFormat?df?=?wb.createDataFormat(); ??
- style1.setDataFormat(df.getFormat( "0.00%" )); //設置單元格數據格式 ??
- cell.setCellFormula(string); //給單元格設公式 ??
- style.setRotation( short ?rotation); //單元格內容的旋轉的角度 ??
- cell.setCellStyle(style);??
HSSFFont f = wb.createFont(); f.setFontHeightInPoints((short) 11);//字號 f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗 style.setFont(f); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中 style.setRotation(short rotation);//單元格內容的旋轉的角度 HSSFDataFormat df = wb.createDataFormat(); style1.setDataFormat(df.getFormat("0.00%"));//設置單元格數據格式 cell.setCellFormula(string);//給單元格設公式 style.setRotation(short rotation);//單元格內容的旋轉的角度 cell.setCellStyle(style);
10、插入圖片
論壇里看到的
- //先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray ??
- ??????ByteArrayOutputStream?byteArrayOut?=? new ?ByteArrayOutputStream(); ??
- ??????BufferedImage?bufferImg?=?ImageIO.read( new ?File( "ok.jpg" )); ??
- ??????ImageIO.write(bufferImg, "jpg" ,byteArrayOut); ??
- //讀進一個excel模版 ??
- FileInputStream?fos?=? new ?FileInputStream(filePathName+ "/stencil.xlt" );? ??
- fs?=? new ?POIFSFileSystem(fos); ??
- //創建一個工作薄 ??
- 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));??
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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