java 导出 Excel 报表

要下载并导入jxl.jar 包 和 poi.jar 包

 

package com.test.pub;
/*
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;*/
import java.util.List;
import java.util.StringTokenizer;

import jxl.HeaderFooter;
import jxl.SheetSettings;
import jxl.Workbook;
import jxl.HeaderFooter.Contents;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.PageOrientation;
import jxl.format.VerticalAlignment;
import jxl.write.WritableFont;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
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.poifs.filesystem.POIFSFileSystem;

import com.test.bean.PrintOutBean;
import com.test.dao.PrintOutDao;

import java.awt.*;
import java.io.*;
/**
 * 输出报表
 * @author Saindy
 * @since 2008-5
 *
 */

public class PrintOut {
    /** 日期段*/
    private String date2;
    /** 当前为第state张表格*/
    private int tableState;

   
    /** 开始的时间和日期*/
    private String d1;
    /** 结束的时间和日期*/
    private String d2;
    /** Execl文件名和标题名称*/
    private String titles;
   
    String address;
   
    private final int CHAR3_LENGTH=9;  //三个字的长度
    private final int CHAR4_LENGTH=11; //四个字的长度
    private final int CHAR5_LENGTH=13; //五个字的长度
    private final int CHAR6_LENGTH=15; //六个字的长度
    private final int CHAR7_LENGTH=17; //七个字的长度
   
