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

 更新时间:2017年02月25日 16:30:19   作者:xingoo  
本篇文章主要介绍了基于Spring Mvc实现的Excel文件上传下载示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

最近工作遇到一个需求,需要下载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

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

相关文章

  • 详解Springboot 注入装配到IOC容器方式

    详解Springboot 注入装配到IOC容器方式

    今天通过实例代码给大家介绍了Springboot 注入装配到IOC容器方式,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,感兴趣的朋友跟随小编一起看看吧
    2021-10-10
  • spring mvc利用ajax向controller传递对象的方法示例

    spring mvc利用ajax向controller传递对象的方法示例

    这篇文章主要给大家介绍了关于spring mvc利用ajax向controller传递对象的相关资料,文中通过示例代码将步骤介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来跟着小编一起学习学习吧。
    2017-07-07
  • Spring实战之类级别缓存实现与使用方法

    Spring实战之类级别缓存实现与使用方法

    这篇文章主要介绍了Spring实战之类级别缓存实现与使用方法,结合实例形式分析了Spring类级别缓存配置、属性、领域模型等相关操作技巧,需要的朋友可以参考下
    2020-01-01
  • 超详细讲解SpringCloud Commons公共抽象的用法

    超详细讲解SpringCloud Commons公共抽象的用法

    这篇文章主要介绍了超详细讲解SpringCloud Commons公共抽象的用法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • java读取文件显示进度条的实现方法

    java读取文件显示进度条的实现方法

    当读取一个大文件时,一时半会儿无法看到读取结果,就需要显示一个进度条,是程序员明白已经读了多少文件,可以估算读取还需要多少时间,下面的代码可以实现这个功能
    2014-01-01
  • 超详细的Spring Boot入门笔记(总结)

    超详细的Spring Boot入门笔记(总结)

    本篇文章主要介绍了超详细的Spring Boot入门笔记(总结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Java实现自定义中文排序的方法机注意事项

    Java实现自定义中文排序的方法机注意事项

    在Java中,中文排序通常涉及到使用Collator类来处理字符串的比较,确保根据汉字的拼音顺序进行排序,本文给大家介绍了Java实现自定义中文排序的方法机注意事项,并有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-10-10
  • SpringCloud Stream 整合RabbitMQ的基本步骤

    SpringCloud Stream 整合RabbitMQ的基本步骤

    这篇文章主要介绍了SpringCloud Stream 整合RabbitMQ的基本步骤,从项目介绍到生产者结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 关于文件合并与修改md5值的问题

    关于文件合并与修改md5值的问题

    这篇文章主要介绍了关于文件合并与修改md5值的问题,使用本博客的方法,不仅仅可以修改md5值,还可以达到隐藏文件的目的,需要的朋友可以参考下
    2023-04-04
  • TransactionSynchronization的invokeAfterCompletion事务源码解析

    TransactionSynchronization的invokeAfterCompletion事务源码解析

    这篇文章主要为大家介绍了TransactionSynchronization的invokeAfterCompletion事务源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09

最新评论