poi操作excel(主要為合并單元格和導出excel)

jopen 11年前發布 | 365K 次閱讀 Office文檔處理 POI

POI進行跨行需要用到對象HSSFSheet對象,現在就當我們程序已經定義了一個HSSFSheet對象sheet。

跨第1行第1個到第2個單元格的操作為
sheet.addMergedRegion(new Region(0,(short)0,0,(short)1));

跨第1行第1個到第2行第1個單元格的操作為
sheet.addMergedRegion(new Region(0,(short)0,1,(short)0));


重點注意事項:
1.單元格CELL和ROW對象下標都是從0開始的。
2.單元格合并時Region(1,2,3,4)第1個值的行號必須要比3位置的行號小,如果大于3就不能正常合并單元格
3.合并單元格的時候要合并的單單元格必須先創建,這樣方便后面再次獲取這個單元格來填充數據,主要就是因為合并時不能由后向前進行合并引起的。

import java.io.IOException;

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.hssf.util.Region;

public class ExcelTest {

/**    
 * @param args    
 */     
public static void main(String[] args) throws IOException {      

    try {      
        HSSFWorkbook wb = new HSSFWorkbook();      
        HSSFSheet sheet = wb.createSheet("new   sheet");      
        HSSFCellStyle style = wb.createCellStyle(); // 樣式對象      

        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直      
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平      
        HSSFRow row = sheet.createRow((short) 0);      
        HSSFRow row2 = sheet.createRow((short) 1);      

        sheet.addMergedRegion(new Region(0, (short) 0, 1, (short) 0));      
        HSSFCell ce = row.createCell((short) 0);      
        ce.setEncoding(HSSFCell.ENCODING_UTF_16);// 中文處理      
        ce.setCellValue("項目\\日期"); // 表格的第一行第一列顯示的數據      
        ce.setCellStyle(style); // 樣式,居中      
        int num = 0;      
        for (int i = 0; i < 9; i++) { // 循環9次,每一次都要跨單元格顯示      
            // 計算從那個單元格跨到那一格      
            int celln = 0;      
            int celle = 0;      
            if (i == 0) {      
                celln = 0;      
                celle = 1;      
            } else {      
                celln = (i * 2);      
                celle = (i * 2 + 1);      
            }      
            // 單元格合并      
            // 四個參數分別是:起始行,起始列,結束行,結束列      
            sheet.addMergedRegion(new Region(0, (short) (celln + 1), 0,      
                    (short) (celle + 1)));      
            HSSFCell cell = row.createCell((short) (celln + 1));      
            cell.setCellValue("merging" + i); // 跨單元格顯示的數據      
            cell.setCellStyle(style); // 樣式      
            // 不跨單元格顯示的數據,如:分兩行,上一行分別兩格為一格,下一行就為兩格,“數量”,“金額”      
            HSSFCell cell1 = row2.createCell((short) celle);      
            HSSFCell cell2 = row2.createCell((short) (celle + 1));      
            cell1.setEncoding(HSSFCell.ENCODING_UTF_16);      
            cell1.setCellValue("數量");      
            cell1.setCellStyle(style);      
            cell2.setEncoding(HSSFCell.ENCODING_UTF_16);      
            cell2.setCellValue("金額");      
            cell2.setCellStyle(style);      
            num++;      
        }      

        // 在后面加上合計百分比      

        // 合計 在最后加上,還要跨一個單元格      
        sheet.addMergedRegion(new Region(0, (short) (2 * num + 1), 0,      
                (short) (2 * num + 2)));      
        HSSFCell cell = row.createCell((short) (2 * num + 1));      
        cell.setEncoding(HSSFCell.ENCODING_UTF_16);      
        cell.setCellValue("合計");      
        cell.setCellStyle(style);      
        HSSFCell cell1 = row2.createCell((short) (2 * num + 1));      
        HSSFCell cell2 = row2.createCell((short) (2 * num + 2));      
        cell1.setEncoding(HSSFCell.ENCODING_UTF_16);      
        cell1.setCellValue("數量");      
        cell1.setCellStyle(style);      
        cell2.setEncoding(HSSFCell.ENCODING_UTF_16);      
        cell2.setCellValue("金額");      
        cell2.setCellStyle(style);      

        // 百分比 同上      
        sheet.addMergedRegion(new Region(0, (short) (2 * num + 3), 0,      
                (short) (2 * num + 4)));      
        HSSFCell cellb = row.createCell((short) (2 * num + 3));      
        cellb.setEncoding(HSSFCell.ENCODING_UTF_16);      

        cellb.setCellValue("百分比");      
        cellb.setCellStyle(style);      

        HSSFCell cellb1 = row2.createCell((short) (2 * num + 3));      
        HSSFCell cellb2 = row2.createCell((short) (2 * num + 4));      
        cellb1.setEncoding(HSSFCell.ENCODING_UTF_16);      
        cellb1.setCellValue("數量");      
        cellb1.setCellStyle(style);      
        cellb2.setEncoding(HSSFCell.ENCODING_UTF_16);      
        cellb2.setCellValue("金額");      
        cellb2.setCellStyle(style);      

        /***這里是問題的關鍵,將這個工作簿寫入到一個流中就可以輸出相應的名字,這里需要寫路徑就ok了。 
        FileOutputStream fileOut = new FileOutputStream("workbook.xls");     
        wb.write(fileOut);     
        fileOut.close(); 
         **/  


        /**第二種是輸出到也面中的excel名稱 
         * pName="欄目統計表";    
response.reset();    
response.setContentType("application/x-msdownload");    
response.setHeader("Content-Disposition","attachment; filename="+new String(pName.getBytes("gb2312"),"ISO-8859-1")+".xls");    
ServletOutputStream outStream=null;    

try{    
    outStream = response.getOutputStream();    
    wb.write(outStream);    
}catch(Exception e)    
{    
 e.printStackTrace();    
}finally{    
    outStream.close();    
}    
         * */  
        System.out.print("OK");      
    } catch (Exception ex) {      
        ex.printStackTrace();      
    }      

}      

} </pre></span></span>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!