<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java軟件報表軟件技術博客

    java報表軟件技術匯總 java報表軟件制作 報表軟件新聞
    posts - 355, comments - 100, trackbacks - 0, articles - 3
       :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理
      做的Struts 項目中有這樣的功能,用戶可以將數據導出到Excel 報表,如圖1 所示。 


    報表樣式圖
    1 報表樣式圖

    1 設計思路

    Java 對于Excel 的操作一般借助于POI 類庫,由于該報表的表頭比較復雜,直接用POI 控制報表的生成比較困難,這時可以先制作Excel 報表模板,而后再通過Java 調用POI 函數將用戶數據寫入到Excel 報表模板,最后導出到新的目標文件即可

    2 設計步驟

    2.1 Excel 報表模板

    根據需要設計出Excel 報表,并保存為report.xls報表有復雜的表頭,報表4 行為合計行,用于對所有數值型列的各行數據進行匯總,如圖1 所示

    2.2 Struts 的動作執行函數ExcelExportAction

    Action 函數在用戶需要執行報表導出時通過Struts 頁面調用或用戶觸發執行

    package com.tj.struts.action;

    import java.io.FileOutputStream;

    import javax.servlet.http.*;

    import org.apache.struts.action.*;

    import databaseUtil.ExcelPoi;

    public class ExcelExportAction extends Action {

    public ActionForward execute ( ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)

    throws Exception {

    //執行SQL 獲得輸出到報表的數據

    String sql=" select * fron project" ;

    //準備輸出的報表路徑,及文件名

    String outputfile =" c:\\output.xls" ;

    //制作好的報表模板存放路徑

    String templatefile=" c:\\report.xls" ;

    //模板的列數為39

    int column=39;

    try {

    //實例化具體的業務處理類ExcelPoi

    ExcelPoi pd = new ExcelPoi (colnum) ;

    //getExcelSheet sql 為參數執行查詢,將查詢數據寫入模版文件templatefile的當前工作簿的選定工作表pd.getExcelSheeet (sql,templatefile) ;

    // 新建以文件outputfile 為目標的輸出文件流

    FileOutputStream fos = new FileOutputStream (outputfile) ;

    //將工作簿寫入輸出文件流,得到輸出報表文件

    pd.exportExcel (fos) ;

    } catch (Exception e) {

    e.printStackTrace () ;

    } finally {

    try {fos.close () ;

    } catch (Exception e) {

    e.printStackTrace () ;

    }}

    return mapping.findForward (" success") ;

    }}

    2.3 設計業務處理類ExcelPoi

    package databaseUtil;

    import java.io.*;

    import java.sql.*;

    import java.util.*;

    import org.apache.poi.hssf.usermodel.*;

    public class ExcelPoi {

    private int columNumber = 0;

    private int cellNumber=0;

    private HSSFWorkbook workbook = null;

    private HSSFSheet worksheet=null;

    public ExcelPoi (int columNumber)

    {this.columNumber=columNumber;}

    <! sql:傳入參數,實現輸出數據查詢,templatefile:傳入參數,Excel 模板的存放路徑-->

    public void getExcelSheeet ( String sql,String templatefile)

    throws SQLException

    {try {

    //新建以文件templatefile 為源文件的輸文件流,而后從中取得模板文件templatefile 的當前工作簿

    workbook = new HSSFWorkbook ( new FileInputStream

    (templatefile)) ;

    } catch (FileNotFoundException e) {

    e.printStackTrace () ;

    } catch (IOException e) {

    e.printStackTrace () ;}

    //取得當前工作簿中的天津大學工程項目庫管理系統工作表

    worksheet=workbook.getSheet (" 天津大學工程項目庫管

    理系統") ;

    //載入數據庫驅動,獲得數據庫的連接,數據庫名為tj,用戶名swm, 密碼adminClass.forName ( " com.microsoft.jdbc.sqlserver.SQLServerDriver") .newInstance () ;

    dbConn = DriverManager.getConnection (" jdbc:microsoft:

    sqlserver://localhost:1433;DatabaseName =tj" , " swm" , "

    admin") ;

    statement = dbConn.createStatement (ResultSet.

    TYPE_SCROLL_INSENSITIVE,ResultSet.

    CONCUR_UPDATABLE) ;

    //SQL 為參數,執行數據查詢

    ResultSet rs = statement.executeQuery (sql) ;

    int rowIndex = 4;

    while (rs.next ())

    { List list = new ArrayList () ;

    //將查詢得到的每行數據放入list

    for (int i = 1;i <= columNumber;i++)

    {list.add (rs.getString (i)) ; }

    //調用createTableRow list 中數據寫入worksheet 的第rowIndex

    createTableRow (worksheet,list, (short) rowIndex) ;

    rowIndex++;}}

    <! -list 數據創建當前工作表的第rowIndex 行,并將該行非String 數據累加到合計行行-->

    public void createTableRow ( HSSFSheet worksheet1,List list,short rowIndex)

    {//getRow (3) 取得工作表的第四行,即合計行(行數從0 開始)

    HSSFRow sumrow = worksheet1.getRow (3) ;

    for (short i = 0;i < list.size () ;i++)

    { HSSFCell cell = sumrow.getCell (i) ;

    //list 1234678 列之外(這幾列為String 類型不進行合計),其它列數據累加到合計行的對應列單元中

    if (! (i==0||i==1||i==2||i==3||i==5||i==6||i==7)) {

    cell.setCellValue ( list.getNumericCellValue ( ) + ( double)

    Integer.parseInt ((String) list.get (i))) ;

    }}

    //創建當前工作表的新行,等待放入數據

    HSSFRow row = worksheet1.createRow ( ( short)rowIndex) ;

    //在新創建行中創建各列單元格,并將list 中對應數據寫入

    for (short i = 0;i < list.size () ;i++)

    {HSSFCell cell = row.createCell ((short) i) ;

    cell.setEncoding (HSSFCell.ENCODING_UTF_16) ;

    cell.setCellValue ((String) list.get (i)) ; }

    <! --該函數將存儲了數據的模板文件導出到輸出文件流,創建一個新的報表-->

    public void exportExcel ( OutputStream os) throws

    IOException

    {worksheet.setGridsPrinted (true) ;

    workbook.write (os) ;

    }}

    3 結語

    對于一些要求非常苛刻的報表輸出可以借助于一些第三方插件,比如水晶報表在實際中可以隨心所欲地構建報表模板,而后通過程序控制將需要導出的數據導出到報表中,關鍵在于如何精確地控制數據導出的位置,保證數據在報表中的準確的位置,這是需要格外注意的






    主站蜘蛛池模板: 亚洲精品无码不卡在线播放| 亚洲人成在久久综合网站| 亚洲精品色播一区二区| av免费不卡国产观看| 亚洲欧洲国产经精品香蕉网| 永久在线免费观看| 亚洲男人天堂影院| 18禁免费无码无遮挡不卡网站| 久久青青草原亚洲av无码app| 99re这里有免费视频精品| 久久亚洲精品无码AV红樱桃| 18女人水真多免费高清毛片| 亚洲国产精品专区| 大学生高清一级毛片免费 | 亚洲AV永久无码区成人网站| 久久精品乱子伦免费| 亚洲第一区视频在线观看| 曰批全过程免费视频在线观看| 亚洲午夜无码久久| 亚洲国产精品一区二区第四页| 国产精品美女免费视频观看| 亚洲国产成人精品无码区在线观看| 最近中文字幕mv免费高清视频8 | 亚洲第一区视频在线观看| 在线观看的免费网站| 色屁屁在线观看视频免费| 亚洲五月午夜免费在线视频| 久久久久久AV无码免费网站下载 | 青青久在线视频免费观看| 亚洲avav天堂av在线网毛片| 伊人久久精品亚洲午夜| 1000部夫妻午夜免费| 亚洲成AV人片高潮喷水| 亚洲人成中文字幕在线观看| 四虎在线免费视频| 思思久久99热免费精品6| 亚洲AV无码专区亚洲AV伊甸园| 无码国产精品久久一区免费 | 吃奶摸下高潮60分钟免费视频| 99在线视频免费观看| 亚洲妇女熟BBW|