java怎么将Excel文件上载并把数据导入数据库

发布时间:2022-11-09 17:27:44 作者:iii
来源:亿速云 阅读:447

Java怎么将Excel文件上载并把数据导入数据库

目录

  1. 引言
  2. 准备工作
  3. Excel文件读取
  4. 数据库连接与操作
  5. 文件上传
  6. 整合流程
  7. 错误处理与优化
  8. 总结

引言

在现代企业应用中,数据的导入和导出是非常常见的需求。Excel文件作为一种广泛使用的数据存储格式,经常被用于数据的导入和导出。本文将详细介绍如何使用Java将Excel文件上传并将数据导入数据库。

准备工作

2.1 环境配置

在开始之前,确保你已经安装了以下软件:

2.2 依赖库

我们将使用以下依赖库:

pom.xml中添加以下依赖:

<dependencies>
    <!-- Apache POI -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>

    <!-- MySQL Connector/J -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>

    <!-- Spring Boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>

Excel文件读取

3.1 Apache POI简介

Apache POI是一个用于读写Microsoft Office文件的Java库。它支持Excel、Word、PowerPoint等文件格式。我们将使用Apache POI来读取Excel文件。

3.2 读取Excel文件

首先,我们需要创建一个方法来读取Excel文件。以下是一个简单的示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ExcelReader {

    public static List<List<String>> readExcel(String filePath) throws IOException {
        List<List<String>> data = new ArrayList<>();

        try (FileInputStream fis = new FileInputStream(filePath);
             Workbook workbook = new XSSFWorkbook(fis)) {

            Sheet sheet = workbook.getSheetAt(0);
            Iterator<Row> rowIterator = sheet.iterator();

            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                Iterator<Cell> cellIterator = row.cellIterator();
                List<String> rowData = new ArrayList<>();

                while (cellIterator.hasNext()) {
                    Cell cell = cellIterator.next();
                    rowData.add(cell.getStringCellValue());
                }

                data.add(rowData);
            }
        }

        return data;
    }
}

3.3 处理Excel数据

在读取Excel文件后,我们可能需要对数据进行一些处理,例如数据清洗、格式转换等。以下是一个简单的示例:

public class DataProcessor {

    public static List<List<String>> processData(List<List<String>> rawData) {
        List<List<String>> processedData = new ArrayList<>();

        for (List<String> row : rawData) {
            List<String> processedRow = new ArrayList<>();

            for (String cell : row) {
                processedRow.add(cell.trim().toUpperCase());
            }

            processedData.add(processedRow);
        }

        return processedData;
    }
}

数据库连接与操作

4.1 JDBC简介

JDBC(Java Database Connectivity)是Java用于连接和操作数据库的标准API。我们将使用JDBC来连接MySQL数据库并插入数据。

4.2 数据库连接

首先,我们需要创建一个方法来连接数据库:

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

public class DatabaseConnector {

    private static final String URL = "jdbc:mysql://localhost:3306/mydatabase";
    private static final String USER = "root";
    private static final String PASSWORD = "password";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}

4.3 数据插入

接下来,我们创建一个方法来插入数据:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

public class DataInserter {

    public static void insertData(List<List<String>> data) throws SQLException {
        String sql = "INSERT INTO mytable (column1, column2, column3) VALUES (?, ?, ?)";

        try (Connection conn = DatabaseConnector.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            for (List<String> row : data) {
                pstmt.setString(1, row.get(0));
                pstmt.setString(2, row.get(1));
                pstmt.setString(3, row.get(2));
                pstmt.executeUpdate();
            }
        }
    }
}

文件上传

5.1 文件上传简介

文件上传是Web应用中常见的功能。我们将使用Servlet和Spring Boot来实现文件上传。

5.2 使用Servlet实现文件上传

以下是一个使用Servlet实现文件上传的示例:

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 FileUploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uploadPath = getServletContext().getRealPath("") + File.separator + "uploads";
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        String fileName = req.getPart("file").getSubmittedFileName();
        req.getPart("file").write(uploadPath + File.separator + fileName);

        List<List<String>> data = ExcelReader.readExcel(uploadPath + File.separator + fileName);
        List<List<String>> processedData = DataProcessor.processData(data);

        try {
            DataInserter.insertData(processedData);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        resp.getWriter().write("File uploaded and data inserted successfully.");
    }
}

