JAVA-POI

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress;
import org.hibernate.SQLQuery;
import org.hibernate.transform.Transformers;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.remoting.WebRemote;

import com.sunsheen.jfids.system.base.composite.data.query.QueryParameterImpl;
import com.sunsheen.jfids.system.database.DBSession;
import com.sunsheen.jfids.util.DataBaseUtil;

public class SalaryPoi {
    
    @SuppressWarnings("deprecation")
    public String getToExcel(){
        ......省略數據源獲取
        // 返回表單結果集
        List list = query.list();
        int size = list.size();
        System.out.println("+++++++++++++" + size);
    
        //初始化POI
        //創建工作簿---->XSSF代表10版的Excel(HSSF是07版前的Excel)
        HSSFWorkbook wb = new  HSSFWorkbook();
        
        //工作表
        HSSFSheet sheet = wb.createSheet("淞幸科技");
        
        //標頭行,代表第一行
        HSSFRow head=sheet.createRow(0);
        HSSFCell hssfCell=head.createCell(0);
        
        hssfCell.setCellValue("成都淞幸科技有限責任公司"+date.substring(0,4)+"年"+
        date.substring(date.length()-2,date.length())+"月工資表");
        head.setHeightInPoints(70);
        
        //合併第一行的單元格
        CellRangeAddress address=new CellRangeAddress(0,0,0,26);
        sheet.addMergedRegion(address);
        
        //創建字體與風格
        HSSFCellStyle cellStyle = wb.createCellStyle();//生成表頭格樣式
        HSSFFont hssfFont = wb.createFont();//創建字體
        hssfFont.setFontHeightInPoints((short)12);//字體大小
        hssfFont.setBoldweight(Font.BOLDWEIGHT_BOLD);//粗體
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
        cellStyle.setFont(hssfFont);
        hssfCell.setCellStyle(cellStyle);
        
        //修飾風格2
        HSSFCellStyle cellStyle2 = wb.createCellStyle();//生成表頭格樣式
        cellStyle2.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
        cellStyle2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
        
        
        HSSFRow header=sheet.createRow(1);
        //創建單元格,0代表第一行第一列
        String[] heards ={"序號","部門名稱","工號","姓名","銀行卡號","定級工資","崗位工資","基礎
                ,"實發工資總額"......}; 
        for(int i =0;i<heards.length;i++){
            HSSFCell hssfCell1=header.createCell(i);
            hssfCell1.setCellStyle(cellStyle2);
            hssfCell1.setCellValue(heards[i]);
        }
        //設置列的寬度
//        getPhysicalNumberOfCells()代表這行有多少包含數據的列
        for(int i=0;i<header.getPhysicalNumberOfCells();i++){
        //POI設置列寬度時比較特殊,它的基本單位是1/255個字符大小,
        //因此我們要想讓列能夠盛的下20個字符的話,就需要用255*20
        sheet.setColumnWidth(i, 255*15);
        }
        //設置行高,行高的單位就是像素,因此30就是30像素的意思
        header.setHeightInPoints(30);
        int k =2;
//        
        for(int i=0;i<size;i++){
//            //創建多行數據
            HSSFRow headers=sheet.createRow(k++);
//            //拿出所有查詢出的一條list(list(Map<>))信息
            Map<String, Object> map = (Map<String, Object>) list.get(i);
            System.out.println(map);
            
            String[] context ={你要寫入的數據};
            for(int j=0;j<context.length;j++){
                HSSFCell hssfCell2=headers.createCell(j);
                hssfCell2.setCellStyle(cellStyle2);
                hssfCell2.setCellValue(context[j]);
            }
        }
        
        // 合併相同列中的數據
        // 處理相同的數據合併單元格
        if(sheet.getLastRowNum()>2){//獲取最後一行行標,比行數小  滿足合併的條件,2是數據行的開始,0 1 行爲表頭
            HSSFRow row_1 = sheet.getRow(2);
            HSSFCell cell_1 = row_1.getCell(1);
            
            String departname = cell_1.getStringCellValue();
            
            for(int i=3;i<=sheet.getLastRowNum();i++){
                //除第一個外,循環將內容相同的單元格設爲"",這裏體現出爲什麼原數據要有序!
                HSSFRow rows = sheet.getRow(i);
                //此處表示對單元格進行內容相同合併處理,我這裏獲取的是每行的第2列進行對比,要多列對比的,這裏自行增加
                HSSFCell cells_1 = rows.getCell(1);
                //這裏值相同則設置位空,方便之後的合併
                if(departname.equals(cells_1.getStringCellValue())){
                    cells_1.setCellValue("");
                }else{
                    departname = cells_1.getStringCellValue();
                }
            }        
        }
        int sk;
        if(sheet.getLastRowNum()>2){//將爲空的單元格與之前不爲空的合併
            sk=2;                
            for(int i=3;i<=sheet.getLastRowNum();i++){
                HSSFRow rows = sheet.getRow(i);
                HSSFCell cell_0 = rows.getCell(1);
                if(cell_0.getStringCellValue() == ""){//如果爲空但還沒對比到最後一行,繼續循環
                    if(i==sheet.getLastRowNum()){
                        sheet.addMergedRegion(new CellRangeAddress(sk, i, 1, 1));//如果已經對比到最後一行,開始合併
                    }                                        
                }else{
                    if(sk != i-1){//不爲空且i-1不爲sk則合併
                        sheet.addMergedRegion(new CellRangeAddress(sk, i-1, 1, 1));//起始行號,終止行號, 起始列號,終止列號
                    }
                    sk =i;
                }
            }
        }
        //上面設置好了內容,我們當然是要輸出到某個文件的,輸出就需要有輸出流
        FileOutputStream fos;
        try {
            fos = new FileOutputStream("d:/2010.xls");
            //向指定文件寫入內容
            wb.write(fos);
            fos.close();
            return "導出Excel已完成!";
            
        } catch (FileNotFoundException e) {
            // TODO 自動生成的 catch 塊
            e.printStackTrace();
        } catch (IOException e) {
            // TODO 自動生成的 catch 塊
            e.printStackTrace();
        }
        
        return "導出Excel失敗!";
    }
}

 

發佈了37 篇原創文章 · 獲贊 14 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章