利用POI導出excel

一、基本功能之輸出表格

poi輸出excel最基本是輸出table表格,下面是輸出區域、總銷售額(萬元)、總利潤(萬元)簡單的表格,
創建HSSFWorkbook 對象,用於將excel輸出到輸出流中

這裏寫圖片描述

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("table");  //創建table工作薄
Object[][] datas = {{"區域", "總銷售額(萬元)", "總利潤(萬元)簡單的表格"}, {"江蘇省" , 9045,  2256}, {"廣東省", 3000, 690}};
HSSFRow row;
HSSFCell cell;
for(int i = 0; i < datas.length; i++) {
    row = sheet.createRow(i);//創建表格行
    for(int j = 0; j < datas[i].length; j++) {
        cell = row.createCell(j);//根據表格行創建單元格
        cell.setCellValue(String.valueOf(datas[i][j]));
    }
}
wb.write(new FileOutputStream("/Users/mike/table.xls"));

二、設置表格行高、列寬

有時表格文本比較多,需要設置表格的列寬度,在設置表格的行高與列寬時一定在創建全部的HSSFRow與HSSFCell之後
即整個表格創建完成之後去設置,因爲在單元格合併的時候,合併之前設置的寬度單元格會比設置的寬度更寬。 sheet.setColumnWidth 設置列寬值需要轉換爲excel的寬度值,使用工具類:MSExcelUtil,excel寬度並不是像素需要轉換。
這裏寫圖片描述

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("table");  //創建table工作薄
Object[][] datas = {{"區域", "總銷售額(萬元)", "總利潤(萬元)簡單的表格"}, {"江蘇省" , 9045,  2256}, {"廣東省", 3000, 690}};
HSSFRow row;
HSSFCell cell;
for(int i = 0; i < datas.length; i++) {
    row = sheet.createRow(i);//創建表格行
    for(int j = 0; j < datas[i].length; j++) {
        cell = row.createCell(j);//根據表格行創建單元格
        cell.setCellValue(String.valueOf(datas[i][j]));
    }
}

//創建表格之後設置行高與列寬
for(int i = 0; i < datas.length; i++) {
    row = sheet.getRow(i);
    row.setHeightInPoints(30);//設置行高
}
for(int j = 0; j < datas[0].length; j++) {
    sheet.setColumnWidth(j, MSExcelUtil.pixel2WidthUnits(160)); //設置列寬
}
wb.write(new FileOutputStream("/Users/mike/table1.xls"));

三、設置單元格樣式

單元格可以設置居左、居中、居右、上下居中、設置邊框、設置邊框顏色、設置單元格背景顏色等, excel設置單元格有一個HSSFCellStyle類可以設置樣式,單元格顏色比較麻煩,而且使用場景不多,詳情可以參考:Java POI導出excel經典實現

四、單元格文本設置字體樣式

單元格文本可設置字體大小、顏色、斜體、粗體、下劃線等。
這裏寫圖片描述

HSSFCellStyle cellStyle = wb.createCellStyle();

HSSFFont font = wb.createFont();
font.setItalic(true);
font.setUnderline(HSSFFont.U_SINGLE);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontHeightInPoints((short)14);
cellStyle.setFont(font);

五、合併單元格

sheet中可以類似html合併單元格,指定開始行(從0開始計算)、合併單元格最後行、開始列(從0開始)、 合併單元格最後列四個參數值

CellRangeAddress region = new CellRangeAddress(0, // first row
        0, // last row
        0, // first column
        2 // last column
);
sheet.addMergedRegion(region);

六、單元格插圖片、excel中插入浮動層圖片類似html中div、長度轉換MSExcelUtil

http://www.anyrt.com/blog/list/poiexcel.html
這些東西感覺一方面很少用的到,另一方面即使有需要應該也會有更強大可以直接用的工具。

七、完整例子

poi導出excel源碼

import java.awt.Color;
import java.io.File;
import java.io.FileOutputStream;

import org.apache.commons.io.FileUtils;
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.HSSFPalette;
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.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;

public final class TestExportExcel {

    public static void main(String[] args) throws Exception  {

        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("table");  //創建table工作薄
        Object[][] datas = {{"區域產品銷售額","",""},{"區域", "總銷售額(萬元)", "總利潤(萬元)簡單的表格"}, {"江蘇省" , 9045,  2256}, {"廣東省", 3000, 690}};
        HSSFRow row;
        HSSFCell cell;

        short colorIndex = 10;
        HSSFPalette palette = wb.getCustomPalette();
        Color rgb = Color.GREEN;
        short bgIndex = colorIndex ++; 
        palette.setColorAtIndex(bgIndex, (byte) rgb.getRed(), (byte) rgb.getGreen(), (byte) rgb.getBlue());
        short bdIndex = colorIndex ++;
        rgb = Color.BLACK;
        palette.setColorAtIndex(bdIndex, (byte) rgb.getRed(), (byte) rgb.getGreen(), (byte) rgb.getBlue());

        for(int i = 0; i < datas.length; i++) {
            row = sheet.createRow(i);//創建表格行
            for(int j = 0; j < datas[i].length; j++) {
                cell = row.createCell(j);//根據表格行創建單元格
                cell.setCellValue(String.valueOf(datas[i][j]));

                HSSFCellStyle cellStyle = wb.createCellStyle();
                if(i == 0 || i == 1) {
                      cellStyle.setFillForegroundColor(bgIndex); //bgIndex 背景顏色下標值
                      cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
                }

                cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
                cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
                //bdIndex 邊框顏色下標值
                cellStyle.setBottomBorderColor(bdIndex);
                cellStyle.setLeftBorderColor(bdIndex);
                cellStyle.setRightBorderColor(bdIndex);
                cellStyle.setTopBorderColor(bdIndex);

                cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

                if(i == datas.length - 1 && j == datas[0].length - 1) {
                    HSSFFont font = wb.createFont();
                    font.setItalic(true);
                    font.setUnderline(HSSFFont.U_SINGLE);
                    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
                    font.setFontHeightInPoints((short)14);
                    cellStyle.setFont(font);
                }
                cell.setCellStyle(cellStyle);
            }
        }

        //加入圖片
        byte[] bt = FileUtils.readFileToByteArray(new File("/Users/mike/pie.png"));
        int pictureIdx = wb.addPicture(bt, Workbook.PICTURE_TYPE_PNG);
        CreationHelper helper = wb.getCreationHelper();
        Drawing drawing = sheet.createDrawingPatriarch();
        ClientAnchor anchor = helper.createClientAnchor();
        anchor.setDx1(MSExcelUtil.pixel2WidthUnits(60));
        anchor.setDy1(MSExcelUtil.pixel2WidthUnits(60));
        anchor.setCol1(0);
        anchor.setRow1(4);
        anchor.setCol2(3);
        anchor.setRow2(25);
        drawing.createPicture(anchor, pictureIdx);

        //合併單元格
        CellRangeAddress region = new CellRangeAddress(0, // first row
                0, // last row
                0, // first column
                2 // last column
        );
        sheet.addMergedRegion(region);

        //創建表格之後設置行高與列寬
        for(int i = 0; i < datas.length; i++) {
            row = sheet.getRow(i);
            row.setHeightInPoints(30);
        }
        for(int j = 0; j < datas[0].length; j++) {
            sheet.setColumnWidth(j, MSExcelUtil.pixel2WidthUnits(160));
        }
        wb.write(new FileOutputStream("/Users/mike/table6.xls"));
    }    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章