SSM的网页文件下载EXCEL

本文详细介绍使用SSM框架实现Excel文件的封装与下载过程,包括准备工作、代码实现及注意事项,适合初学者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备工作

首先要知道文件下载的返回类型是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用来测试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值