Java springbook使用POI导出Excel报表

Apache POI环境
POI依赖

//是03(xls)
<dependency>
 	<groupId>org.apache.poi</groupId>
 	<artifactId>poi</artifactId>
 	<version>4.1.2</version>
</dependency>
//是07(xlsx)版本的
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>4.1.2</version>
</dependency>

控制器代码

@RequestMapping("/exportExcelComm")
	public void exportExcel(HttpServletResponse response, Integer commoditySortid, String CommodityInformation,
			Boolean checked) throws IOException {

		// 第一步 创建HSSFWorkbook对象(excel的文档对象)
		HSSFWorkbook workbook = new HSSFWorkbook();
		// 第二步,在workbook中添加一个sheet,建立新的sheet对象(excel的表单)
		HSSFSheet sheet = workbook.createSheet("测试表");
		// 单元格高度
		sheet.setDefaultRowHeightInPoints(26);
		// 设置单个列宽
		sheet.setColumnWidth(0, 256 * 7 + 184);
		sheet.setColumnWidth(1, 256 * 15 + 184);
		sheet.setColumnWidth(2, 256 * 12 + 184);
		// sheet.setDefaultColumnWidth(25);//设置全部列宽

		// 在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
		HSSFRow row1 = sheet.createRow(0);

		// --------第一行 表头格式设置:
		HSSFCellStyle cellStyle = workbook.createCellStyle();
		cellStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中
		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中

		// 创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
		HSSFCell cell = row1.createCell(0);
		// 设置单元格内容
		cell.setCellValue("供应商信息表");
		// 设置单元格样式居中
		cell.setCellStyle(cellStyle);
		// 合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
		sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));

		// ---------在sheet里创建第二行
		HSSFRow row2 = sheet.createRow(1);
		// 第二行开始,每列水平居中
		row2.createCell(1).getCellStyle().setWrapText(true);
		row2.createCell(1).getCellStyle().setAlignment(HorizontalAlignment.CENTER);// 水平居中
		row2.createCell(1).getCellStyle().setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中

		// 创建单元格并设置单元格内容
		row2.createCell(0).setCellValue("序号");
		row2.createCell(1).setCellValue("商品编码");
		row2.createCell(2).setCellValue("商品名称");

		// 数据 根据条件查询数据
		List<CommodityVo> list = commodityVoService.selectData_export(commoditySortid, CommodityInformation, checked);
		// System.out.println(list);

		// 判断要导出的数据是否为空,不为空遍历集合
		if (null != list) {
			int j = 2;
			for (int i = 0; i < list.size(); i++) {
				// 在sheet里创建第三行,按照表头,添加数据
				HSSFRow row = sheet.createRow(j);
				// 创建第三行,第一个单元格、
				row.createCell(0).setCellValue(i + 1);
				// 第二个单元格
				row.createCell(1).setCellValue(list.get(i).getCommoditycode());
				// 第3个单元格
				row.createCell(2).setCellValue(list.get(i).getCommodityname());
				j++;
			}
		}
		// 输出Excel文件
		OutputStream output = response.getOutputStream();// 输出流
		response.setHeader("Content-disposition", "attachment; filename=xxb.xls");// 设置下载时Excel的名称
		response.setContentType("application/msexcel");// 这是输出为EXCEL格式的
		workbook.write(output);// 把相应的Excel 工作簿存盘   把文件写入流中输出
		output .flush();//强制把数据输出,清空缓存区
		output.close();// 关闭输出流

	}

poi是什么?
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
[Apache POI官网] https://poi.apache.org/

• POI提供了HSSF、XSSF以及SXSSF三种方式操作
Excel: HSSF - Excel97-2003版本,扩展名为.xls。一个sheet最大行数65536,最大列数256
XSSF - Excel2007版本开始,扩展名为.xlsx。一个sheet最大行数1048576,最大列数16384
SXSSF - 是在XSSF基础上,POI3.8版本开始提供的支持低内存占用的操作方式,扩展名为.xlsx

Excel版本兼容性是向下兼容
当我们使用高版本的Excel(2007、2010)打开一个Excel 2003的文档,界面最上方中间会出现:文件名+[兼容模式]。
在这里插入图片描述
这就是Excel高版本和低版本的兼容性问题出现的兼容模式,通常不会影响到正常使用。
高版本可以向下兼容,而低版本只能是下载兼容包才能打开2007版本的EXCEL表格。

三种类的接口及方法:

HSSF:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell……
XSSF:XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell……
SXSSF:SXSSFWorkbook、Sheet、Row、Cell……

创建一个excel报表步骤:

1.创建新的Excel工作薄
HSSFWorkbook workbook = new HSSFWorkbook();

在Excel工作簿中建一[工作表],其名为[缺省值]。POI中还提供了其他的一些workbook 构造方法。
2.创建一个工作表。新建一名为"测试表"的工作表:
HSSFSheet sheet = workbook.createSheet("测试表");

3.创建行。在索引0的位置创建行(最顶端的行):  
HSSFRow row = sheet.createRow(0);

4.创建单元格。在索引0的位置创建[单元格](左上端):  
HSSFCell cell = row.createCell((short) 0);
定义单元格为字符串类型(也可在创建单元格里面设置):
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
在单元格中输入一些内容: 
cell.setCellValue("增加值");

5.新建一输出文件流,把相应的Excel工作簿输出到本地
OutputStream output = response.getOutputStream();
—设置下载时Excel的名称
response.setHeader("Content-disposition", "attachment; filename=xxb.xls");
—把相应的Excel 工作簿存盘
workbook.write(output );
— 强制把数据输出,清空缓存区
output .flush();

6.操作结束,关闭文件
output.close();

—flush():
一般主要用在IO中,即清空缓冲区数据,就是说你用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还有一部分有可能会留在内存这个缓冲区中。这时候如果你调用了 close()方法关闭了读写流,那么这部分数据就会丢失,所以应该在关闭读写流之前先flush(),先清空数据。
在给单元格设置下从数据库中读取的数据。这样就可以把数据库里面的内容导入到excel了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值