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了。