导出excel是个常用的问题,然而这一次摸索之后并不知道下一次是什么时候再用,记录一下,方便自己
目录
常用的类型
- HSSFWorkbook
所有工作的起点,可以创建HSSFSheet、HSSFCellStyle、HSSFFont等常用类型的对象
- HSSFSheet
sheet页,主要操作对象,创建/获取行对象最常用
- HSSFCell
单元格
- HSSFStyle 单元格样式,颜色,对齐`
- HSSFFont
字体,可以加粗等
- HSSFComment
备注,悬浮展示/点击展示
- 导出一个基本的Excel这些类型足够了
代码
基本的练习代码:
//工作簿对象,所有的sheet都在在这个对象上操作,创建样式、创建sheet、
HSSFWorkbook workbook=new HSSFWorkbook();
//一个表格页面,可以用default构造,可以传入sheet名构造
HSSFSheet sheet=workbook.createSheet("可以的我的哥");
//绘制图形,不限于图形,比如备注也可放在这个容器中
HSSFPatriarch p= sheet.createDrawingPatriarch();
//绘制线条
p.createSimpleShape(new HSSFClientAnchor(2,1,2,2,(short)2,2,(short)2,2));
HSSFComment comment = p.createComment(new HSSFClientAnchor(0,
0, 0, 0, (short) 4, 2, (short) 6, 5));
// 设置注释内容
comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
//comment.setVisible(true);//控制注释是否直接显示,false为不可见,默认false
//样式对象、操作单元格的属性
HSSFCellStyle style2 = workbook.createCellStyle();
style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
//设置填充模式,不设置填充模式,填充颜色将不生效
style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style2.setWrapText(true);// auto change line
style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// vertical be center
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);// horizontal be center
//构建一个行,在excel的sheet中,行号是从1开始的,但是在对象操作时,从0开始
HSSFRow row=sheet.createRow(1);
//构建一个单元格对象,对象的索引也是从0开始的,由行和指定 column唯一确定位置
HSSFCell cell=row.createCell((short) 1);
cell.setCellStyle(style2);
//区域对象
Region region =new Region((short)0, (short)0, (short)2, (short)2);
//合并指定区域的单元格,ps:取合并单元格对象的时候,取得是第一个单元格的坐标
sheet.addMergedRegion(region);
Excel文件输出
- 本地保存
workbook.write(new FileOutputStream(new File("path.xls")));
- 从服务器发送给客户端
//通过写成byte[]对象,就可以利用response对象以附件的形式返回给浏览器,直接下载
public byte[] getBytes() throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
workbook.write(out);
return out.toByteArray();
}
//body参数就是上面getBytes()产生的数组了
private void writeExcelToClient(byte[] body, HttpServletResponse response,
String fileName) throws IOException {
//指明内容类型,没深究这个类型问题,下回
//在项目里,这里试过2-3种类型,最终客户端都正常接收了...(狗血...
response.setContentType("multipart/form-data");
response.addHeader("Content-Disposition", "attachment;filename="
+ fileName);
response.setContentLength(body.length);
OutputStream out = response.getOutputStream();
out.write(body);
out.close();
}