专栏首页程序猿的大杂烩JSP上传文件与导出Excel表

JSP上传文件与导出Excel表

JSP上传文件


我们可以通过Apache的fileupload组件来实现jsp上传文件,这样就不需要自己去写具体的实现了,首先需要配置如下依赖:

<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.3</version>
</dependency>

写一个简单的jsp页面,通过表单来提交需要上传的文件:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<!-- enctype是表单提交的数据类型 -->
<form action="upload" method="post" enctype="multipart/form-data">
    <!-- multiple属性可以上传多个文件 -->
    <input type="file" name="fileUpload" multiple="multiple"/>
    <button type="submit" name="subimit">上传</button>
</form>
</body>
</html>

然后编写一个servlet,用来将上传的文件都保存到指定的路径中:

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;

@WebServlet("/upload")
public class UpLoadServlet extends HttpServlet {

    protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        // 指定一个临时路径
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        diskFileItemFactory.setRepository(new File("D:/"));

        // 实例化上传文件对象,并把临时目录对象传递给它
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
        // 设置编码
        servletFileUpload.setHeaderEncoding("UTF-8");
        // 设置单个文件的最大大小
        servletFileUpload.setFileSizeMax(1024 * 1024 * 5);
        // 设置全部文件的最大大小
        servletFileUpload.setSizeMax(1024 * 1024 * 50);

        // 文件上传后的保存路径
        File saverDir = new File(this.getServletContext().getRealPath("/uploadDir"));
        System.out.println(saverDir.getPath());
        try {
            // 把包含在请求中的文件数据对象拿出来放到集合里
            List<FileItem> fileItemList = servletFileUpload.parseRequest(httpServletRequest);

            // 遍历集合里的文件对象
            for (FileItem fileItem : fileItemList) {

                // 判断是否是表单字段,是的话就打印出来
                if (fileItem.isFormField()) {
                    System.out.println(fileItem.getString());
                }

                // 非表单字段就是文件对象
                if (!fileItem.isFormField()) {
                    // 将文件对象中的数据写入到之前定义的保存目录中
                    FileUtils.copyInputStreamToFile(fileItem.getInputStream(), new File(saverDir, fileItem.getName()));
                }

            }

        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        // 上传完之后再跳回原来的页面中
        httpServletResponse.sendRedirect("upload.jsp");
    }
}

接着在工程中创建uploadDir目录:

我上传了两个文件:

上传之后在你的工程路径下找target目录下的uploadDir目录(如果你使用的是IDEA),看看有没有上传成功,我这里是上传成功了:

<br>

导出Excel表


Apache有个poi组件,可以帮助我们把一些数据导出为Excel表格式的文件,例如可以将mysql的一些表格数据导出成Excel表格式的文件。首先需要配置如下依赖:

    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.17</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.21</version>
    </dependency>

写一个简单的导出数据的类:

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.File;
import java.io.IOException;

public class OutputExcel {

    public static void main(String[] args) throws IOException {
        //创建工作薄对象
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建工作表对象
        HSSFSheet sheet = workbook.createSheet("学生信息");
        // 创建首行
        HSSFRow cells=sheet.createRow(0);
        cells.createCell(0).setCellValue("编号");
        cells.createCell(1).setCellValue("名字");
        cells.createCell(2).setCellValue("性别");
        cells.createCell(3).setCellValue("地址");
        cells.createCell(4).setCellValue("电话号码");

        // 循环给工作表填充数据
        for (int i = 1; i < 100; i++) {
            // 创建行
            cells = sheet.createRow(i);
            // 创建单元格,然后设置单元格的数据
            cells.createCell(0).setCellValue(i);
            cells.createCell(1).setCellValue("小明");
            cells.createCell(2).setCellValue("男");
            cells.createCell(3).setCellValue("湖南");
            cells.createCell(4).setCellValue("15669855326");
        }
        // 将生成的Excel格式的数据保存到指定的路径中
        workbook.write(new File("E:\\test.xls"));
    }
}

然后打开文件,文件的内容如下:

如图证明导出成功。

也可以事先准备好一个带有样式的Excel文件,然后把数据导入该Excel文件中,例如我有一个Excel文件,文件样式如下:

