| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
jopen
10年前发布

Java使用POI实现数据导出excel报表

首先来了解一下 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的用法。并没有细讲,比如设置单元格里面数据的格式。单元格的一些属性设置。这些将会在我下面的例子中用到。也算是给大家一些示例吧。好了。最后看一个实例吧:

 

报表生成类:ComplexExportExcelClient.java 

[java] view plaincopy
</div> </div>
  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. }   
</div>

EXCEL报表工具类:ExportExcel.java

 

[java] view plaincopy
</div> </div>
  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. }  
</div>

 本文由用户 jopen 自行上传分享,仅供网友学习交流。所有权归原作者,若您的权利被侵害,请联系管理员。
 转载本站原创文章,请注明出处,并保留原始链接、图片水印。
 本站是一个以用户分享为主的开源技术平台,欢迎各类分享!