Java POI导出Excel

版权声明:本文为博主原创文章,未经博主允许不得转载。
   在软件开发工作当中,导出Excel表格是比较常见的,下面我为大家分享一下POI导出Excel的一些方法。
1、引用poi.jar包

<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.9</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.9</version>
</dependency>

2、创建Excel

 @RequestMapping("/createExcel")
  public String createExcel(HttpServletResponse response) throws IOException {
        /**
        *创建HSSFWorkbook对象(excel的文档对象),本实例是导出扩张名为xls(office2003)。
       * 如果需要导出扩展名xlsx(office2007以后版本),只需要把文中HSSF改为XSSF即可,
       * 如      HSSFWorkbook改为XSSFWorkbook。
       * /
        HSSFWorkbook wb = new HSSFWorkbook();
       //建立新的sheet对象(excel的表单)
        HSSFSheet sheet=wb.createSheet("学生成绩表");
        //在sheet里创建第一行,参数为行索引(excel的行),行数最大可为:65536
        HSSFRow row1=sheet.createRow(0);
       //创建单元格,excel的单元格,参数为列索引,列数最大可为256。
        HSSFCell cell=row1.createCell(0);
        //设置单元格内容
        cell.setCellValue("学员考试成绩一览表");
        //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));
        //在sheet里创建第二行
        HSSFRow row2=sheet.createRow(1);
        //创建单元格并设置单元格内容
        row2.createCell(0).setCellValue("姓名");
        row2.createCell(1).setCellValue("班级");
        row2.createCell(2).setCellValue("语文成绩");
        row2.createCell(3).setCellValue("数学成绩");
        //在sheet里创建第三行
        HSSFRow row3=sheet.createRow(2);
        row3.createCell(0).setCellValue("测试一");
        row3.createCell(1).setCellValue("001");
        row3.createCell(2).setCellValue(42);
        row3.createCell(3).setCellValue(48);
        //输出Excel文件
        OutputStream output=response.getOutputStream();
        response.reset();
        //设置编码
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        //filename为导出文件名称的参数,一般况下可用简称+时间串来表示。
        response.setHeader("Content-disposition", "attachment; filename=chengji201812091655.xls");
        wb.write(output);
        output.close();
        return null;
    }

3、设置Excel的样式
3.1、设置单元格的行高、列宽

//sheet对象(excel的表单)
HSSFSheet sheet=wb.createSheet();
//设置行高
sheet.setDefaultRowHeightInPoints(10);
//设置列宽,第一参数为列数,第二参数为列宽的值。
sheet.setColumnWidth(0, 256 * 50);
//上面介绍的为统一设置行高、列宽,下面我们介绍一下单独设置每行的行高。
//创建行
Row row = sheet.createRow((short) 0);
//设置行高
row.setHeight((short)(200));

3.2、单元格样式
3.2.1设置单元格样式

//创建HSSFCellStyle
HSSFCellStyle cellStyle=wkb.createCellStyle();
// 设置单元格的横向和纵向对齐方式,具体参数就不列了,参考HSSFCellStyle
 
 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
 
 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
 
 /* 设置单元格的填充方式,以及前景颜色和背景颜色
 
  三点注意:
 
  1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;
 
  2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;
 
  3.前景颜色不是字体颜色。
 
 */
 
 //设置填充方式(填充图案)
 
 cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);
 
 //设置前景色
 
 cellStyle.setFillForegroundColor(HSSFColor.RED.index);
 
 //设置背景颜色
 
 cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);
 
 // 设置单元格底部的边框及其样式和颜色
 
 // 这里仅设置了底边边框,左边框、右边框和顶边框同理可设
 
 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
 
 cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);
 
 //设置日期型数据的显示样式
 
 cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
  // 设置单元格内容是否自动换行
 cellStyle.setWrapText(true);
 //将样式应用于单元格中。
 cell.setCellStyle(cellStyle);
 
