關於POI的系統整理

java操做excel文件,有兩種工具可使用,一種是jxl,一種是poi。最近作的需求,使用到poi,所以本文介紹poi的使用(目前只介紹寫excel文件)。html

 

1、簡介java

      Jakarta POI 是apache的子項目,目標是處理ole2對象。它提供了一組操縱Windows文檔的Java APIapache

目前比較成熟的是HSSF接口,處理MS Excel對象。它不象咱們僅僅是用csv生成的沒有格式的能夠由Excel轉換的東西,而是真正的Excel對象,你能夠控制一些屬性如sheet,cell等等。 poi中,經過HSSF,你能夠用純Java代碼來讀取、寫入、修改Excel文件。app

HSSF 爲讀取操做提供了兩類API:usermodel和eventusermodel,即「用戶模型」和「事件-用戶模型」。前者很好理解,後者比較抽象,但操做效率要高得多。ide

 

2、使用HSSF API建立excel文檔函數

一、HSSF的幾個實體類工具

HSSFWorkBook  : 整個excel文件字體

HSSFSheet :工做表ui

HSSFRow : 行spa

HSSFCell : 單元格

HSSFCellStyle : 單元格樣式

HSSFFont :單元格字體

HSSFDataFormat : 單元格內容格式化

HSSFRichTextString : 單元格文本內容

還有其餘一些實體,這裏不一一列舉

 

二、HSSFWorkBook

WorkBook是經過new HSSFWorkBook實例來建立。

HSSFWorkbook workBook = new HSSFWorkbook();  

三、HSSFSheet Sheet經過HSSFWorkBook實例的createSheet()函數來建立。 HSSFSheet sheet = workBook.createSheet(); 新建立的多個sheet自動按照順序添加到WorkBook。 Sheet建立的時候並無指定名字(底部tab顯示的名稱),能夠調用HSSFWorkbook的setSheetName函數來手工設置。如 workBook.setSheetName(sheetindex,"SheetName"); 參數sheetindex       從0開始

四、HSSFRow Row是經過HSSFSheet實例的createRow(rowNumber)函數建立的。 參數rowNumber從0開始。 HSSFRow row = sheet.createRow(0); 能夠調用setHeight(height)函數設置Row的高度; 其中height單位爲twip,即1/20個point。 高度也能夠經過setHeightInPoints函數來設置。

五、HSSFCell Cell經過HSSFRow實例的createCell(column)或createCell(column, type)函數來建立。 Cell的type HSSFCell.CELL_TYPE_NUMERIC

HSSFCell.CELL_TYPE_STRING

HSSFCell.CELL_TYPE_FORMULA

HSSFCell.CELL_TYPE_BLANK   默認值

HSSFCell.CELL_TYPE_BOOLEAN

Cell的值       調用setCellValue(para)函數來設置。Para參數是HSSFRichTextString、double、Date、Calander。       單個Cell沒有width值,必須HSSFSheet實例的setColumnWidth(colindex, width)函數來設置,單位是1/256個character。例如,若是第一列單元格寬度設置爲8個字符寬度,則使用:sheet.setColumnWidth(0, 8*256);

      另外,HSSFSheet提供了autoSizeColumn(short column)方法,來根據單元格內容,自動調整列的寬度。該方法效率很低,不推薦使用(特別是數據量很大的時候)。

六、HSSFFont

HSSFFont是經過HSSFWorkbook實例的createFont()方法建立的,即:

HSSFFont font = workBook.createFont();

font.setFontHeightInPoints((short) 11); // 字體大小 font.setFontName("宋體");

七、HSSFDataFormat

HSSFDataFormat,用來設置單元格的格式,例如數字、日期格式。經過HSSFWorkbook實例的createDataFormat()方法來建立對象,即:

HSSFDataFormat dataFormat = workBook.createDataFormat();

建立以後,使用style進行設置,即:

style.setDataFormat(dataFormat.getFormat("yyyy-mm-dd hh:mm:ss"));

八、HSSFCellStyle

HSSFCellStyle實例是經過HSSFWorkbook實例的createCellStyle()方法來建立的,即:

HSSFCellStyle style = workBook.createCellStyle();

style.setFont(font);
 style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); 
 style.setWrapText(false); // 是否換行

style.setDataFormat(dataFormat.getFormat("yyyy-mm-dd hh:mm:ss"));

