Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...
? ? ??
? ? ? ? ? ?在上一篇博客中,我們簡單介紹了java讀取word,excel和pdf文檔內容?,但在實際開發中,我們用到最多的是把數據庫中數據導出excel報表形式。不僅僅簡單的讀取office中的數據.尤其是在生產管理或者財務系統中用的非常普遍,因為這些系統經常要做一些報表打印的工作。而數據導出的格式一般是EXCEL或者PDF?。所以今天我們來簡單看一下利用Apache??POI實現數據庫中數據導出excel報表。在java中有很多實現數據導出excel報表的第三方jar包。但在比較了一下感覺還是POI相對來說比較好用。如果大家想學習其他的導出方式可以自行研究一下。
首先來了解一下?Apache?POI
?????Apache?POI?是用Java編寫的免費開源的跨平臺的?Java?API,Apache?POI提供API給Java程式對Microsoft?Office格式檔案讀和寫的功能。Apache?POI?是創建和維護操作各種符合Office?Open?XML(OOXML)標準和微軟的OLE?2復合文檔格式(OLE2)的Java?API。用它可以使用Java讀取和創建,修改MS?Excel文件.而且,還可以使用Java讀取和創建MS?Word和MSPowerPoint文件。Apache?POI?提供Java操作Excel解決方案(適用于Excel97-2008)。?下面我們來看一下Apache?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格式檔案的功能。?
? ? ? ?本節我們所要學習的是POI對excel的操作。所以我們只需用到HSSF?這部分內容就可以了。其他的請大家自行研究吧。哈哈。
下面我們就一步一步的來看一下如何創建一個excel報表:
1.?創建新的Excel工作薄
HSSFWorkbook?workbook?=?new?HSSFWorkbook();
在Excel工作簿中建一工作表,其名為缺省值。POI中還提供了其他的一些其他的workbook?構造方法。下面我們來看一下:
2.創建一個工作表
如要新建一名為"工資表"的工作表,其語句為:
HSSFSheet?sheet?=?workbook.createSheet("工資表");?
3.創建行
?在索引0的位置創建行(最頂端的行)
HSSFRow?row?=?sheet.createRow(0);
4.創建單元格
在索引0的位置創建單元格(左上端)
HSSFCell?cell?=?row.createCell((short)?0);
定義單元格為字符串類型,這個字符串類型也可在創建單元格里面設置。
cell.setCellType(HSSFCell.CELL_TYPE_STRING);?
在單元格中輸入一些內容
cell.setCellValue("增加值");?
5.新建一輸出文件流,把相應的Excel工作簿?輸出到本地
FileOutputStream?fOut?=?new?FileOutputStream(outputFile);
workbook.write(fOut);
fOut.flush();
操作結束,關閉文件
fOut.close();?
??????OK,在給單元格設置下從數據庫中讀取的數據。這樣我們就可以把數據庫里面的內容導入到excel了。當然這里我們只是簡單的介紹了一些POI的用法。并沒有細講,比如設置單元格里面數據的格式。單元格的一些屬性設置。這些將會在我下面的例子中用到。也算是給大家一些示例吧。好了。最后看一個實例吧:
EXCEL報表工具類:ExportExcel.java
package com.bzu.search.action; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.hssf.util.Region; /** * EXCEL報表工具類. * * @author caoyb * @version $Revision:$ */ public class ExportExcel { private HSSFWorkbook wb = null; private HSSFSheet sheet = null; /** * @param wb * @param sheet */ public ExportExcel(HSSFWorkbook wb, HSSFSheet sheet) { super(); this.wb = wb; this.sheet = sheet; } /** * @return the sheet */ public HSSFSheet getSheet() { return sheet; } /** * @param sheet * the sheet to set */ public void setSheet(HSSFSheet sheet) { this.sheet = sheet; } /** * @return the wb */ public HSSFWorkbook getWb() { return wb; } /** * @param wb * the wb to set */ public void setWb(HSSFWorkbook wb) { this.wb = wb; } /** * 創建通用EXCEL頭部 * * @param headString * 頭部顯示的字符 * @param colSum * 該報表的列數 */ public void createNormalHead(String headString, int colSum) { HSSFRow row = sheet.createRow(0); // 設置第一行 HSSFCell cell = row.createCell(0); row.setHeight((short) 400); // 定義單元格為字符串類型 cell.setCellType(HSSFCell.ENCODING_UTF_16); cell.setCellValue(new HSSFRichTextString("南京城區各網點進件統計報表")); // 指定合并區域 sheet.addMergedRegion(new Region(0, (short) 0, 0, (short) colSum)); HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊 cellStyle.setWrapText(true);// 指定單元格自動換行 // 設置單元格字體 HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setFontName("宋體"); font.setFontHeight((short) 300); cellStyle.setFont(font); cell.setCellStyle(cellStyle); } /** * 創建通用報表第二行 * * @param params * 統計條件數組 * @param colSum * 需要合并到的列索引 */ public void createNormalTwoRow(String[] params, int colSum) { HSSFRow row1 = sheet.createRow(1); row1.setHeight((short) 300); HSSFCell cell2 = row1.createCell(0); cell2.setCellType(HSSFCell.ENCODING_UTF_16); cell2.setCellValue(new HSSFRichTextString("統計時間:" + params[0] + "至" + params[1])); // 指定合并區域 sheet.addMergedRegion(new Region(1, (short) 0, 1, (short) colSum)); HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊 cellStyle.setWrapText(true);// 指定單元格自動換行 // 設置單元格字體 HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setFontName("宋體"); font.setFontHeight((short) 250); cellStyle.setFont(font); cell2.setCellStyle(cellStyle); } /** * 設置報表標題 * * @param columHeader * 標題字符串數組 */ public void createColumHeader(String[] columHeader) { // 設置列頭 HSSFRow row2 = sheet.createRow(2); // 指定行高 row2.setHeight((short) 600); HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊 cellStyle.setWrapText(true);// 指定單元格自動換行 // 單元格字體 HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setFontName("宋體"); font.setFontHeight((short) 250); cellStyle.setFont(font); /* * cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 設置單無格的邊框為粗體 * cellStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 設置單元格的邊框顏色. * cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); * cellStyle.setLeftBorderColor(HSSFColor.BLACK.index); * cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); * cellStyle.setRightBorderColor(HSSFColor.BLACK.index); * cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); * cellStyle.setTopBorderColor(HSSFColor.BLACK.index); */ // 設置單元格背景色 cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); HSSFCell cell3 = null; for (int i = 0; i < columHeader.length; i++) { cell3 = row2.createCell(i); cell3.setCellType(HSSFCell.ENCODING_UTF_16); cell3.setCellStyle(cellStyle); cell3.setCellValue(new HSSFRichTextString(columHeader[i])); } } /** * 創建內容單元格 * * @param wb * HSSFWorkbook * @param row * HSSFRow * @param col * short型的列索引 * @param align * 對齊方式 * @param val * 列值 */ public void cteateCell(HSSFWorkbook wb, HSSFRow row, int col, short align, String val) { HSSFCell cell = row.createCell(col); cell.setCellType(HSSFCell.ENCODING_UTF_16); cell.setCellValue(new HSSFRichTextString(val)); HSSFCellStyle cellstyle = wb.createCellStyle(); cellstyle.setAlignment(align); cell.setCellStyle(cellstyle); } /** * 創建合計行 * * @param colSum * 需要合并到的列索引 * @param cellValue */ public void createLastSumRow(int colSum, String[] cellValue) { HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊 cellStyle.setWrapText(true);// 指定單元格自動換行 // 單元格字體 HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setFontName("宋體"); font.setFontHeight((short) 250); cellStyle.setFont(font); HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1)); HSSFCell sumCell = lastRow.createCell(0); sumCell.setCellValue(new HSSFRichTextString("合計")); sumCell.setCellStyle(cellStyle); sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short) 0, sheet.getLastRowNum(), (short) colSum));// 指定合并區域 for (int i = 2; i < (cellValue.length + 2); i++) { sumCell = lastRow.createCell(i); sumCell.setCellStyle(cellStyle); sumCell.setCellValue(new HSSFRichTextString(cellValue[i - 2])); } } /** * 輸入EXCEL文件 * * @param fileName * 文件名 */ public void outputExcel(String fileName) { FileOutputStream fos = null; try { fos = new FileOutputStream(new File(fileName)); wb.write(fos); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
報表生成類:ComplexExportExcelClient.java
? ?運行上述兩段代碼你就會在c盤的根目錄下看到一個拒絕件統計.xls文件
注明:示例參考至網絡
------------------------------------------------------------------------------------------------------------------------
? 廣告:我參加了2012年度IT博客大賽,希望大家能多多支持
------------------------------------------------------------------------------------------------------------
《Java程序員由笨鳥到菜鳥》電子版書正式發布,歡迎大家下載
http://blog.csdn.net/csh624366188/article/details/7×××47
轉載于:https://blog.51cto.com/javacsh/1129122
總結
以上是生活随笔為你收集整理的Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性代数与矩阵论 习题 1.2.2
- 下一篇: Java进阶02 异常处理