    public PrintOut(int state,String sql,String starDate,String endDate,String excelName){
        tableState=state;
        titles=excelName;
        //System.out.println(tableState);
//        String excelName="";//Excel表名和标题
//        if(tableState==1)excelName="各部门";
       
        d1=starDate;
        d2=endDate;
       
        //System.out.println(d1+"        "+d2);
        //截取日期部分
        StringTokenizer st = new StringTokenizer(starDate);       
        String sj=st.nextToken();
        //System.out.println(sj);
        StringTokenizer st2 = new StringTokenizer(endDate);       
        String sj2=st2.nextToken();
        //System.out.println(sj2);
        date2=sj+"到"+sj2;
        //System.out.println("日期段:   "+date2);
        address=System.getProperty("user.dir");//文件路径
        address=address+"//temp"; //把所形成的统计报表放在临时文件夹temp内
       
        //要生成几列的报表,从数据库查询,并以一个List 返回
        List list=null;
        PrintOutDao printOutDao=new PrintOutDao();
        if(tableState==3){
            list=printOutDao.getgetPrintOut3(sql);
        }else if(tableState==4){
           list=printOutDao.getPrintOut3(sql);
        }else if(tableState==5){
           list=printOutDao.getPrintOut5(sql);
        }else if(tableState==6){
            list=printOutDao.getPrintOut6(sql);
        }
        //System.out.println(sql);
        //以不同的文件标题为文件名称
        //writeExcelBo(address+"//"+titles+"("+date2+").xls",list);
        //文件名更改为同一个名称
        writeExcelBo(address+"//"+excelName+".xls",list);
        //直接打开文件
        /*
         *
         try {
            //Runtime.getRuntime().exec("cmd /c start "+address+"//"+titles+"("+date2+").xls");
            Runtime.getRuntime().exec("cmd /c start "+address+"//"+excelName+".xls");
           
        } catch (IOException e) {
            e.printStackTrace();
        }
        */
       
        if (!Desktop.isDesktopSupported()){
            System.err.println("Desktop not supported!");
            System.exit(-1);
        }
        else{ 
            try{
                Desktop desktop = Desktop.getDesktop();
                File f=new File(address+"//"+excelName+".xls");
                desktop.open(f);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    public static void exportExcelFile(String inputFile,String outputFile,List dataList) throws Exception{
        //用模板文件构造poi  
        POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(inputFile));
        //创建模板工作表  
        HSSFWorkbook templatewb = new HSSFWorkbook(fs);
        //直接取模板第一个sheet对象  
        HSSFSheet templateSheet = templatewb.getSheetAt(1);
        //得到模板的第一个sheet的第一行对象   为了得到模板样式  
        HSSFRow templateRow = templateSheet.getRow(0);
        //HSSFSheet   timplateSheet   =   templatewb.getSheetAt(1);  
        //取得Excel文件的总列数  
        int columns = templateSheet.getRow((short) 0).getPhysicalNumberOfCells();
        //  Debug.println("columns   is   :   " + columns);  //=========================
        //创建样式数组  
        HSSFCellStyle styleArray[] = new HSSFCellStyle[columns];
        //一次性创建所有列的样式放在数组里  
        for (int s = 0; s < columns; s++) {
            //得到数组实例  
            styleArray[s] = templatewb.createCellStyle();
        }
        //循环对每一个单元格进行赋值    
        //定位行  
        for (int rowId = 1; rowId < dataList.size(); rowId++) {
            //依次取第rowId行数据   每一个数据是valueList  
            List valueList = (List) dataList.get(rowId - 1);
            //定位列  
            for (int columnId = 0; columnId < columns; columnId++) {
                //依次取出对应与colunmId列的值  
                //每一个单元格的值  
                String dataValue = (String) valueList.get(columnId);
                //取出colunmId列的的style  
                //模板每一列的样式  
                HSSFCellStyle style = styleArray[columnId];
                //取模板第colunmId列的单元格对象  
                //模板单元格对象  
                HSSFCell templateCell = templateRow.getCell((short) columnId);
                //创建一个新的rowId行   行对象  
                //新建的行对象    
                HSSFRow hssfRow = templateSheet.createRow(rowId);
                //创建新的rowId行   columnId列   单元格对象  
                //新建的单元格对象  
                HSSFCell cell = hssfRow.createCell((short) columnId);
                //如果对应的模板单元格   样式为非锁定  
                if (templateCell.getCellStyle().getLocked() == false) {
                     //设置此列style为非锁定
                     style.setLocked(false);
                     //设置到新的单元格上  
                     cell.setCellStyle(style);
                }
                //否则样式为锁定  
                else {
                     //设置此列style为锁定  
                     style.setLocked(true);
                     //设置到新单元格上  
                     cell.setCellStyle(style);
                }
                //设置编码  
                cell.setEncoding(HSSFCell.ENCODING_UTF_16);
                //Debug.println("dataValue   :   "   +   dataValue);  
                //设置值   统一为String  
                cell.setCellValue(dataValue);
            }
        }
      //设置输入流  
      FileOutputStream fOut = new FileOutputStream(outputFile);
      //将模板的内容写到输出文件上  
      templatewb.write(fOut);
      fOut.flush();

      //操作结束,关闭文件  
      fOut.close();

    }
    /**
     * 导出数据为XLS格式
     * @param filePath 生成Excel文件Path
     * @param bo 要导入的数据
     */
   
    public void  writeExcelBo(String filePath, java.util.List ve)
    {       
        jxl.write.WritableWorkbook wwb;
        try
        {
            wwb= Workbook.createWorkbook(new File(filePath));
            jxl.write.WritableSheet ws= wwb.createSheet(titles, 30);
           
            //设置居中打印
            SheetSettings sheetSettings= ws.getSettings();
            sheetSettings.setHorizontalCentre(true);
           
            int charTitle = 12;// 标题字体大小           
            jxl.write.WritableFont titleFont = new jxl.write.WritableFont(
            WritableFont.createFont("宋体"), charTitle, WritableFont.BOLD);                       
           
            //设置标题格式
            jxl.write.WritableCellFormat titleFormat = new jxl.write.WritableCellFormat(titleFont);
            titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
            titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
            titleFormat.setAlignment(Alignment.CENTRE); // 水平对齐
           
            int charContent = 12;// 正文内容字体大小
            jxl.write.WritableFont contentFont = new jxl.write.WritableFont(
            WritableFont.createFont("宋体"), charContent, WritableFont.NO_BOLD);                       
           
            //设置正文内容格式
            jxl.write.WritableCellFormat contentFormat = new jxl.write.WritableCellFormat(contentFont);
            contentFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
            contentFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
            contentFormat.setAlignment(Alignment.CENTRE); // 水平对齐
           
            ws.addCell(new jxl.write.Label(0, 0, titles+"("+date2+")",titleFormat));//写标题
            ws.setRowView(0,500);// 设置报表标题行高,第1列500毫米
            ws.setRowView(1,440);//设置行高,第i+1行的高度
           
            if(tableState==3){//三列单元格的报表
                ws.mergeCells(0, 0, 3, 0); // 合并单元格,               
                ws.setColumnView(0, CHAR3_LENGTH); // 设置列宽,第1列
                ws.setColumnView(1, CHAR5_LENGTH); // 设置列宽,第2列
                ws.setColumnView(2, CHAR7_LENGTH); // 设置列宽,第3列
               
                ws.addCell(new jxl.write.Label(0, 1, "第一列标题名称",titleFormat));              //列位置,行位置,名称
                ws.addCell(new jxl.write.Label(1, 1, "第二列标题名称",titleFormat));
                ws.addCell(new jxl.write.Label(2, 1, "第三列标题名称",titleFormat));
            }else if(tableState==4){//四列单元格的报表
                ws.mergeCells(0, 0, 3, 0); // 合并单元格,               
                ws.setColumnView(0, CHAR3_LENGTH); // 设置列宽,第1列
                ws.setColumnView(1, CHAR5_LENGTH); // 设置列宽,第2列
                ws.setColumnView(2, CHAR7_LENGTH); // 设置列宽,第3列
                ws.setColumnView(3, CHAR4_LENGTH); // 设置列宽,第4列
               
                ws.addCell(new jxl.write.Label(0, 1, "第一列标题名称",titleFormat));              //列位置,行位置,名称
                ws.addCell(new jxl.write.Label(1, 1, "第二列标题名称",titleFormat));
                ws.addCell(new jxl.write.Label(2, 1, "第三列标题名称",titleFormat));
                ws.addCell(new jxl.write.Label(3, 1, "第四列标题名称",titleFormat));               
            }else if(tableState==5){//各人申请人表
                ws.mergeCells(0, 0, 3, 0); // 合并单元格,               
                ws.setColumnView(0, CHAR3_LENGTH); // 设置列宽,第1列
                ws.setColumnView(1, CHAR5_LENGTH); // 设置列宽,第2列
                ws.setColumnView(2, CHAR7_LENGTH); // 设置列宽,第3列
                ws.setColumnView(3, CHAR4_LENGTH); // 设置列宽,第4列
                ws.setColumnView(4, CHAR6_LENGTH); // 设置列宽,第5列

                ws.addCell(new jxl.write.Label(0, 1, "第一列标题名称",titleFormat));              //列位置,行位置,名称
                ws.addCell(new jxl.write.Label(1, 1, "第二列标题名称",titleFormat));
                ws.addCell(new jxl.write.Label(2, 1, "第三列标题名称",titleFormat));
                ws.addCell(new jxl.write.Label(3, 1, "第四列标题名称",titleFormat));   
                ws.addCell(new jxl.write.Label(4, 1, "第五列标题名称",titleFormat));

            }else if(tableState==6){//各个申请文件表
                ws.mergeCells(0, 0, 3, 0); // 合并单元格,               
                ws.setColumnView(0, CHAR3_LENGTH); // 设置列宽,第1列
                ws.setColumnView(1, CHAR5_LENGTH); // 设置列宽,第2列
                ws.setColumnView(2, CHAR7_LENGTH); // 设置列宽,第3列
                ws.setColumnView(3, CHAR4_LENGTH); // 设置列宽,第4列
                ws.setColumnView(4, CHAR6_LENGTH); // 设置列宽,第5列
                ws.setColumnView(5, CHAR6_LENGTH); // 设置列宽,第5列

                ws.addCell(new jxl.write.Label(0, 1, "第一列标题名称",titleFormat));              //列位置,行位置,名称
                ws.addCell(new jxl.write.Label(1, 1, "第二列标题名称",titleFormat));
                ws.addCell(new jxl.write.Label(2, 1, "第三列标题名称",titleFormat));
                ws.addCell(new jxl.write.Label(3, 1, "第四列标题名称",titleFormat));   
                ws.addCell(new jxl.write.Label(4, 1, "第五列标题名称",titleFormat));
                ws.addCell(new jxl.write.Label(5, 1, "第五列标题名称",titleFormat));
                sheetSettings.setOrientation(PageOrientation.LANDSCAPE); //设置打印方向为纵向打印
               
            }
           
            int size=ve.size();
            PrintOutBean printOutBean = new PrintOutBean();
            //System.out.println(size);
           
            if(tableState==3){   //对非裁判文书的总量进行合计统计
                /**总的输出文件数合计 */
                long allTimes=0;
                /**总的输出文件总份数合计 */
                long allTimes2=0;
                /**总的输出文件总页数合计 */
                long allTimes3=0;
                for (int i= 0; i < size; i++)
                {
                    printOutBean= (PrintOutBean)ve.get(i);
                    ws.setRowView(i + 2,440);//设置行高,第i+1行的高度
                    ws.addCell(new jxl.write.Label(0, i + 2, printOutBean.getPrintOutA(),contentFormat));
                    ws.addCell(new jxl.write.Label(1, i + 2, printOutBean.getPrintOutB(),contentFormat));
                    ws.addCell(new jxl.write.Label(2, i + 2, printOutBean.getPrintOutC(),contentFormat));
                    //System.out.println(printOutBean.getPrintOutB());
                    allTimes=allTimes+Integer.parseInt(printOutBean.getPrintOutB());//总的申请次数合计累加
                    allTimes2=allTimes2+Integer.parseInt(printOutBean.getPrintOutC());
                    //当输出文件总页数为空值时输出修改为“0”,否则进行合计累加
                    /*if(printOutBean.getPrintOutD()==null){                       
                        ws.addCell(new jxl.write.Label(3, i + 2, ""+0,contentFormat));
                        //allTimes3=allTimes3+0;
                    }else{
                        ws.addCell(new jxl.write.Label(3, i + 2, printOutBean.getPrintOutD(),contentFormat));
                        allTimes3=allTimes3+Integer.parseInt(printOutBean.getPrintOutD());
                    }*/
                    //allTimese=(int) (allTimes+Integer.parseInt(printOutBean.getPrintOutE()));
                }
                //输出合计的结果值
                ws.addCell(new jxl.write.Label(0, size + 2, "合计:",contentFormat));
                ws.addCell(new jxl.write.Label(1, size + 2, ""+allTimes,contentFormat));
                ws.addCell(new jxl.write.Label(2, size + 2, ""+allTimes2,contentFormat));   
                ws.setRowView(size + 2,440);//设置合计行高,第size行的高度
           }else if(tableState==4){
               for (int i= 0; i < size; i++)
                {    ws.setRowView(i + 2,440);//设置行高,第i+1行的高度
                    printOutBean= (PrintOutBean)ve.get(i);
                    ws.addCell(new jxl.write.Label(0, i + 2, printOutBean.getPrintOutA(),contentFormat));
                    ws.addCell(new jxl.write.Label(1, i + 2, printOutBean.getPrintOutB(),contentFormat));
                    ws.addCell(new jxl.write.Label(2, i + 2, printOutBean.getPrintOutC(),contentFormat));
                    ws.addCell(new jxl.write.Label(3, i + 2, printOutBean.getPrintOutD(),contentFormat));
                }
            }
            else if(tableState==5){
               for (int i= 0; i < size; i++)
                {    ws.setRowView(i + 2,440);//设置行高,第i+1行的高度
                    printOutBean= (PrintOutBean)ve.get(i);
                    ws.addCell(new jxl.write.Label(0, i + 2, printOutBean.getPrintOutA(),contentFormat));
                    ws.addCell(new jxl.write.Label(1, i + 2, printOutBean.getPrintOutB(),contentFormat));
                    ws.addCell(new jxl.write.Label(2, i + 2, printOutBean.getPrintOutC(),contentFormat));
                    ws.addCell(new jxl.write.Label(3, i + 2, printOutBean.getPrintOutD(),contentFormat));
                    ws.addCell(new jxl.write.Label(4, i + 2, printOutBean.getPrintOutE(),contentFormat));
                }
            }else if(tableState==6){
                for (int i= 0; i < size; i++)
                {    ws.setRowView(i + 2,440);//设置行高,第i+1行的高度
                    printOutBean= (PrintOutBean)ve.get(i);
                    ws.addCell(new jxl.write.Label(0, i + 2, printOutBean.getPrintOutA(),contentFormat));
                    ws.addCell(new jxl.write.Label(1, i + 2, printOutBean.getPrintOutB(),contentFormat));
                    ws.addCell(new jxl.write.Label(2, i + 2, printOutBean.getPrintOutC(),contentFormat));
                    ws.addCell(new jxl.write.Label(3, i + 2, printOutBean.getPrintOutD(),contentFormat));
                    ws.addCell(new jxl.write.Label(4, i + 2, printOutBean.getPrintOutE(),contentFormat));
                    ws.addCell(new jxl.write.Label(5, i + 2, printOutBean.getPrintOutF(),contentFormat));
                }
             
            }
           
            wwb.write();
            //关闭Excel工作薄对象
            wwb.close();
         } catch (IOException e){
         } catch (RowsExceededException e){     
         } catch (WriteException e){
         }
    }
   
}

你可能感兴趣的:(java,exception,String,list,Excel,报表)