//将样式应用到行,但有些样式只对单元格起作用
 
row.setRowStyle(cellStyle);

3.2.2设置单元格中的字体的样式

//创建HSSFFont对象
 Font f = wb.createFont();
 //设置字体大小
 f.setFontHeightInPoints((short) 18);
 //设置字体
 f.setFontName("黑体");
 //字体是否为斜体
 f.setItalic(true); 
 //设置字体颜色。
 f.setColor(IndexedColors.BLACK.getIndex());
 //设置是非粗体,BOLDWEIGHT_BOLD为粗体字,BOLDWEIGHT_NORMAL为非粗体字。
 f.setBoldweight(Font.BOLDWEIGHT_BOLD);
 // 添加下划线(Font.U_SINGLE单条下划线/Font.U_DOUBLE双条下划线)
 f.setUnderline(Font.U_DOUBLE);            
  // 是否添加删除线 。
 f.setStrikeout(true);       
  // 将字体应用到样式上面。  
 cellStyle.setFont(f);       
  // 样式应用到该单元格上。              
 cell.setCellStyle(cellStyle);              

4、Excel(xls)插入图片

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFHyperlink;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
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.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Hyperlink;
 
public class ExcelWriteImgUtil {
	
	/**
	 * 插入图片
	 * @param cell 要插入链接的单元格位置
	 * @param sheetName 插入的图片所在的工作表
	 * @param patriarch 画图的顶级管理器,一个sheet只能获取一次,多次插入图片请使用同一个patriarch对象
	 * @param wb HSSFWorkbook对象
	 * @param file 图片文件
	 * @param cellPoint 自定义的对象,指定要插入图片的坐标(x, y)
	 * @return cellPoint 自定义的对象,返回下一个要插入图片的坐标(x, y)
	 * @throws IOException
	 */
	public static CellPoint whiteImg(HSSFCell cell, String sheetName, HSSFPatriarch patriarch, HSSFWorkbook wb, File file, CellPoint cellPoint) throws IOException {
		Hyperlink hyperlink = new HSSFHyperlink(Hyperlink.LINK_DOCUMENT);    
        // "'插入图片实例'"表示sheet页名称  "A01"表示第几列第几行
        hyperlink.setAddress("'插入图片实例'!A" + (cellPoint.getY() + 1));    
        cell.setHyperlink(hyperlink);
        
        /* 设置为超链接的样式*/    
        HSSFCellStyle linkStyle = wb.createCellStyle();    
        HSSFFont cellFont= wb.createFont();
        cellFont.setUnderline((byte) 1);    
        cellFont.setColor(HSSFColor.BLUE.index);    
        linkStyle.setFont(cellFont);    
        cell.setCellStyle(linkStyle); 
	
	BufferedImage bufferImg = null;
	ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
	bufferImg = ImageIO.read(file);
	ImageIO.write(bufferImg, "png", byteArrayOut);
 
       int x1 = cellPoint.getX();
	int y1 = cellPoint.getY();
	int width = bufferImg.getWidth() / 32;
	int height = bufferImg.getHeight() / 8;
 
	int x2 = x1 + width;
	int y2 = y1 + height;
	// anchor主要用于设置图片的属性
	HSSFClientAnchor anchor1 = new HSSFClientAnchor(0, 0, 0, 0, (short) x1, y1, (short) x2, y2);
	// 插入图片
	patriarch.createPicture(anchor1, wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_PNG));
		cellPoint = new CellPoint(x1, y2 + 1);
		return cellPoint;
	}
	
	public static class CellPoint {
		private int x;
		private int y;
		
        public CellPoint(int x, int y) {
	        super();
	        this.x = x;
	        this.y = y;
        }
        public int getX() {
        	return x;
        }
        public void setX(int x) {
        	this.x = x;
        }
        public int getY() {
        	return y;
        }
        public void setY(int y) {
        	this.y = y;
        }
	}
	
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值