一、基本功能之輸出表格
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"));
}
}