编写代码如下:

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class OutputExcel {

    public static void main(String[] args) throws IOException {
        //创建工作薄对象
        HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream("e:\\note.xls"));
        //得到模板文件的工作表对象
        HSSFSheet sheet = workbook.getSheet("Sheet1");

        // 循环给工作表填充数据
        for (int i = 1; i < 100; i++) {
            // 创建行
            HSSFRow cells = sheet.createRow(i);
            // 创建单元格,然后设置单元格的数据
            cells.createCell(0).setCellValue(i);
            cells.createCell(1).setCellValue("小明");
            cells.createCell(2).setCellValue("男");
            cells.createCell(3).setCellValue("湖南");
            cells.createCell(4).setCellValue("15669855326");
        }
        // 将生成的Excel格式的数据保存到指定的路径中
        workbook.write(new File("e:\\note.xls"));
    }

}

完成后,文件内容如下:

还可以导入到别的Excel文件中,只需要把保存路径改一下就可以了。

<br>

把数据库中的表格数据导出为Excel表: 数据库表格内容如下:

1.写一个数据库连接对象管理类:

import java.sql.Connection;
import java.sql.DriverManager;

public class DBManager {

    public static Connection getConnection() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection=DriverManager.getConnection("jdbc:mysql:///jdbc","root","password");
        return connection;
    }
}

2.编写一个类,将数据库表格的数据转换成Excel表格式:

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.File;
import java.sql.*;

public class OutputDataToXls {

    public static void main(String[] args) throws Exception {
        //创建工作薄对象
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建工作表对象
        HSSFSheet hssfSheet = workbook.createSheet("学生信息");

        //得到数据库连接对象并执行查询语句
        Connection connection = DBManager.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("select * from student");
        ResultSet resultSet = preparedStatement.executeQuery();

        //拿到表结构对象
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        //得到总列数
        int columnCount = resultSetMetaData.getColumnCount();
        //创建首行
        HSSFRow cells = cells = hssfSheet.createRow(0);
        //创建首行的单元格并将列名填充进去
        for (int i = 1; i <= columnCount; i++) {
            cells.createCell(i - 1).setCellValue(resultSetMetaData.getColumnName(i));
        }

        //将查询出来的数据填充到每一行的单元格中
        for (int i = 1; resultSet.next(); i++) {
            cells = hssfSheet.createRow(i);
            for (int j = 1; j <= columnCount; j++) {
                cells.createCell(j - 1).setCellValue(resultSet.getObject(resultSetMetaData.getColumnName(j)).toString());
            }
        }
        // 将生成的Excel格式的数据保存到指定的路径中
        workbook.write(new File("e:\\student.xls"));
    }
}

3.完成后,打开生成的文件,效果如下:

如果需要样式什么的,可以使用之前介绍的方法,先准备一个空的模板文件,然后再写入数据。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Cloud Zuul 综合使用

    从上图中可以看到,Zuul是我们整个系统的入口。当我们有参数校验的需求时,我们就可以利用Zuul的Pre过滤器,进行参数的校验。例如我现在希望请求都一律带上to...

    端碗吹水
  • 解决HttpServletRequest的输入流只能读取一次的问题

    通常对安全性有要求的接口都会对请求参数做一些签名验证,而我们一般会把验签的逻辑统一放到过滤器或拦截器里,这样就不用每个接口都去重复编写验签的逻辑。

    端碗吹水
  • 简单实现MVC模式

    View接受用户输入,并传递到Controller。 Controller统一进行处理命令,交由Model处理具体的业务。 经过处理Model更新后,通知Vie...

    端碗吹水
  • CG008收费软件库Asprise ocr库识别图片验证码

    上善若水.夏
  • Java编程思想第五版(On Java8)(二十四)-并发编程

    到目前为止,我们一直在编程,就像文学中的意识流叙事设备一样:首先发生一件事,然后是下一件事。我们完全控制所有步骤及其发生的顺序。如果我们将值设置为5,那么稍后会...

    JavaEdge
  • xml与数据库中数据的导入导出

    这是我一个晚上做出来的,因为要去做其他的项目,所以只实现了对特定数据库的xml操作,不过我觉得这是学习xml挺不错的参考代码和文档

    SmileNicky
  • springboot mybatis优雅的添加多数据源

    springboot的原则是简化配置,本文试图不通过xml配置,使用configuration配置数据源,并进行简单的数据访问。 并且配置了多数据源,在开发过程...

    用户1225216
  • Java基于百度API的图片文字识别

    http://ai.baidu.com/docs#/OCR-API/e1bd77f3

    Java团长
  • java9系列(一)安装及jshell使用

    官网地址http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-38485...

    codecraft
  • Java基于百度API的图片文字识别(支持中文,英文和中英文混合)

    具体文档:http://ai.baidu.com/docs#/OCR-API/e1bd77f3

    好好学java

扫码关注云+社区

领取腾讯云代金券