基于Spring Mvc实现的Excel文件上传下载示例

发布时间 - 2026-01-10 23:17:02    点击率:

最近工作遇到一个需求,需要下载excel模板,编辑后上传解析存储到数据库。因此为了更好的理解公司框架,我就自己先用spring mvc实现了一个样例。

基础框架

之前曾经介绍过一个最简单的spring mvc的项目如何搭建,传送门在这里。

这次就基于这个工程,继续实现上传下载的小例子。需要做下面的事情:

1 增加index.html,添加form提交文件

2 引入commons-fileupload、commons-io、jxl等工具包

3 创建upload download接口

4 注入multipartResolver bean

5 在upload中使用HttpServletRequest获取文件流,通过WorkBook进行解析

6 在download中通过HttpServerResponse返回文件流,实现下载

页面

页面很简单,其实就是一个form标签,需要注意的是:

  • form中enctype="multipart/form-data"
  • action指定访问的url
  • input中需要设置name属性,这样后端才能获取到文件对象
<form role="form" action="/upload" method="POST" enctype="multipart/form-data">
  <div class="form-group">
    <label for="file">上传文件</label>
    <input type="file" id="file" name="file">
  </div>
  <button type="submit" class="btn btn-default">提交</button>
</form>

引入commons-fileupload、jxl等工具包

涉及的jar包有:

  • commons-fileupload 用于获取上传文件
  • jxl 用于解析excel
<!-- springframework begins -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.0-b01</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/jexcelapi/jxl -->
    <dependency>
      <groupId>jexcelapi</groupId>
      <artifactId>jxl</artifactId>
      <version>2.6</version>
    </dependency>

Xml的配置

在web.xml中需要配置默认的访问页面,因为之前已经设置过拦截的请求是/,因此如果不设置所有的静态页面都会被拦截下来。

<welcome-file-list>
  <welcome-file>index.html</welcome-file>
</welcome-file-list>

在spring的配置文件中,加入CommonsMultipartResolver的bean。

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- set the max upload size100MB -->
    <property name="maxUploadSize">
      <value>104857600</value>
    </property>
    <property name="maxInMemorySize">
      <value>4096</value>
    </property>
  </bean>

上传代码

@RequestMapping("upload")
  public void upload(HttpServletRequest request, HttpServletResponse response) throws IOException, BiffException, WriteException {
    MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
    MultipartFile file = mRequest.getFile("file");
    Workbook workbook = Workbook.getWorkbook(file.getInputStream());
    //遍历Sheet页
    Arrays.stream(workbook.getSheets())
        .forEach(sheet -> {
          int size = sheet.getRows();
          for(int i=0; i<size; i++){
            //遍历每一行,读取每列信息
            Arrays.stream(sheet.getRow(i)).forEach(cell -> System.out.println(cell.getContents().equals("")?'空':cell.getContents()));
          }
        });

    response.setHeader("Content-Disposition", "attachment; filename=return.xls");
    WritableWorkbook writableWorkbook = ExcelUtils.createTemplate(response.getOutputStream());
    writableWorkbook.write();
    writableWorkbook.close();
  }

下载代码

@RequestMapping("download")
  public void download(HttpServletRequest request, HttpServletResponse response) throws IOException, BiffException, WriteException {
    response.setHeader("Content-Disposition", "attachment; filename=template.xls");
    WritableWorkbook writableWorkbook = ExcelUtils.createTemplate(response.getOutputStream());
    writableWorkbook.write();
    writableWorkbook.close();
  }

模板类

static class ExcelUtils {
    public static WritableWorkbook createTemplate(OutputStream output) throws IOException, WriteException {
      WritableWorkbook writableWorkbook= Workbook.createWorkbook(output);
      WritableSheet wsheet = writableWorkbook.createSheet("测试title", 0);


      CellFormat cf = writableWorkbook.getSheet(0).getCell(1, 0).getCellFormat();
      WritableCellFormat wc = new WritableCellFormat();
      // 设置居中
      wc.setAlignment(Alignment.CENTRE);
      // 设置边框线
//    wc.setBorder(Border.ALL, BorderLineStyle.THIN);
      wc.setBackground(jxl.format.Colour.GREEN);

      Label nc0 = new Label(0, 0, "标题1",wc);//Label(x,y,z)其中x代表单元格的第x+1列,第y+1行, 单元格的内容是z
      Label nc1 = new Label(1, 0, "标题2",wc);
      Label nc2 = new Label(2, 0, "标题3",wc);
      Label nc3 = new Label(0, 1, "dddd");
      Label nc4 = new Label(1, 1, "ffff");


      wsheet.addCell(nc0);
      wsheet.addCell(nc1);
      wsheet.addCell(nc2);
      wsheet.addCell(nc3);
      wsheet.addCell(nc4);

      return writableWorkbook;
    }
  }

最后贡献下相关的代码:SpringTest_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# springmvc  # 上传excel  # spring  # mvc  # 文件上传  # 下载excel  # SpringMVC下实现Excel文件上传下载  # spring mvc实现文件上传与下载功能  # SpringMVC实现文件上传和下载功能  # Spring MVC的文件上传和下载以及拦截器的使用实例  # Spring MVC异步上传、跨服务器上传和文件下载功能实现  # 遍历  # 工具包  # 单元格  # 上传文件  # 的是  # 上传  # 我就  # 在这里  # 很简单  # 最简单  # 先用  # 需要注意  # 为了更好  # 配置文件  # 大家多多  # 后端  # 实现了  # 传送门  # 样例  # dependency 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  js代码实现下拉菜单【推荐】  如何挑选优质建站一级代理提升网站排名?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  JavaScript如何实现路由_前端路由原理是什么  C#如何调用原生C++ COM对象详解  北京企业网站设计制作公司,北京铁路集团官方网站?  高性价比服务器租赁——企业级配置与24小时运维服务  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  如何基于云服务器快速搭建个人网站?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  制作公司内部网站有哪些,内网如何建网站?  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  佛山企业网站制作公司有哪些,沟通100网上服务官网?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何利用DOS批处理实现定时关机操作详解  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何用腾讯建站主机快速创建免费网站?  如何正确选择百度移动适配建站域名?  linux top下的 minerd 木马清除方法  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  Laravel如何实现数据库事务?(DB Facade示例)  如何制作一个表白网站视频,关于勇敢表白的小标题?  Laravel中的withCount方法怎么高效统计关联模型数量  如何挑选高效建站主机与优质域名?  Android利用动画实现背景逐渐变暗  Laravel怎么连接多个数据库_Laravel多数据库连接配置  详解Android——蓝牙技术 带你实现终端间数据传输  如何注册花生壳免费域名并搭建个人网站?  Bootstrap整体框架之CSS12栅格系统  如何用低价快速搭建高质量网站?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  北京的网站制作公司有哪些,哪个视频网站最好?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  如何用wdcp快速搭建高效网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署  详解阿里云nginx服务器多站点的配置  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  详解Oracle修改字段类型方法总结  Laravel如何保护应用免受CSRF攻击?(原理和示例)  如何为不同团队 ID 动态生成多个独立按钮  如何在Ubuntu系统下快速搭建WordPress个人网站?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  怎么用AI帮你设计一套个性化的手机App图标?  晋江文学城电脑版官网 晋江文学城网页版直接进入