5.3 使用Spring Boot实现文件上传

以下是一个使用Spring Boot实现文件上传的示例:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {
        String uploadPath = System.getProperty("user.dir") + File.separator + "uploads";
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        String fileName = file.getOriginalFilename();
        File dest = new File(uploadPath + File.separator + fileName);
        try {
            file.transferTo(dest);

            List<List<String>> data = ExcelReader.readExcel(dest.getAbsolutePath());
            List<List<String>> processedData = DataProcessor.processData(data);

            try {
                DataInserter.insertData(processedData);
            } catch (SQLException e) {
                e.printStackTrace();
            }

            return "File uploaded and data inserted successfully.";
        } catch (IOException e) {
            e.printStackTrace();
            return "File upload failed.";
        }
    }
}

整合流程

6.1 整体流程概述

整个流程可以分为以下几个步骤:

  1. 用户上传Excel文件。
  2. 服务器接收文件并保存到指定目录。
  3. 使用Apache POI读取Excel文件。
  4. 对读取的数据进行处理。
  5. 使用JDBC将处理后的数据插入数据库。

6.2 代码实现

以下是整合后的代码实现:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ExcelToDatabaseApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExcelToDatabaseApplication.class, args);
    }
}
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {
        String uploadPath = System.getProperty("user.dir") + File.separator + "uploads";
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        String fileName = file.getOriginalFilename();
        File dest = new File(uploadPath + File.separator + fileName);
        try {
            file.transferTo(dest);

            List<List<String>> data = ExcelReader.readExcel(dest.getAbsolutePath());
            List<List<String>> processedData = DataProcessor.processData(data);

            try {
                DataInserter.insertData(processedData);
            } catch (SQLException e) {
                e.printStackTrace();
            }

            return "File uploaded and data inserted successfully.";
        } catch (IOException e) {
            e.printStackTrace();
            return "File upload failed.";
        }
    }
}

错误处理与优化

7.1 错误处理

在实际应用中,可能会遇到各种错误,例如文件格式错误、数据库连接失败等。我们需要对这些错误进行处理,以提高应用的健壮性。

以下是一个简单的错误处理示例:

import java.sql.SQLException;

public class DataInserter {

    public static void insertData(List<List<String>> data) {
        String sql = "INSERT INTO mytable (column1, column2, column3) VALUES (?, ?, ?)";

        try (Connection conn = DatabaseConnector.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            for (List<String> row : data) {
                pstmt.setString(1, row.get(0));
                pstmt.setString(2, row.get(1));
                pstmt.setString(3, row.get(2));
                pstmt.executeUpdate();
            }
        } catch (SQLException e) {
            e.printStackTrace();
            // 处理数据库错误
        }
    }
}

7.2 性能优化

在处理大量数据时,性能可能会成为一个问题。我们可以通过以下方式进行优化:

以下是一个批量插入的示例:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

public class DataInserter {

    public static void insertData(List<List<String>> data) {
        String sql = "INSERT INTO mytable (column1, column2, column3) VALUES (?, ?, ?)";

        try (Connection conn = DatabaseConnector.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            conn.setAutoCommit(false);

            for (List<String> row : data) {
                pstmt.setString(1, row.get(0));
                pstmt.setString(2, row.get(1));
                pstmt.setString(3, row.get(2));
                pstmt.addBatch();
            }

            pstmt.executeBatch();
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
            // 处理数据库错误
        }
    }
}

总结

本文详细介绍了如何使用Java将Excel文件上传并将数据导入数据库。我们首先介绍了Apache POI和JDBC的基本用法,然后通过Servlet和Spring Boot实现了文件上传功能。最后,我们讨论了错误处理和性能优化的方法。希望本文能帮助你更好地理解和应用这些技术。

推荐阅读:
  1. 将excel文件导入到数据库
  2. 将excel文件导入java的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

excel java

上一篇:java反射机制怎么实现

下一篇:java怎么通过TCP协议传输javabean对象

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》