准备工作
首先要知道文件下载的返回类型是ResponseEntity,在准备对象的jar包,这里是ssm,那首先是有ssm框架的相关jar包,就不做叙述,在导入的是关于Excel的jar包,如下。
poi-4.1.0下载
提取码:jsj1
封装的Excel效果图
下载的Excel效果图片:
此Excel如何封装和下载的见下文。
详细步骤:
先准备一个Demo类
写一个Demo类 ,这里的Demo是个控制器:
@Controller
@RequestMapping("stat")
public class Demo {
@RequestMapping("exportshop")
public ResponseEntity<Object> exportCustomer(HttpServletResponse response) throws IOException {
//这里定义一个String数组
String []names= {"商品1","商品2","商品3"};
//声明一个空的list数组
List<String> list=new ArrayList<>();
//将name添加到list里面
for (String name:names) {
list.add(name);
System.out.println(name+"=====================");
}
//设置Excel文件名和每一个sheet的名字,假设是打印一个商品的购物单
String fileName="购物商品数据.xls";
String sheetName="商品信息数据";
//这里调用一个别的类ExprotShopUtils的静态方法exportRent用来绘制Excel
ByteArrayOutputStream bos= ExprotShopUtils.exportRent("小田",list,sheetName);
try {
fileName= URLEncoder.encode(fileName,"UTF-8");//处理文件名乱码
//创建封装响应头信息的对象
HttpHeaders header=new HttpHeaders();
//封装响应内容类型(APPLICATION_OCTET_STREAM 响应的内容不限定)
header.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//设置下载的文件的名称,"attachment"是固定写法
header.setContentDispositionFormData("attachment", fileName);
return new ResponseEntity<Object>(bos.toByteArray(), header, HttpStatus.CREATED);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
写Demo中调用的绘制Excel的ExprotShopUtils类
这里简述了如何封装Excel,若单纯想保存本地,可以把下面的ByteArrayOutputStream类型的outputStream对象换成File类型,例如换成new File(“文件路径”);
public class ExprotShopUtils {
/**
* 导出购物清单数据,这里给个例子用来参照,可以根据自己情况更改Excel的内容样式
*/
@SuppressWarnings("deprecation")
public static ByteArrayOutputStream exportRent(String name,List<String> comm, String sheetName) throws IOException {
// 一组装excel文档
// 1,创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 2,创建样式,这里写了一个Excel中的字体样式类ExprotHSSFCellStyle
HSSFCellStyle baseStyle = ExprotHSSFCellStyle.createTableTitleStyle(workbook);
HSSFCellStyle titleStyle = ExprotHSSFCellStyle.createTitleStyle(workbook);
HSSFCellStyle createSubTitleStyle=ExprotHSSFCellStyle.createSubTitleStyle(workbook);
// 3在工作簿创建sheet
HSSFSheet sheet = workbook.createSheet(sheetName);
// 4,设置sheet
sheet.setDefaultColumnWidth(30);
sheet.setColumnWidth(1, 50 * 256);
// 5,合并单元格,从0行开始,0行结束,0列开始4列结束,也就是合并第一行的四列单元格
CellRangeAddress region1 = new CellRangeAddress(0, 0, 0, 4);
sheet.addMergedRegion(region1);
// 6,创建第一行,第一行的index为0
int index = 0;
HSSFRow row1 = sheet.createRow(index);
// 6.1在第一行里面创建一个单元格
HSSFCell row1_cell1 = row1.createCell(0);
// 6.2设置标题样式
row1_cell1.setCellStyle(titleStyle);
// 6.3设置单元格内容
row1_cell1.setCellValue(name + "的购物信息");
// 7,第二行
index++;
HSSFRow row2 = sheet.createRow(index);
// 7.1设置行高,可以根据自己需要调整
row2.setHeightInPoints(150);
HSSFCell row2_cell1 = row2.createCell(0);
row2_cell1.setCellStyle(createSubTitleStyle);
row2_cell1.setCellValue("商品图片");
HSSFCell row2_cell2 = row2.createCell(1);
row2_cell2.setCellStyle(createSubTitleStyle);
row2_cell2.setCellValue("商品名称");
HSSFCell row2_cell3 = row2.createCell(2);
row2_cell3.setCellStyle(createSubTitleStyle);
row2_cell3.setCellValue("价钱");
HSSFCell row2_cell4 = row2.createCell(3);
row2_cell4.setCellStyle(createSubTitleStyle);
row2_cell4.setCellValue("数量");
HSSFCell row2_cell5 = row2.createCell(4);
row2_cell5.setCellStyle(createSubTitleStyle);
row2_cell5.setCellValue("合计");
//画图的顶级管理器,一个sheet只能获取一个(一定要注意这点),可以在表格里面画图片,如果想画图片可以使用。
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
// 第三行,假设本地项目有三张商品图片商品1,商品2,商品3
for (int i = 0; i < comm.size(); i++) {
index++;
//获取传来的商品名字
String c=comm.get(i);
HSSFRow row = sheet.createRow(index);
row.setHeightInPoints(150);
//9.1创建列商品图片,假设你的本地resources资源文件下有一个商品1.jpg
InputStream logoStream = ExprotRentUtils.class.getClassLoader().getResourceAsStream("商品"+(i + 1)+".jpg");
BufferedImage image1=ImageIO.read(logoStream );
ByteArrayOutputStream bos1=new ByteArrayOutputStream();
try {
ImageIO.write(image1, "JPEG", bos1);
} catch (IOException e1) {
e1.printStackTrace();
}
/**
* 参数4 设置图片的平铺程度 最大值是255 255代表铺满当前单元格 小于255就铺不满
* 参数5 列的开始坐标
* 参数6 行的开始坐标
* 参数7 列的结束坐标
* 参数8 行的结束坐标
*/
HSSFClientAnchor anchor1 = new HSSFClientAnchor(0, 0, 0, 255,(short) 0, i+2, (short) 1, i+2);
anchor1.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
patriarch.createPicture(anchor1, workbook.addPicture(bos1.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
//9.2创建列商品名称
HSSFCell row_custname = row.createCell(1);
row_custname.setCellStyle(baseStyle);
row_custname.setCellValue(c);
//9.3创建列价钱(可以自己添加价钱,这里做个样子)
HSSFCell row_phone = row.createCell(2);
row_phone.setCellStyle(baseStyle);
row_phone.setCellValue("商品"+(i + 1)+"价钱");
//总数(可以自己添加价钱,这里做个样子)
HSSFCell row_num = row.createCell(3);
row_num.setCellStyle(baseStyle);
row_num.setCellValue("商品"+(i + 1)+"总数");
//合计(可以自己添加价钱,这里做个样子)
HSSFCell row_sum = row.createCell(4);
row_sum.setCellStyle(baseStyle);
row_sum.setCellValue("商品"+(i + 1)+"合计");
}
// 到此excel组装完成
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 把workbook里面的数据写到outputStream
try {
workbook.write(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
return outputStream;
}
}
写ExprotShopUtils中调用的Excel的文字样式ExprotHSSFCellStyle类
public class ExprotHSSFCellStyle {
/**
* 创建基础样式
* 水平和垂直居中
*/
public static HSSFCellStyle createBaseStyle(HSSFWorkbook workbook) {
HSSFCellStyle style = workbook.createCellStyle();
//设置水平居中
style.setAlignment(HorizontalAlignment.CENTER);
//设置垂直居中
style.setVerticalAlignment(VerticalAlignment.CENTER);
return style;
}
/**
* 创建数据表格的头的样式
*/
public static HSSFCellStyle createTableTitleStyle(HSSFWorkbook workbook) {
HSSFCellStyle style = createBaseStyle(workbook);
//设置水平居中
style.setAlignment(HorizontalAlignment.CENTER);
//设置垂直居中
style.setVerticalAlignment(VerticalAlignment.CENTER);
//设置字体
HSSFFont font=workbook.createFont();
font.setBold(true);//是否加粗
font.setItalic(true);//是否斜体
font.setFontHeightInPoints((short)10); //设置字体大小
font.setColor(HSSFColor.HSSFColorPredefined.DARK_YELLOW.getIndex());//设置颜色
font.setFontName("黑体");//设置字体
style.setFont(font);
return style;
}
/**
* 创建小标题样式
*/
public static HSSFCellStyle createSubTitleStyle(HSSFWorkbook workbook) {
HSSFCellStyle style = createBaseStyle(workbook);
//设置字体
HSSFFont font=workbook.createFont();
font.setBold(true);//是否加粗
font.setFontHeightInPoints((short)25); //设置字体大小
font.setColor(HSSFColor.HSSFColorPredefined.SKY_BLUE.getIndex());//设置颜色
font.setFontName("黑体");//设置字体
style.setFont(font);
return style;
}
/**
* 创建标题样式
*/
public static HSSFCellStyle createTitleStyle(HSSFWorkbook workbook) {
HSSFCellStyle style = createBaseStyle(workbook);
//设置字体
HSSFFont font=workbook.createFont();
font.setBold(true);//是否加粗
font.setFontHeightInPoints((short)35); //设置字体大小
font.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex());//设置颜色
font.setFontName("华文行楷");//设置字体
style.setFont(font);
return style;
}
}
总结
叙述了如何封装excel,和ssm文件下载(Excel)的基本过程,测试可以在前端写一个button用来测试。