利用POI匯出excel
阿新 • • 發佈:2019-02-20
一、基本功能之輸出表格
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
七、完整例子
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"));
}
}