日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...

發布時間:2023/12/4 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?APIApache?POI提供APIJava程式對Microsoft?Office格式檔案讀和寫的功能。Apache?POI?是創建和維護操作各種符合Office?Open?XMLOOXML)標準和微軟的OLE?2復合文檔格式(OLE2)的Java?API。用它可以使用Java讀取和創建,修改MS?Excel文件.而且,還可以使用Java讀取和創建MS?WordMSPowerPoint文件。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格式檔案的功能。?


? ? ? ?本節我們所要學習的是POIexcel的操作。所以我們只需用到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


package com.bzu.search.action; import java.util.ArrayList; import java.util.List; 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.Region; /** * 拒絕件報表生成類. * * @author caoyb * @version $Revision:$ */ public class ComplexExportExcelClient { private static HSSFWorkbook wb = new HSSFWorkbook(); private static HSSFSheet sheet = wb.createSheet(); @SuppressWarnings({ "unchecked", "deprecation" }) public static void main(String[] args) { ExportExcel exportExcel = new ExportExcel(wb, sheet); // 創建列標頭LIST List fialList = new ArrayList(); fialList.add("申請人未提供任何聯系方式"); fialList.add("無工作單位信息且未提供收入來源信息"); fialList.add("有工作單位但未提供單位地址或電話"); fialList.add("家庭地址缺失"); fialList.add("客戶×××明資料缺"); fialList.add("簽名缺失或簽名不符合要求"); fialList.add("其它"); List errorList = new ArrayList(); errorList.add("客戶主動取消"); errorList.add("個人征信不良"); errorList.add("欺詐申請"); errorList.add("申請人基本條件不符"); errorList.add("申請材料不合規"); errorList.add("無法正常完成征信"); errorList.add("重復申請"); errorList.add("其他"); // 計算該報表的列數 int number = 2 + fialList.size() * 2 + errorList.size() * 2; // 給工作表列定義列寬(實際應用自己更改列數) for (int i = 0; i < number; i++) { sheet.setColumnWidth(i, 3000); } // 創建單元格樣式 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) 200); cellStyle.setFont(font); // 創建報表頭部 exportExcel.createNormalHead("南京地區申請資料拒件分析統計", number); // 設置第二行 String[] params = new String[] { " 年 月 日", " 年 月 日" }; exportExcel.createNormalTwoRow(params, number); // 設置列頭 HSSFRow row2 = sheet.createRow(2); HSSFCell cell0 = row2.createCell(0); cell0.setCellStyle(cellStyle); cell0.setCellValue(new HSSFRichTextString("機構代碼")); HSSFCell cell1 = row2.createCell(1); cell1.setCellStyle(cellStyle); cell1.setCellValue(new HSSFRichTextString("支行名稱")); HSSFCell cell2 = row2.createCell(2); cell2.setCellStyle(cellStyle); cell2.setCellValue(new HSSFRichTextString("無效件")); HSSFCell cell3 = row2.createCell(2 * fialList.size() + 2); cell3.setCellStyle(cellStyle); cell3.setCellValue(new HSSFRichTextString("拒絕件")); HSSFRow row3 = sheet.createRow(3); // 設置行高 row3.setHeight((short) 800); HSSFCell row3Cell = null; int m = 0; int n = 0; // 創建不同的LIST的列標題 for (int i = 2; i < number; i = i + 2) { if (i < 2 * fialList.size() + 2) { row3Cell = row3.createCell(i); row3Cell.setCellStyle(cellStyle); row3Cell.setCellValue(new HSSFRichTextString(fialList.get(m) .toString())); m++; } else { row3Cell = row3.createCell(i); row3Cell.setCellStyle(cellStyle); row3Cell.setCellValue(new HSSFRichTextString(errorList.get(n) .toString())); n++; } } // 創建最后一列的合計列 row3Cell = row3.createCell(number); row3Cell.setCellStyle(cellStyle); row3Cell.setCellValue(new HSSFRichTextString("合計")); // 合并單元格 HSSFRow row4 = sheet.createRow(4); // 合并第三行到第五行的第一列 sheet.addMergedRegion(new Region(2, (short) 0, 4, (short) 0)); // 合并第三行到第五行的第二列 sheet.addMergedRegion(new Region(2, (short) 1, 4, (short) 1)); // 合并第三行的第三列到第AA指定的列 int aa = 2 * fialList.size() + 1; sheet.addMergedRegion(new Region(2, (short) 2, 2, (short) aa)); int start = aa + 1; sheet.addMergedRegion(new Region(2, (short) start, 2, (short) (number - 1))); // 循環合并第四行的行,并且是每2列合并成一列 for (int i = 2; i < number; i = i + 2) { sheet.addMergedRegion(new Region(3, (short) i, 3, (short) (i + 1))); } // 根據列數奇偶數的不同創建不同的列標題 for (int i = 2; i < number; i++) { if (i < 2 * fialList.size() + 2) { if (i % 2 == 0) { HSSFCell cell = row4.createCell(i); cell.setCellStyle(cellStyle); cell.setCellValue(new HSSFRichTextString("無效量")); } else { HSSFCell cell = row4.createCell(i); cell.setCellStyle(cellStyle); cell.setCellValue(new HSSFRichTextString("占比")); } } else { if (i % 2 == 0) { HSSFCell cell = row4.createCell(i); cell.setCellStyle(cellStyle); cell.setCellValue(new HSSFRichTextString("拒絕量")); } else { HSSFCell cell = row4.createCell(i); cell.setCellStyle(cellStyle); cell.setCellValue(new HSSFRichTextString("占比")); } } } // 循環創建中間的單元格的各項的值 for (int i = 5; i < number; i++) { HSSFRow row = sheet.createRow((short) i); for (int j = 0; j <= number; j++) { exportExcel .cteateCell(wb, row, (short) j, HSSFCellStyle.ALIGN_CENTER_SELECTION, String .valueOf(j)); } } // 創建最后一行的合計行 String[] cellValue = new String[number - 1]; for (int i = 0; i < number - 1; i++) { cellValue[i] = String.valueOf(i); } exportExcel.createLastSumRow(1, cellValue); exportExcel.outputExcel("c:\\拒絕件統計.xls"); } }
? ?運行上述兩段代碼你就會在c盤的根目錄下看到一個拒絕件統計.xls文件



注明:示例參考至網絡


------------------------------------------------------------------------------------------------------------------------
? 廣告:我參加了2012年度IT博客大賽,希望大家能多多支持

https://blog.51cto.com/contest2012/3545281

------------------------------------------------------------------------------------------------------------

《Java程序員由笨鳥到菜鳥》電子版書正式發布,歡迎大家下載


http://blog.csdn.net/csh624366188/article/details/7×××47



轉載于:https://blog.51cto.com/javacsh/1129122

總結

以上是生活随笔為你收集整理的Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。