(轉)poi操做Excel, 各類具體操做和解釋

原文地址http://hi.baidu.com/j_changhong/item/981fa58d05fa755926ebd96b注原文是3.6 此文是3.9  java


 

java讀取excel文件的順序是: 
Excel文件->工做表->行->單元格 對應到POI中,爲:workbook->sheet->row->cell 
注意: 
注意:   
   1.sheet, 以0開始,以workbook.getNumberOfSheets()-1結束 
   2.row, 以0開始(getFirstRowNum),以getLastRowNum結束 
   3.cell, 以0開始(getFirstCellNum),以getLastCellNum結束, 
     結束的數目不知什麼緣由與顯示的長度不一樣,可能會偏長 apache

//import org.apache.poi.ss.usermodel.contrib.CellUtil;  
//import org.apache.poi.ss.usermodel.contrib.RegionUtil;  
這兩個類已更換到 這兩個類移動是3.7開始變的  
//import org.apache.poi.ss.util.CellUtil;  
//import org.apache.poi.ss.util.RegionUtil;  
package com.svse.test;  
  
  
import java.awt.Color;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.util.Calendar;  
import java.util.Date;  
  
  
import org.apache.poi.hssf.usermodel.HSSFCell;  
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;  
import org.apache.poi.hssf.usermodel.HSSFFooter;  
import org.apache.poi.hssf.usermodel.HSSFPatriarch;  
import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
import org.apache.poi.hssf.usermodel.HSSFShape;  
import org.apache.poi.hssf.usermodel.HSSFSheet;  
import org.apache.poi.hssf.usermodel.HSSFSimpleShape;  
import org.apache.poi.hssf.usermodel.HSSFTextbox;  
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.hssf.util.HSSFColor;  
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;  
import org.apache.poi.ss.usermodel.Cell;  
import org.apache.poi.ss.usermodel.CellStyle;  
import org.apache.poi.ss.usermodel.ClientAnchor;  
import org.apache.poi.ss.usermodel.CreationHelper;  
import org.apache.poi.ss.usermodel.DataFormat;  
import org.apache.poi.ss.usermodel.DateUtil;  
import org.apache.poi.ss.usermodel.Drawing;  
import org.apache.poi.ss.usermodel.Font;  
import org.apache.poi.ss.usermodel.IndexedColors;  
import org.apache.poi.ss.usermodel.Picture;  
import org.apache.poi.ss.usermodel.PrintSetup;  
import org.apache.poi.ss.usermodel.RichTextString;  
import org.apache.poi.ss.usermodel.Row;  
import org.apache.poi.ss.usermodel.Sheet;  
import org.apache.poi.ss.usermodel.Workbook;  
import org.apache.poi.ss.usermodel.WorkbookFactory;  
//import org.apache.poi.ss.usermodel.contrib.CellUtil;  
//import org.apache.poi.ss.usermodel.contrib.RegionUtil;  
import org.apache.poi.ss.util.CellRangeAddress;  
import org.apache.poi.ss.util.CellReference;  
import org.apache.poi.ss.util.CellUtil;  
import org.apache.poi.ss.util.RegionUtil;  
import org.apache.poi.util.IOUtils;  
import org.apache.poi.xssf.usermodel.XSSFCellStyle;  
import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
import org.junit.BeforeClass;  
import org.junit.Test;  
  
  
/** 
 * @author WESTDREAM 
 * @since 2010-8-7 下午10:34:03 
 */  