import java.io.BufferedOutputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
 import org.apache.poi.hssf.usermodel.HSSFDataFormat;
 import org.apache.poi.hssf.usermodel.HSSFFont;
 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class WriteExcel {
     private static final String DATE_FORMAT = "yyyy-mm-dd hh:mm:ss";
     private static final String MONEY_FORMAT = "###,##0.00";
     
     public static void main(String[] args) throws IOException {
         export();
     }
     
     public static HSSFCellStyle createCellStyle(HSSFWorkbook workBook, HSSFFont font, short align) {
         HSSFCellStyle style = workBook.createCellStyle();
         style.setFont(font);
         style.setAlignment(align);
         style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
         return style;
     }
     
     public static HSSFCellStyle createWrapCellStyle(HSSFWorkbook workBook, HSSFFont font, short align, boolean wrapped) {
         HSSFCellStyle style = workBook.createCellStyle();
         style.setFont(font);
         style.setAlignment(align);
         style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
         style.setWrapText(wrapped);
         return style;
     }
     
     public static HSSFCellStyle createFormatCellStyle(HSSFWorkbook workBook, HSSFFont font, short align, HSSFDataFormat dataFormat, String format) {
         HSSFCellStyle style = workBook.createCellStyle();
         style.setFont(font);
         style.setAlignment(align);
         style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
         style.setDataFormat(dataFormat.getFormat(format));
         return style;
     }
     
     public static void createStringCell(HSSFRow row, short column, HSSFCellStyle cellStyle, String value) {
         HSSFCell cell = row.createCell(column);
         cell.setCellStyle(cellStyle);
         cell.setCellValue(new HSSFRichTextString(value));
     }
     
     public static void createNumberCell(HSSFRow row, short column, HSSFCellStyle cellStyle, double value) {
         HSSFCell cell = row.createCell(column);
         cell.setCellStyle(cellStyle);
         cell.setCellValue(value);
     }
     
     public static void createDateCell(HSSFRow row, short column, HSSFCellStyle cellStyle, Date value) {
         HSSFCell cell = row.createCell(column);
         cell.setCellStyle(cellStyle);
         cell.setCellValue(value);
     }
     
     public static void export() throws IOException {
         HSSFWorkbook workBook = new HSSFWorkbook();
         HSSFSheet sheet = workBook.createSheet();
         workBook.setSheetName(0, "sheet1");
         
         // 字體
        HSSFFont titleFont = workBook.createFont();
         titleFont.setFontHeightInPoints((short) 11);
         titleFont.setFontName("宋體");
         HSSFDataFormat dataFormat = workBook.createDataFormat();
         
         // 單元格樣式
        HSSFCellStyle leftStyle = createCellStyle(workBook, titleFont, HSSFCellStyle.ALIGN_LEFT);
         HSSFCellStyle rightStyle = createCellStyle(workBook, titleFont, HSSFCellStyle.ALIGN_RIGHT);
         HSSFCellStyle wrapStyle = createWrapCellStyle(workBook, titleFont, HSSFCellStyle.ALIGN_LEFT, true);
         HSSFCellStyle dateStyle = createFormatCellStyle(workBook, titleFont, HSSFCellStyle.ALIGN_RIGHT, dataFormat, DATE_FORMAT);
         HSSFCellStyle moneyStyle = createFormatCellStyle(workBook, titleFont, HSSFCellStyle.ALIGN_RIGHT, dataFormat, MONEY_FORMAT);
         
         int rowIndex = 0;

        // excel標題行
        HSSFRow row = sheet.createRow(rowIndex);
         short index = (short) 0;
         for (int i = 0; i < 6; i ++) {
             createStringCell(row, index, leftStyle, "列標題" + i);
             sheet.setColumnWidth(index, (short) (20 * 256)); // 20個字符的寬度
            index++;
         }

        // 內容
        for (int i = 0; i < 10; i++) {
             row = sheet.createRow(++rowIndex);
             createStringCell(row, (short) 0, leftStyle, "26688135");
             createStringCell(row, (short) 1, wrapStyle, "這是簡介");
             createNumberCell(row, (short) 2, moneyStyle, 100.05);
             createDateCell(row, (short) 3, dateStyle, new Date());
             createStringCell(row, (short) 4, wrapStyle, "第一行內容 /r/n第二行內容/r/n第三行內容"); // 使用/r/n,強制換行
            createNumberCell(row, (short) 5, rightStyle, 100);
         }
         
         // 輸出
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("abc.xls"));
         workBook.write(bos);
         bos.close();
     }
 }

轉載自:http://blog.csdn.net/zhutulang/article/details/6885637


常見的單元格設置還有:

1.合併單元格;

2.單元格水平居中、垂直居中;

3.定義日期格式:

  1. poi的「Quick Guide」中提供了 「How to create date cells 」例子來講明如何建立日期單元格,代碼以下:

  

    HSSFCellStyle cellStyle = wb.createCellStyle();
    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
    cell = row.createCell((short)1);
    cell.setCellValue(new Date());
    cell.setCellStyle(cellStyle);

該方法只能建立HSSFDataFormat方法中內建的幾種日期格式,而不是真正的徹底自定義格式,若是隻須要內建的格式,請參考源碼。

  2. 真正的日期自定義格式,應該參考「Quick Guide」中提供了 「Create user defined data formats  」例子,代碼以下:

  

    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("format sheet");
    HSSFDataFormat format = wb.createDataFormat();
    HSSFRow row = sheet.createRow(0);
    HSSFCell cell = row.createCell(0);
    HSSFCellStyle style = wb.createCellStyle();
    style.setDataFormat(format.getFormat"yyyy年MM月dd日"));
    cell.setCellValue(new Date());
    cell.setCellStyle(style);

 

參考文檔:

官網主頁:http://poi.apache.org/

很好的教程:http://poi.apache.org/spreadsheet/quick-guide.html

相關文章
相關標籤/搜索