Java使用POI實現數據導出excel報表

jopen 10年前發布 | 126K 次閱讀 POI Office文檔處理

首先來了解一下 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工作薄</p>

     


    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的用法。并沒有細講,比如設置單元格里面數據的格式。單元格的一些屬性設置。這些將會在我下面的例子中用到。也算是給大家一些示例吧。好了。最后看一個實例吧:

     

    報表生成類:ComplexExportExcelClient.java 

    1. import java.util.ArrayList;  
    2. import java.util.List;  
    3.   
    4. import org.apache.poi.hssf.usermodel.HSSFCell;  
    5. import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
    6. import org.apache.poi.hssf.usermodel.HSSFFont;  
    7. import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
    8. import org.apache.poi.hssf.usermodel.HSSFRow;  
    9. import org.apache.poi.hssf.usermodel.HSSFSheet;  
    10. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
    11. import org.apache.poi.hssf.util.Region;  
    12.   
    13. /** 
    14.  * 拒絕件報表生成類. 
    15.  *  
    16.  * @author caoyb 
    17.  * @version $Revision:$ 
    18.  */  
    19. public class ComplexExportExcelClient {  
    20.   
    21.     private static HSSFWorkbook wb = new HSSFWorkbook();  
    22.   
    23.     private static HSSFSheet sheet = wb.createSheet();  
    24.   
    25.     public static void main(String[] args) {  
    26.   
    27.         ExportExcel exportExcel = new ExportExcel(wb, sheet);  
    28.   
    29.         // 創建列標頭LIST  
    30.         List fialList = new ArrayList();  
    31.   
    32.         fialList.add("申請人未提供任何聯系方式");  
    33.         fialList.add("無工作單位信息且未提供收入來源信息");  
    34.         fialList.add("有工作單位但未提供單位地址或電話");  
    35.         fialList.add("家庭地址缺失");  
    36.         fialList.add("客戶身份證明資料缺");  
    37.         fialList.add("簽名缺失或簽名不符合要求");  
    38.         fialList.add("其它");  
    39.   
    40.         List errorList = new ArrayList();  
    41.   
    42.         errorList.add("客戶主動取消");  
    43.         errorList.add("個人征信不良");  
    44.         errorList.add("欺詐申請");  
    45.         errorList.add("申請人基本條件不符");  
    46.         errorList.add("申請材料不合規");  
    47.         errorList.add("無法正常完成征信");  
    48.         errorList.add("重復申請");  
    49.         errorList.add("其他");  
    50.   
    51.         // 計算該報表的列數  
    52.         int number = 2 + fialList.size() * 2 + errorList.size() * 2;  
    53.   
    54.         // 給工作表列定義列寬(實際應用自己更改列數)  
    55.         for (int i = 0; i < number; i++) {  
    56.             sheet.setColumnWidth(i, 3000);  
    57.   
    58.         }  
    59.   
    60.         // 創建單元格樣式  
    61.         HSSFCellStyle cellStyle = wb.createCellStyle();  
    62.   
    63.         // 指定單元格居中對齊  
    64.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
    65.   
    66.         // 指定單元格垂直居中對齊  
    67.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
    68.   
    69.         // 指定當單元格內容顯示不下時自動換行  
    70.         cellStyle.setWrapText(true);  
    71.   
    72.         // 設置單元格字體  
    73.         HSSFFont font = wb.createFont();  
    74.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
    75.         font.setFontName("宋體");  
    76.         font.setFontHeight((short200);  
    77.         cellStyle.setFont(font);  
    78.   
    79.         // 創建報表頭部  
    80.         exportExcel.createNormalHead("南京地區申請資料拒件分析統計", number);  
    81.   
    82.         // 設置第二行  
    83.         String[] params = new String[] { "    年  月  日""  年  月  日" };  
    84.         exportExcel.createNormalTwoRow(params, number);  
    85.   
    86.         // 設置列頭  
    87.         HSSFRow row2 = sheet.createRow(2);  
    88.   
    89.         HSSFCell cell0 = row2.createCell(0);  
    90.         cell0.setCellStyle(cellStyle);  
    91.         cell0.setCellValue(new HSSFRichTextString("機構代碼"));  
    92.   
    93.         HSSFCell cell1 = row2.createCell(1);  
    94.         cell1.setCellStyle(cellStyle);  
    95.         cell1.setCellValue(new HSSFRichTextString("支行名稱"));  
    96.   
    97.         HSSFCell cell2 = row2.createCell(2);  
    98.         cell2.setCellStyle(cellStyle);  
    99.         cell2.setCellValue(new HSSFRichTextString("無效件"));  
    100.   
    101.         HSSFCell cell3 = row2.createCell(2 * fialList.size() + 2);  
    102.         cell3.setCellStyle(cellStyle);  
    103.         cell3.setCellValue(new HSSFRichTextString("拒絕件"));  
    104.   
    105.         HSSFRow row3 = sheet.createRow(3);  
    106.   
    107.         // 設置行高  
    108.         row3.setHeight((short800);  
    109.   
    110.         HSSFCell row3Cell = null;  
    111.         int m = 0;  
    112.         int n = 0;  
    113.   
    114.         // 創建不同的LIST的列標題  
    115.         for (int i = 2; i < number; i = i + 2) {  
    116.   
    117.             if (i < 2 * fialList.size() + 2) {  
    118.                 row3Cell = row3.createCell(i);  
    119.                 row3Cell.setCellStyle(cellStyle);  
    120.                 row3Cell.setCellValue(new HSSFRichTextString(fialList.get(m)  
    121.                         .toString()));  
    122.                 m++;  
    123.             } else {  
    124.                 row3Cell = row3.createCell(i);  
    125.                 row3Cell.setCellStyle(cellStyle);  
    126.                 row3Cell.setCellValue(new HSSFRichTextString(errorList.get(n)  
    127.                         .toString()));  
    128.                 n++;  
    129.             }  
    130.   
    131.         }  
    132.   
    133.         // 創建最后一列的合計列  
    134.         row3Cell = row3.createCell(number);  
    135.         row3Cell.setCellStyle(cellStyle);  
    136.         row3Cell.setCellValue(new HSSFRichTextString("合計"));  
    137.   
    138.         // 合并單元格  
    139.         HSSFRow row4 = sheet.createRow(4);  
    140.   
    141.         // 合并第三行到第五行的第一列  
    142.         sheet.addMergedRegion(new Region(2, (short04, (short0));  
    143.   
    144.         // 合并第三行到第五行的第二列  
    145.         sheet.addMergedRegion(new Region(2, (short14, (short1));  
    146.   
    147.         // 合并第三行的第三列到第AA指定的列  
    148.         int aa = 2 * fialList.size() + 1;  
    149.         sheet.addMergedRegion(new Region(2, (short22, (short) aa));  
    150.   
    151.         int start = aa + 1;  
    152.   
    153.         sheet.addMergedRegion(new Region(2, (short) start, 2,  
    154.                 (short) (number - 1)));  
    155.   
    156.         // 循環合并第四行的行,并且是每2列合并成一列  
    157.         for (int i = 2; i < number; i = i + 2) {  
    158.             sheet.addMergedRegion(new Region(3, (short) i, 3, (short) (i + 1)));  
    159.   
    160.         }  
    161.   
    162.         // 根據列數奇偶數的不同創建不同的列標題  
    163.         for (int i = 2; i < number; i++) {  
    164.             if (i < 2 * fialList.size() + 2) {  
    165.   
    166.                 if (i % 2 == 0) {  
    167.                     HSSFCell cell = row4.createCell(i);  
    168.                     cell.setCellStyle(cellStyle);  
    169.                     cell.setCellValue(new HSSFRichTextString("無效量"));  
    170.                 } else {  
    171.                     HSSFCell cell = row4.createCell(i);  
    172.                     cell.setCellStyle(cellStyle);  
    173.                     cell.setCellValue(new HSSFRichTextString("占比"));  
    174.                 }  
    175.             } else {  
    176.                 if (i % 2 == 0) {  
    177.                     HSSFCell cell = row4.createCell(i);  
    178.                     cell.setCellStyle(cellStyle);  
    179.                     cell.setCellValue(new HSSFRichTextString("拒絕量"));  
    180.                 } else {  
    181.                     HSSFCell cell = row4.createCell(i);  
    182.                     cell.setCellStyle(cellStyle);  
    183.                     cell.setCellValue(new HSSFRichTextString("占比"));  
    184.                 }  
    185.             }  
    186.   
    187.         }  
    188.   
    189.         // 循環創建中間的單元格的各項的值  
    190.         for (int i = 5; i < number; i++) {  
    191.             HSSFRow row = sheet.createRow((short) i);  
    192.             for (int j = 0; j <= number; j++) {  
    193.                 exportExcel  
    194.                         .cteateCell(wb, row, (short) j,  
    195.                                 HSSFCellStyle.ALIGN_CENTER_SELECTION, String  
    196.                                         .valueOf(j));  
    197.             }  
    198.   
    199.         }  
    200.   
    201.         // 創建最后一行的合計行  
    202.         String[] cellValue = new String[number - 1];  
    203.         for (int i = 0; i < number - 1; i++) {  
    204.             cellValue[i] = String.valueOf(i);  
    205.   
    206.         }  
    207.         exportExcel.createLastSumRow(1, cellValue);  
    208.   
    209.         exportExcel.outputExcel("c:\\拒絕件統計.xls");  
    210.   
    211.     }  
    212. }   

    EXCEL報表工具類:ExportExcel.java

     

    1. import java.io.File;  
    2. import java.io.FileNotFoundException;  
    3. import java.io.FileOutputStream;  
    4. import java.io.IOException;  
    5. import java.util.ArrayList;  
    6. import java.util.List;  
    7.   
    8. import org.apache.poi.hssf.usermodel.HSSFCell;  
    9. import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
    10. import org.apache.poi.hssf.usermodel.HSSFFont;  
    11. import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
    12. import org.apache.poi.hssf.usermodel.HSSFRow;  
    13. import org.apache.poi.hssf.usermodel.HSSFSheet;  
    14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
    15. import org.apache.poi.hssf.util.HSSFColor;  
    16. import org.apache.poi.hssf.util.Region;  
    17.   
    18. public class ExportExcel {  
    19.   
    20.     private HSSFWorkbook wb = null;  
    21.   
    22.     private HSSFSheet sheet = null;  
    23.   
    24.     /** 
    25.      * @param wb 
    26.      * @param sheet 
    27.      */  
    28.     public ExportExcel(HSSFWorkbook wb, HSSFSheet sheet) {  
    29.         super();  
    30.         this.wb = wb;  
    31.         this.sheet = sheet;  
    32.     }  
    33.   
    34.     /** 
    35.      * @return the sheet 
    36.      */  
    37.     public HSSFSheet getSheet() {  
    38.         return sheet;  
    39.     }  
    40.   
    41.     /** 
    42.      * @param sheet 
    43.      *            the sheet to set 
    44.      */  
    45.     public void setSheet(HSSFSheet sheet) {  
    46.         this.sheet = sheet;  
    47.     }  
    48.   
    49.     /** 
    50.      * @return the wb 
    51.      */  
    52.     public HSSFWorkbook getWb() {  
    53.         return wb;  
    54.     }  
    55.   
    56.     /** 
    57.      * @param wb 
    58.      *            the wb to set 
    59.      */  
    60.     public void setWb(HSSFWorkbook wb) {  
    61.         this.wb = wb;  
    62.     }  
    63.   
    64.     /** 
    65.      * 創建通用EXCEL頭部 
    66.      *  
    67.      * @param headString 
    68.      *            頭部顯示的字符 
    69.      * @param colSum 
    70.      *            該報表的列數 
    71.      */  
    72.     public void createNormalHead(String headString, int colSum) {  
    73.   
    74.         HSSFRow row = sheet.createRow(0);  
    75.   
    76.         // 設置第一行  
    77.         HSSFCell cell = row.createCell(0);  
    78.         row.setHeight((short400);  
    79.   
    80.         // 定義單元格為字符串類型  
    81.         cell.setCellType(HSSFCell.ENCODING_UTF_16);  
    82.         cell.setCellValue(new HSSFRichTextString("南京城區各網點進件統計報表"));  
    83.   
    84.         // 指定合并區域  
    85.         sheet.addMergedRegion(new Region(0, (short00, (short) colSum));  
    86.   
    87.         HSSFCellStyle cellStyle = wb.createCellStyle();  
    88.   
    89.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊  
    90.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊  
    91.         cellStyle.setWrapText(true);// 指定單元格自動換行  
    92.   
    93.         // 設置單元格字體  
    94.         HSSFFont font = wb.createFont();  
    95.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
    96.         font.setFontName("宋體");  
    97.         font.setFontHeight((short300);  
    98.         cellStyle.setFont(font);  
    99.   
    100.         cell.setCellStyle(cellStyle);  
    101.     }  
    102.   
    103.     /** 
    104.      * 創建通用報表第二行 
    105.      *  
    106.      * @param params 
    107.      *            統計條件數組 
    108.      * @param colSum 
    109.      *            需要合并到的列索引 
    110.      */  
    111.     public void createNormalTwoRow(String[] params, int colSum) {  
    112.         HSSFRow row1 = sheet.createRow(1);  
    113.         row1.setHeight((short300);  
    114.   
    115.         HSSFCell cell2 = row1.createCell(0);  
    116.   
    117.         cell2.setCellType(HSSFCell.ENCODING_UTF_16);  
    118.         cell2.setCellValue(new HSSFRichTextString("統計時間:" + params[0] + "至"  
    119.                 + params[1]));  
    120.   
    121.         // 指定合并區域  
    122.         sheet.addMergedRegion(new Region(1, (short01, (short) colSum));  
    123.   
    124.         HSSFCellStyle cellStyle = wb.createCellStyle();  
    125.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊  
    126.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊  
    127.         cellStyle.setWrapText(true);// 指定單元格自動換行  
    128.   
    129.         // 設置單元格字體  
    130.         HSSFFont font = wb.createFont();  
    131.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
    132.         font.setFontName("宋體");  
    133.         font.setFontHeight((short250);  
    134.         cellStyle.setFont(font);  
    135.   
    136.         cell2.setCellStyle(cellStyle);  
    137.   
    138.     }  
    139.   
    140.     /** 
    141.      * 設置報表標題 
    142.      *  
    143.      * @param columHeader 
    144.      *            標題字符串數組 
    145.      */  
    146.     public void createColumHeader(String[] columHeader) {  
    147.   
    148.         // 設置列頭  
    149.         HSSFRow row2 = sheet.createRow(2);  
    150.   
    151.         // 指定行高  
    152.         row2.setHeight((short600);  
    153.   
    154.         HSSFCellStyle cellStyle = wb.createCellStyle();  
    155.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊  
    156.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊  
    157.         cellStyle.setWrapText(true);// 指定單元格自動換行  
    158.   
    159.         // 單元格字體  
    160.         HSSFFont font = wb.createFont();  
    161.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
    162.         font.setFontName("宋體");  
    163.         font.setFontHeight((short250);  
    164.         cellStyle.setFont(font);  
    165.   
    166.         /* 
    167.          * cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 設置單無格的邊框為粗體 
    168.          * cellStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 設置單元格的邊框顏色. 
    169.          * cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); 
    170.          * cellStyle.setLeftBorderColor(HSSFColor.BLACK.index); 
    171.          * cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); 
    172.          * cellStyle.setRightBorderColor(HSSFColor.BLACK.index); 
    173.          * cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); 
    174.          * cellStyle.setTopBorderColor(HSSFColor.BLACK.index); 
    175.          */  
    176.   
    177.         // 設置單元格背景色  
    178.         cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);  
    179.         cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
    180.   
    181.         HSSFCell cell3 = null;  
    182.   
    183.         for (int i = 0; i < columHeader.length; i++) {  
    184.             cell3 = row2.createCell(i);  
    185.             cell3.setCellType(HSSFCell.ENCODING_UTF_16);  
    186.             cell3.setCellStyle(cellStyle);  
    187.             cell3.setCellValue(new HSSFRichTextString(columHeader[i]));  
    188.         }  
    189.   
    190.     }  
    191.   
    192.     /** 
    193.      * 創建內容單元格 
    194.      *  
    195.      * @param wb 
    196.      *            HSSFWorkbook 
    197.      * @param row 
    198.      *            HSSFRow 
    199.      * @param col 
    200.      *            short型的列索引 
    201.      * @param align 
    202.      *            對齊方式 
    203.      * @param val 
    204.      *            列值 
    205.      */  
    206.     public void cteateCell(HSSFWorkbook wb, HSSFRow row, int col, short align,  
    207.             String val) {  
    208.         HSSFCell cell = row.createCell(col);  
    209.         cell.setCellType(HSSFCell.ENCODING_UTF_16);  
    210.         cell.setCellValue(new HSSFRichTextString(val));  
    211.         HSSFCellStyle cellstyle = wb.createCellStyle();  
    212.         cellstyle.setAlignment(align);  
    213.         cell.setCellStyle(cellstyle);  
    214.     }  
    215.   
    216.     /** 
    217.      * 創建合計行 
    218.      *  
    219.      * @param colSum 
    220.      *            需要合并到的列索引 
    221.      * @param cellValue 
    222.      */  
    223.     public void createLastSumRow(int colSum, String[] cellValue) {  
    224.   
    225.         HSSFCellStyle cellStyle = wb.createCellStyle();  
    226.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊  
    227.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊  
    228.         cellStyle.setWrapText(true);// 指定單元格自動換行  
    229.   
    230.         // 單元格字體  
    231.         HSSFFont font = wb.createFont();  
    232.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
    233.         font.setFontName("宋體");  
    234.         font.setFontHeight((short250);  
    235.         cellStyle.setFont(font);  
    236.   
    237.         HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1));  
    238.         HSSFCell sumCell = lastRow.createCell(0);  
    239.   
    240.         sumCell.setCellValue(new HSSFRichTextString("合計"));  
    241.         sumCell.setCellStyle(cellStyle);  
    242.         sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short0,  
    243.                 sheet.getLastRowNum(), (short) colSum));// 指定合并區域  
    244.   
    245.         for (int i = 2; i < (cellValue.length + 2); i++) {  
    246.             sumCell = lastRow.createCell(i);  
    247.             sumCell.setCellStyle(cellStyle);  
    248.             sumCell.setCellValue(new HSSFRichTextString(cellValue[i - 2]));  
    249.   
    250.         }  
    251.   
    252.     }  
    253.   
    254.     /** 
    255.      * 輸入EXCEL文件 
    256.      *  
    257.      * @param fileName 
    258.      *            文件名 
    259.      */  
    260.     public void outputExcel(String fileName) {  
    261.         FileOutputStream fos = null;  
    262.         try {  
    263.             fos = new FileOutputStream(new File(fileName));  
    264.             wb.write(fos);  
    265.             fos.close();  
    266.         } catch (FileNotFoundException e) {  
    267.             e.printStackTrace();  
    268.         } catch (IOException e) {  
    269.             e.printStackTrace();  
    270.         }  
    271.     }  
    272. }  
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!