public class POIExcelTest {  
  
  
    /** 
     * @throws java.lang.Exception 
     */  
    public static final String XLS_WORKBOOK_LOCATION = "D:/workbook.xls";  
    public static final String XLS_OR_XLSX_DIR = "D:/";  
    public static final String XLSX_WORKBOOK_LOCATION = "D:/workbook.xlsx";  
    public static final String IMAGE_LOCATION = "book.jpg";  
  
  
    @BeforeClass  
    public static void setUpBeforeClass() throws Exception {  
  
  
    }  
  
  
    @Test  
    public void testWriteExcel() {  
        // ## 重複利用 的對象 ##//  
        Workbook wb = null;  
        FileOutputStream fileOut = null;  
        CellStyle cellStyle = null;  
        Cell cell = null;  
        Font font = null;  
  
  
        /** 
         * EXCEL早期版本 
         */  
        try {  
            // ## 建立早期EXCEL的Workbook ##//  
            wb = new HSSFWorkbook();  
            // ## 獲取HSSF和XSSF的輔助類 ##//  
            CreationHelper createHelper = wb.getCreationHelper();  
            // ## 建立一個名爲「New Sheet」的Sheet ##//  
            Sheet sheet = wb.createSheet("New Sheet");  
  
  
            /** 第一行 --- CELL建立,數據填充及日期格式 **/  
            Row row1 = sheet.createRow(0);  
            // Cell cell = row.createCell(0);  
            // cell.setCellValue(1);  
  
  
            // ## 在相應的位置填充數據 ##//  
            row1.createCell(0).setCellValue(1);  
            row1.createCell(1).setCellValue(1.2);  
            row1.createCell(2).setCellValue(  
                    createHelper.createRichTextString("CreationHelper---字符串"));  
            row1.createCell(3).setCellValue(true);  
  
  
            // ## 填充日期類型的數據---未設置Cell Style ##//  
            row1.createCell(4).setCellValue(new Date());  
            // ## 填充日期類型的數據---已設置Cell Style ##//  
            cellStyle = wb.createCellStyle();  
            cellStyle.setDataFormat(createHelper.createDataFormat().getFormat(  
                    "yyyy年MM月dd日 hh:mm:ss"));  
            // cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("mm/dd/yyyy h:mm"));  
            cellStyle.setDataFormat(createHelper.createDataFormat().getFormat(  
                    "yyyy-MM-dd hh:mm:ss"));  
            cell = row1.createCell(5);  
            cell.setCellValue(new Date());  
            cell.setCellStyle(cellStyle);  
            // ## 另外一種建立日期的方法 ##//  
            /* 
             * cell = row1.createCell(6); 
             * cell.setCellValue(Calendar.getInstance()); 
             * cell.setCellStyle(cellStyle); 
             */  
  
  
            /** 第二行 --- 數據類型 **/  
            Row row2 = sheet.createRow(1);  
            row2.createCell(0).setCellValue(1.1);  
            row2.createCell(1).setCellValue(new Date());  
            row2.createCell(2).setCellValue(Calendar.getInstance());  
            row2.createCell(3).setCellValue("字符串");  
            row2.createCell(4).setCellValue(true);  
            // ## 錯誤的CELL數據格式 ##//  
            row2.createCell(5).setCellType(HSSFCell.CELL_TYPE_ERROR);  
  
  
            /** 第三行 --- CELL的各類對齊方式 **/  
            Row row3 = sheet.createRow(2);  
            row3.setHeightInPoints(30);  
            // ## 水平居中,底端對齊 ##//  
            createCell(wb, row3, (short) 0, XSSFCellStyle.ALIGN_CENTER,  
                    XSSFCellStyle.VERTICAL_BOTTOM);  
            // ## 水平居中,垂直居中 ##//  
            createCell(wb, row3, (short) 1,  
                    XSSFCellStyle.ALIGN_CENTER_SELECTION,  
                    XSSFCellStyle.VERTICAL_BOTTOM);  
            // ## 填充 ,垂直居中 ##//  
            createCell(wb, row3, (short) 2, XSSFCellStyle.ALIGN_FILL,  
                    XSSFCellStyle.VERTICAL_CENTER);  
            // ## 左對齊,垂直居中 ##//  
            createCell(wb, row3, (short) 3, XSSFCellStyle.ALIGN_GENERAL,  
                    XSSFCellStyle.VERTICAL_CENTER);  
            // ## 左對齊,頂端對齊 ##//  
            createCell(wb, row3, (short) 4, XSSFCellStyle.ALIGN_JUSTIFY,  
                    XSSFCellStyle.VERTICAL_JUSTIFY);  
            // ## 左對齊,頂端對齊 ##//  
            createCell(wb, row3, (short) 5, XSSFCellStyle.ALIGN_LEFT,  
                    XSSFCellStyle.VERTICAL_TOP);  
            // ## 右對齊,頂端對齊 ##//  
            createCell(wb, row3, (short) 6, XSSFCellStyle.ALIGN_RIGHT,  
                    XSSFCellStyle.VERTICAL_TOP);  
  
  
            /** 第四行 --- CELL邊框 **/  
            Row row4 = sheet.createRow(3);  
            cell = row4.createCell(1);  
            cell.setCellValue(4);  
            cellStyle = wb.createCellStyle();  
            // ## 設置底部邊框爲THIN ##//  
            cellStyle.setBorderBottom(CellStyle.BORDER_THIN);  
            // ## 設置底部邊框顏色爲黑色 ##//  
            cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());  
            // ## 設置左邊邊框爲THIN ##//  
            cellStyle.setBorderLeft(CellStyle.BORDER_THIN);  
            // ## 設置左邊邊框顏色爲紅色 ##//  
            cellStyle.setLeftBorderColor(IndexedColors.RED.getIndex());  
            // ## 設置右邊邊框爲THIN ##//  
            cellStyle.setBorderRight(CellStyle.BORDER_THIN);  
            // ## 設置右邊邊框顏色爲藍色 ##//  
            cellStyle.setRightBorderColor(IndexedColors.BLUE.getIndex());  
            // ## 設置頂部邊框爲MEDIUM DASHED ##//  
            cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM_DASHED);  
            // ## 設置頂部邊框顏色爲黑色 ##//  
            cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());  
            cell.setCellStyle(cellStyle);  
  
  
            /** 第五行 --- 填充與顏色 **/  
            Row row5 = sheet.createRow((short) 4);  
            // ## Aqua背景 ##//  
            cellStyle = wb.createCellStyle();  
            cellStyle.setFillBackgroundColor(IndexedColors.AQUA.getIndex());  
            // ## 設置填充模式爲BIG SPOTS ##//  
            cellStyle.setFillPattern(CellStyle.BIG_SPOTS);  
            cell = row5.createCell((short) 1);  
            cell.setCellValue("Aqua背景");  
            cell.setCellStyle(cellStyle);  
  
  
            // ## 橙色前景色(相對 於CELL背景) ##//  
            cellStyle = wb.createCellStyle();  
            cellStyle.setFillForegroundColor(IndexedColors.ORANGE.getIndex());  
            // ## 設置填充模式爲SOLID FOREGROUND ##//  
            cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);  
            cell = row5.createCell((short) 2);  
            cell.setCellValue("橙色前景色");  
            cell.setCellStyle(cellStyle);  
  
  
            /** 第六行 --- 合併單元格 **/  
            Row row6 = sheet.createRow((short) 5);  
            cell = row6.createCell((short) 4);  
            cell.setCellValue("合併單元格測試");  
            // ## Wrong:EXCEL 2007中打開workbook.xls文件看不到"合併單元格測試",但單元格已經合併了 ##//  
            /* 
             * sheet.addMergedRegion(new CellRangeAddress( 3, //first row 
             * (0-based) 5, //last row (0-based) 4, //first column (0-based) 6 
             * //last column (0-based) )); 
             */  
            // ## 正確合併單元格 注意:與上不一樣的是first row=last row ##//  
            sheet.addMergedRegion(new CellRangeAddress(5, // first row (0-based)  
                    5, // last row (0-based)  
                    4, // first column (0-based)  
                    6// last column (0-based)  
                    ));  
  
  
            /** 第七行 --- 字體 **/  
            Row row7 = sheet.createRow(6);  
            // ## 建立字體 ##//  
            // 注意:POI限制一個Workbook建立的Font對象最多爲32767,因此不要爲每一個CELL建立一個字體,建議重用字體  
            font = wb.createFont();  
            // ## 設置字體大小爲24 ##//  
            font.setFontHeightInPoints((short) 24);  
            // ## 設置字體樣式爲華文隸書 ##//  
            font.setFontName("華文隸書");  
            // ## 斜體 ##//  
            font.setItalic(true);  
            // ## 添加刪除線 ##//  
            font.setStrikeout(true);  
            // ## 將字體添加到樣式中 ##//  
            cellStyle = wb.createCellStyle();  
            cellStyle.setFont(font);  
            cell = row7.createCell(1);  
            cell.setCellValue("字體測試");  
            cell.setCellStyle(cellStyle);  
  
  
            /** 第八行 --- 自定義顏色 **/  
            Row row8 = sheet.createRow(7);  
            cell = row8.createCell(0);  
            cell.setCellValue("自定義顏色測試");  
            cellStyle = wb.createCellStyle();  
            // ## 設置填充前景色爲LIME ##//  
            cellStyle.setFillForegroundColor(HSSFColor.LIME.index);  
            // ## 設置填充模式爲SOLID FOREGROUND ##//  
            cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);  
            font = wb.createFont();  
            // ## 設置字體顏色爲紅色 ##//  
            font.setColor(HSSFColor.RED.index);  
            cellStyle.setFont(font);  
            cell.setCellStyle(cellStyle);  
  
  
            /* 
             * cell.setCellValue("自定義顏色測試Palette"); //creating a custom palette 
             * for the workbook HSSFPalette palette = 
             * ((HSSFWorkbook)wb).getCustomPalette(); //replacing the standard 
             * red with freebsd.org red 
             * palette.setColorAtIndex(HSSFColor.RED.index, (byte) 153, //RGB 
             * red (0-255) (byte) 0, //RGB green (byte) 0 //RGB blue ); 
             * //replacing lime with freebsd.org gold 
             * palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 
             * 204, (byte) 102); 
             */  
  
  
            /** 第九行 --- 換行 **/  
            Row row9 = sheet.createRow(8);  
            cell = row9.createCell(2);  
            cell.setCellValue("使用 /n及Word-wrap建立一個新行");  
            cellStyle = wb.createCellStyle();  
            // ## 設置WrapText爲true ##//  
            cellStyle.setWrapText(true);  
            cell.setCellStyle(cellStyle);  
            // ## 設置行的高度以適應新行 ---兩行##//  
            row9.setHeightInPoints((2 * sheet.getDefaultRowHeightInPoints()));  
            // ## 調整列寬 ##//  
            sheet.autoSizeColumn(2);  
  
  
            /** 第十行 --- 數據格式 **/  
            DataFormat format = wb.createDataFormat();  
  
  
            Row row10 = sheet.createRow(9);  
            cell = row10.createCell(0);  
            cell.setCellValue(11111.25);  
            cellStyle = wb.createCellStyle();  
            // ## 一位小數 ##//  
            cellStyle.setDataFormat(format.getFormat("0.0"));  
            cell.setCellStyle(cellStyle);  
  
  
            cell = row10.createCell(1);  
            cell.setCellValue(11111.25);  
            cellStyle = wb.createCellStyle();  
            // ## 四位小數,千位逗號隔開 ##//  
            // #,###.0000效果同樣  
            cellStyle.setDataFormat(format.getFormat("#,##0.0000"));  
            cell.setCellStyle(cellStyle);  
  
  
            // ## 將文件寫到硬盤上 ##//  
            fileOut = new FileOutputStream(XLS_WORKBOOK_LOCATION);  
            wb.write(fileOut);  
            fileOut.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
  
        /** 
         * EXCEL 2007及之後 
         */  
        /* 
         * try { wb = new XSSFWorkbook(); wb.createSheet("sheet1"); Cell cell = 
         * row.createCell( 0); cell.setCellValue("custom XSSF colors"); 
         * CellStyle style1 = wb.createCellStyle(); 
         * style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(128, 
         * 0, 128))); style1.setFillPattern(CellStyle.SOLID_FOREGROUND); fileOut 
         * = new FileOutputStream("d:/workbook.xlsx"); wb.write(fileOut); 
         * fileOut.close(); } catch (FileNotFoundException e) { 
         * e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 
         */  
  
  
    }  
  
  
    /** 
     * 建立相應格式的CELL 
     */  
    public void createCell(Workbook wb, Row row, short column, short halign,  
            short valign) {  
        Cell cell = row.createCell(column);  
        // ## 給CELL賦值 ##//  
        cell.setCellValue("對齊排列");  
        CellStyle cellStyle = wb.createCellStyle();  
        // ## 設置水平對齊方式 ##//  
        cellStyle.setAlignment(halign);  
        // ## 設置垂直對齊方式 ##//  
        cellStyle.setVerticalAlignment(valign);  
        // ## 添加CELL樣式 ##//  
        cell.setCellStyle(cellStyle);  
    }  
  
  
    /** 
     * 測試POI EXCEL迭代和或CELL中的值 
     */  
    @Test  
    public void testExcelIteratorAndCellContents() {  
        try {  
            // ## 建立HSSFWorkbook實例 ##//  
            Workbook wb = new HSSFWorkbook(new FileInputStream(  
                    XLS_WORKBOOK_LOCATION));  
            // ## 得到第一個SHEET ##//  
            Sheet sheet = wb.getSheetAt(0); // or we could cast into  
            // HSSFSheet,that doesn't matter  
            /** 第一種迭代方法 **/  
            /* 
             * //## 迭代ROW ##// for (Iterator<Row> rit = sheet.rowIterator(); 
             * rit.hasNext(); ) { Row row = rit.next(); //## 迭代CELL ##// for 
             * (Iterator<Cell> cit = row.cellIterator(); cit.hasNext(); ) { Cell 
             * cell = cit.next(); System.out.println(cell); } } 
             */  
            /** 第二種迭代方法 **/  
            for (Row row : sheet) {  
                for (Cell cell : row) {  
                    // ## 獲取CellReference對象 ##/  
                    CellReference cellRef = new CellReference(row.getRowNum(),  
                            cell.getColumnIndex());  
                    System.out.print(cellRef.formatAsString());  
                    System.out.print(" - ");  
                    // ## 根據CELL值類型進行相應處理 ##/  
                    switch (cell.getCellType()) {  
                    case Cell.CELL_TYPE_STRING:  
                        System.out.println(cell.getRichStringCellValue()  
                                .getString());  
                        break;  
                    case Cell.CELL_TYPE_NUMERIC:  
                        // ## yyyy年mm月dd日 hh:mm:ss此種格式日期不能識別 ##//  
                        // ## mm/dd/yyyy h:mm,yyyy-MM-dd  
                        // hh:mm:ss能夠識別,估計是POI對中文日期支持不怎麼好的問題 ##//  
                        if (DateUtil.isCellDateFormatted(cell)) {  
                            System.out.println(cell.getDateCellValue());  
                        } else {  
                            System.out.println(cell.getNumericCellValue());  
                        }  
                        break;  
                    case Cell.CELL_TYPE_BOOLEAN:  
                        System.out.println(cell.getBooleanCellValue());  
                        break;  
                    case Cell.CELL_TYPE_FORMULA:  
                        System.out.println(cell.getCellFormula());  
                        break;  
                    case Cell.CELL_TYPE_ERROR:  
                        System.out.println(cell.getErrorCellValue());  
                        break;  
                    default:  
                        System.out.println();  
                    }  
                }  
            }  
  
  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
  
    /** 
     * 修改文件測試 
     */  
    @Test  
    public void testReadingAndRewritingWorkbooks() {  
        InputStream inp = null;  
        try {  
            inp = new FileInputStream(XLS_WORKBOOK_LOCATION);  
            // inp = new FileInputStream("workbook.xlsx");  
            // ## 得到要修改的Workbook ##/  
            Workbook wb = WorkbookFactory.create(inp);  
            // ## 獲取要修改的Sheet ##//  
            Sheet sheet = wb.getSheetAt(0);  
            // ## 獲取要修改的Row ##//  
            Row row = sheet.getRow(1);  
            // ## 獲取要修改的Cell,若是沒有相應位置的Cell那麼就建立一個 ##//  
            Cell cell = row.getCell(2);  
            if (cell == null)  
                cell = row.createCell(2);  
            // ## 寫入修改數據 ##//  
            cell.setCellType(Cell.CELL_TYPE_STRING);  
            cell.setCellValue("修改文件測試");  
  
  
            // ## 將文件寫到硬盤上 ##//  
            FileOutputStream fileOut = new FileOutputStream(  
                    XLS_WORKBOOK_LOCATION);  
            wb.write(fileOut);  
            fileOut.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (InvalidFormatException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
  
    /** 
     * 暫時沒看到有什麼區別 
     */  
    @Test  
    public void testFitSheetToOnePage() {  
        try {  
            Workbook wb = new HSSFWorkbook();  
            Sheet sheet = wb.createSheet("format sheet");  
            PrintSetup ps = sheet.getPrintSetup();  
  
  
            sheet.setAutobreaks(true);  
  
  
            ps.setFitHeight((short) 1);  
            ps.setFitWidth((short) 1);  
            // Create various cells and rows for spreadsheet.  
            FileOutputStream fileOut = new FileOutputStream(  
                    XLS_WORKBOOK_LOCATION);  
            wb.write(fileOut);  
            fileOut.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
  
    /** 
     * 設置打印區域測試 
     */  
    @Test  
    public void testSetPrintArea() {  
        /** 
         * 注意:我測試的時候用的是EXCEL 2007打開的,效果不明顯,只能控制列且列好像也是不正確的。 可是我用EXCEL 
         * 2007轉換了一下,xls,xlsx的都正確了,目前還不知道是什麼問題。 
         */  
        try {  
            Workbook wb = new HSSFWorkbook();  
            Sheet sheet = wb.createSheet("Print Area Sheet");  
            Row row = sheet.createRow(0);  
            row.createCell(0).setCellValue("第一個單元格");  
            row.createCell(1).setCellValue("第二個單元格");  
            row.createCell(2).setCellValue("第三個單元格");  
            row = sheet.createRow(1);  
            row.createCell(0).setCellValue("第四個單元格");  
            row.createCell(1).setCellValue("第五個單元格");  
            row = sheet.createRow(2);  
            row.createCell(0).setCellValue("第六個單元格");  
            row.createCell(1).setCellValue("第七個單元格");  
            // ## 設置打印區域 A1--C2 ##//  
            // wb.setPrintArea(0, "$A$1:$C$2");  
            // ## 或者使用如下方法設置 ##//  
            wb.setPrintArea(0, // Sheet頁  
                    0, // 開始列  
                    2, // 結束列  
                    0, // 開始行  
                    1// 結束行  
                    );  
  
  
            FileOutputStream fileOut = new FileOutputStream(  
                    XLS_WORKBOOK_LOCATION);  
            wb.write(fileOut);  
            fileOut.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
  
    }  
  
  
    /** 
     * 設置頁腳測試 用「頁面佈局」能夠看到效果 下列代碼只適用xls 
     */  
    @Test  
    public void testSetPageNumbersOnFooter() {  
        try {  
            HSSFWorkbook wb = new HSSFWorkbook();  
            HSSFSheet sheet = wb.createSheet("Footer Test");  
            // ## 得到頁腳 ##/  
            HSSFFooter footer = sheet.getFooter();  
            Row row;  
            // ## 將 當前頁/總頁數 寫在右邊 ##/  
            footer.setRight(HSSFFooter.page() + "/" + HSSFFooter.numPages());  
            for (int i = 0; i < 100; i++) {  
                row = sheet.createRow(i);  
                for (int j = 0; j < 20; j++) {  
                    row.createCell(j).setCellValue("A" + i + j);  
                }  
            }  
            FileOutputStream fileOut = new FileOutputStream(  
                    XLS_WORKBOOK_LOCATION);  
            wb.write(fileOut);  
            fileOut.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
  
    }  
  
  
    /** 
     * 測試一些POI提供的比較方便的函數 文檔中有些以HSSF爲前綴的類的方法以過期(e.g: HSSFSheet, HSSFCell etc.), 
     * 測試的時候我去掉了HSSF前綴,固然也就是如今POI推薦的接口(Sheet,Row,Cell etc.) 
     */  
    @Test  
    public void testConvenienceFunctions() {  
        try {  
            Workbook wb = new HSSFWorkbook();  
            Sheet sheet1 = wb.createSheet("Convenience Functions");  
            // ## 設置Sheet的顯示比例 這裏是3/4,也就是 75% ##//  
            sheet1.setZoom(3, 4);  
            // ## 合併單元格 ##//  
            Row row = sheet1.createRow((short) 1);  
            Row row2 = sheet1.createRow((short) 2);  
            Cell cell = row.createCell((short) 1);  
            cell.setCellValue("合併單元格測試");  
            // ## 建立合併區域 ##//  
            CellRangeAddress region = new CellRangeAddress(1, (short) 1, 4,  
                    (short) 4);  
            sheet1.addMergedRegion(region);  
  
  
            // ## 設置邊框及邊框顏色 ##//  
            final short borderMediumDashed = CellStyle.BORDER_MEDIUM_DASHED;  
            RegionUtil.setBorderBottom(borderMediumDashed, region, sheet1, wb);  
            RegionUtil.setBorderTop(borderMediumDashed, region, sheet1, wb);  
            RegionUtil.setBorderLeft(borderMediumDashed, region, sheet1, wb);  
            RegionUtil.setBorderRight(borderMediumDashed, region, sheet1, wb);  
            // ## 設置底部邊框的顏色 ##//  
            RegionUtil.setBottomBorderColor(HSSFColor.AQUA.index, region,  
                    sheet1, wb);  
            // ## 設置頂部邊框的顏色 ##//  
            RegionUtil.setTopBorderColor(HSSFColor.AQUA.index, region, sheet1,  
                    wb);  
            // ## 設置左邊邊框的顏色 ##//  
            RegionUtil.setLeftBorderColor(HSSFColor.AQUA.index, region, sheet1,  
                    wb);  
            // ## 設置右邊邊框的顏色 ##//  
            RegionUtil.setRightBorderColor(HSSFColor.AQUA.index, region,  
                    sheet1, wb);  
  
  
            // ## CellUtil的一些用法 ##/  
            CellStyle style = wb.createCellStyle();  
            style.setIndention((short) 10);  
            CellUtil.createCell(row, 8, "CellUtil測試", style);  
            Cell cell2 = CellUtil.createCell(row2, 8, "CellUtil測試");  
            // ## 設置對齊方式爲居中對齊 ##//  
            CellUtil.setAlignment(cell2, wb, CellStyle.ALIGN_CENTER);  
  
  
            // ## 將Workbook寫到硬盤上 ##//  
            FileOutputStream fileOut = new FileOutputStream(  
                    XLS_WORKBOOK_LOCATION);  
            wb.write(fileOut);  
            fileOut.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
  
    /** 
     * 測試凍結窗格和拆分 
     */  
    @Test  
    public void testSplitAndFreezePanes() {  
        try {  
            Workbook wb = new HSSFWorkbook();  
            Sheet sheet1 = wb.createSheet("凍結首行Sheet");  
            Sheet sheet2 = wb.createSheet("凍結首列Sheet");  
            Sheet sheet3 = wb.createSheet("凍結兩行兩列 Sheet");  
            Sheet sheet4 = wb.createSheet("拆分Sheet");  
  
  
            /** 凍結窗格 **/  
            /* 
             * createFreezePane( colSplit, rowSplit, topRow, leftmostColumn ) 
             * colSplit 凍結線水平位置 rowSplit 凍結線垂直位置 topRow Top row visible in 
             * bottom pane leftmostColumn Left column visible in right pane. 
             */  
            // ## 凍結首行 ##//  
            sheet1.createFreezePane(0, 1, 0, 1);  
            // ## 凍結首列 ##//  
            sheet2.createFreezePane(1, 0, 1, 0);  
            // ## 凍結兩行兩列 ##//  
            sheet3.createFreezePane(2, 2);  
            // ## 拆分,左下的爲面板爲激活狀態 ##//  
            sheet4.createSplitPane(2000, 2000, 0, 0, Sheet.PANE_LOWER_LEFT);  
  
  
            FileOutputStream fileOut = new FileOutputStream(  
                    XLS_WORKBOOK_LOCATION);  
            wb.write(fileOut);  
            fileOut.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
  
    /** 
     * 測試簡單圖形 
     */  
    @Test  
    public void testDrawingShapes() {  
        try {  
            Workbook wb = new HSSFWorkbook();  
            Sheet sheet = wb.createSheet("Drawing Shapes");  
            // ## 獲得一個HSSFPatriarch對象,有點像畫筆可是注意區別 ##//  
            HSSFPatriarch patriarch = (HSSFPatriarch) sheet  
                    .createDrawingPatriarch();  
            /* 
             * 構造器: HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short 
             * col1, int row1, short col2, int row2) 描述: 
             * 建立HSSFClientAnchor類的實例,設置該anchor的頂-左和底-右座標(至關於錨點,也就是圖像出現的位置,大小等). 
             * Creates a new client anchor and sets the top-left and 
             * bottom-right coordinates of the anchor. 參數: dx1 第一個單元格的x座標 dy1 
             * 第一個單元格的y座標 dx2 第二個單元格的x座標 dy2 第二個單元格的y座標 col1 第一個單元格所在列 row1 
             * 第一個單元格所在行 col2 第二個單元格所在列 row2 第二個單元格所在行 
             */  
            HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 512, 255,  
                    (short) 1, 0, (short) 1, 0);  
            // ## 經過HSSFClientAnchor類的對象建立HSSFSimpleShape的實例 ##//  
            HSSFSimpleShape shape = patriarch.createSimpleShape(anchor);  
            // ## 畫個橢圓 ##//  
            shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);  
  
  
            // ## 這幾個是沒問題的 ##//  
            // shape.setLineStyleColor(10,10,10);  
            // shape.setFillColor(90,10,200);  
            // shape.setLineStyleColor(HSSFColor.BLUE.index); //設置不了,尚不知緣由  
            // ## 設置線條顏色爲紅色 ##//  
            // shape.setLineStyleColor(Color.BLUE.getRGB()); //搞不清楚爲什是反的BLUE:紅色  
            // RED:藍色,是否是開發POI的有點色盲,JUST KIDDING!  
            // ## 設置填充顏色爲灰色 ##//  
            shape.setFillColor(Color.GRAY.getRGB()); // 這個又能夠  
            // ## 設置線條寬度爲3pt ##//  
            shape.setLineWidth(HSSFShape.LINEWIDTH_ONE_PT * 3);  
            // ## 設置線條的樣式爲點式 ##//  
            shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS);  
  
  
            // ## 建立文本框並填充文字 「建立文本框」 ##//  
            HSSFTextbox textbox = patriarch.createTextbox(new HSSFClientAnchor(  
                    0, 0, 0, 0, (short) 1, 1, (short) 2, 2));  
            RichTextString text = new HSSFRichTextString("建立文本框");  
            // ## 建立字體 ##//  
            Font font = wb.createFont();  
            // ## 斜體 ##//  
            font.setItalic(true);  
            // ## 設置字體顏色爲藍色 ##//  
            // font.setColor((short)Color.BLUE.getBlue()); not work  
            font.setColor(HSSFColor.BLUE.index);  
            // ## 添加字體 ##//  
            text.applyFont(font);  
            textbox.setString(text);  
  
  
            // ## 將文件寫到硬盤上 ##//  
            FileOutputStream fileOut = new FileOutputStream(  
                    XLS_WORKBOOK_LOCATION);  
            wb.write(fileOut);  
            fileOut.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
  
    /** 
     * 添加圖片到工做薄測試 已測試PNG,JPG,GIF 
     */  
    @Test  
    public void testImages() {  
        try {  
            // ## 建立一個新的工做薄 ##//  
            Workbook wb = new XSSFWorkbook(); // or new HSSFWorkbook();  
  
  
            // ## 添加圖片到該工做薄 ##//  
            InputStream is = new FileInputStream(IMAGE_LOCATION);  
            byte[] bytes = IOUtils.toByteArray(is);  
            int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);  
            is.close();  
  
  
            CreationHelper helper = wb.getCreationHelper();  
  
  
            // ## 建立一個名爲「添加圖片」的Sheet ##//  
            Sheet sheet = wb.createSheet("添加圖片");  
  
  
            // ## 建立一個DrawingPatriarch實例 ##//  
            Drawing drawing = sheet.createDrawingPatriarch();  
  
  
            // ## 設置圖片的形狀,位置等 ##//  
            ClientAnchor anchor = helper.createClientAnchor();  
            // set top-left corner of the picture,  
            // subsequent call of Picture#resize() will operate relative to it  
            anchor.setCol1(3);  
            anchor.setRow1(2);  
            Picture pict = drawing.createPicture(anchor, pictureIdx);  
            // ## 自動設置圖片的大小 注意:只支持PNG,JPG,GIF(BMP未測試)##//  
            pict.resize();  
  
  
            // ## 保存Workbook ##//  
            String file = "picture.xls";  
            if (wb instanceof XSSFWorkbook)  
                file += "x";  
            FileOutputStream fileOut = new FileOutputStream(XLS_OR_XLSX_DIR  
                    + file);  
            wb.write(fileOut);  
            fileOut.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
  
    }  
}  
相關文章
相關標籤/搜索