zoukankan      html  css  js  c++  java
  • poi导出excel

    Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能,介绍poi导出excel功能实现案例,算比较常用的功能实现以及导出excel需要注意的地方,采用的是poi-3.8-20120326.jar,poi-ooxml-3.8-20120326.jar,poi-scratchpad-3.8-20120326.jar

    输出表格

    poi输出excel最基本是输出table表格,下面是输出区域、总销售额(万元)、总利润(万元)简单的表格,
    创建HSSFWorkbook 对象,用于将excel输出到输出流中

              poi导出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宽度并不是像素需要转换

              poi导出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单元格样式

    单元格可以设置居左、居中、居右、上下居中、设置边框、设置边框颜色、设置单元格背景颜色等, excel设置单元格有一个HSSFCellStyle类可以设置样式,单元格颜色比较麻烦,excel颜色对应一个下标值,我们可以使用自定义颜色,但下标值从11开始,前1-10被poi已经使用,通过palette.setColorAtIndex方法将颜色与下标值对应,下面cellStyle.setFillForegroundColor(bgIndex)设置背景颜色时set 下标值并不是颜色Color,一个下标值如11不能被重复设置颜色,否则excel单元格显示的都是黑色,如下 背景颜色使用下标值bgIndex=11,边框颜色使用下标值bdIndex=12

              poi导出excel

    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();
            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);
    
            cell.setCellStyle(cellStyle);
        }
    }
                    

    单元格文本设置字体样式

    单元格文本可设置字体大小、颜色、斜体、粗体、下划线等。

              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开始)、 合并单元格最后列四个参数值

              poi导出excel

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

    单元格中加入图片

    单元格中不仅是文本、数值、也可以加入图片,需要指定图片占用单元格开始行数、开始列数、末尾行数、末尾列数。 
    支持png、jpeg、emf等

              poi导出excel

    //加入图片
    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.setCol1(0); //图片开始列数
    anchor.setRow1(4); //图片开始行数
    anchor.setCol2(3); //图片结束列数
    anchor.setRow2(25);//图片结束行数
    drawing.createPicture(anchor, pictureIdx);
                    

    excel中插入浮动层图片类似html中div

    excel中插入图片, poi导出excel似乎没有按绝对位置X、Y这样插入图片,可以行高和列宽计算X、Y值的大概的位置在哪个单元格中,
    然后类似(6)中插入图片,只指定图片开始行数、开始列数,picture.resize()会使图片依据图片实际大小进行扩展。

    //加入图片
    int pictureIdx = wb.addPicture(bt, Workbook.PICTURE_TYPE_PNG);
    CreationHelper helper = wb.getCreationHelper();
    Drawing drawing = sheet.createDrawingPatriarch();
    ClientAnchor anchor = helper.createClientAnchor();
    anchor.setCol1(0); //图片开始列数
    anchor.setRow1(4); //图片开始行数
    Picture picture = drawing.createPicture(anchor, pictureIdx);
    picture.resize();
                    

    单元格中画斜线

    excel单元格中画斜线另一篇有详细介绍:poi excel斜线表头

    长度转换MSExcelUtil

    excel中单元格宽度和高度并不是像素值、ppt值,所以需要转换,MSExcelUtil是一个转换工具类

    public class MSExcelUtil {
    
    	public static final short EXCEL_COLUMN_WIDTH_FACTOR = 256;
    	public static final int UNIT_OFFSET_LENGTH = 7;
    	public static final int[] UNIT_OFFSET_MAP = new int[] { 0, 36, 73, 109, 146, 182, 219 };
    
    	/**
    	 * pixel units to excel width units(units of 1/256th of a character width)
    	 * 
    	 * @param pxs
    	 * @return
    	 */
    	public static short pixel2WidthUnits(int pxs) {
    		short widthUnits = (short) (EXCEL_COLUMN_WIDTH_FACTOR * (pxs / UNIT_OFFSET_LENGTH));
    		widthUnits += UNIT_OFFSET_MAP[(pxs % UNIT_OFFSET_LENGTH)];
    		return widthUnits;
    	}
    
    	/**
    	 * excel width units(units of 1/256th of a character width) to pixel units
    	 * 
    	 * @param widthUnits
    	 * @return
    	 */
    	public static int widthUnits2Pixel(int widthUnits) {
    		int pixels = (widthUnits / EXCEL_COLUMN_WIDTH_FACTOR) * UNIT_OFFSET_LENGTH;
    		int offsetWidthUnits = widthUnits % EXCEL_COLUMN_WIDTH_FACTOR;
    		pixels += Math.round(offsetWidthUnits
    				/ ((float) EXCEL_COLUMN_WIDTH_FACTOR / UNIT_OFFSET_LENGTH));
    
    		return pixels;
    	}
    }
                 

    完整例子

    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"));
        }    
    }





    转自:http://www.anyrt.com/blog/list/poiexcel.html
  • 相关阅读:
    LeetCode 295. Find Median from Data Stream (堆)
    LeetCode 292. Nim Game(博弈论)
    《JavaScript 模式》读书笔记(4)— 函数2
    《JavaScript 模式》读书笔记(4)— 函数1
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数3
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数2
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数1
    《JavaScript 模式》读书笔记(2)— 基本技巧3
    《JavaScript 模式》读书笔记(2)— 基本技巧2
    《JavaScript 模式》读书笔记(2)— 基本技巧1
  • 原文地址:https://www.cnblogs.com/Crysta1/p/6187766.html
Copyright © 2011-2022 走看看