JSP上传文件与导出Excel表

2020-09-23 12:27:24 浏览数 (1)

JSP上传文件


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

代码语言:javascript复制
<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.3</version>
</dependency>

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

代码语言:javascript复制
<%@ 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,用来将上传的文件都保存到指定的路径中:

代码语言:javascript复制
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表格式的文件。首先需要配置如下依赖:

代码语言:javascript复制
    <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>

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

代码语言:javascript复制
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文件,文件样式如下:

编写代码如下:

代码语言:javascript复制
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.写一个数据库连接对象管理类:

代码语言:javascript复制
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表格式:

代码语言:javascript复制
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 人点赞