Java中将Mysql数据导出到Excel

介绍

  • 将数据从一个系统导出到另一个系统是公司中非常常见的用例。
  • 在本文中,我们将构建一个逻辑,从 SQL 数据库导出数据并将其写入 Excel 文件,这可能对其他一些团队(如销售/营销团队)的运营有用。

表:

  • 我们将创建一个 NEWS_ARTICLES 表,其中包含新闻的所有数据。

CREATE TABLE `NEWS_ARTICLES` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(300) NOT NULL,
  `link` varchar(300) DEFAULT NULL,
  `image_url` varchar(300) DEFAULT NULL,
  `category` varchar(1000) DEFAULT NULL,
  `published_date` datetime NOT NULL,
  `create_timestamp` datetime NOT NULL,
  `update_timestamp` datetime NOT NULL,
  `provider` varchar(100) NOT NULL,
  `manual_tags` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8375 DEFAULT CHARSET=latin1;

客户端代码

  • 首先,我们在输入表 NEWS_ARTICLE 上执行 SQL 查询。此执行将返回 Resultset 对象。
  • 一旦我们有了 ResultSet,我们将调用 writeToSheet 方法,该方法的职责是读取 ResultSet 并写入 Excel 工作表。
  • 之后,我们创建了一个工作表来输出文件。

public class DataExport {

    private static String SELECT_QUERY = "select title, link from NEWS_ARTICLES";
    static NewsArticleDao newsArticleDao = new NewsArticleDao();
    static NewsArticleWriter newsArticleWriter = new NewsArticleWriter();

    public static void main(String[] args) throws SQLException, IOException {
        ResultSet newsArticles = newsArticleDao.getNewsArticles(SELECT_QUERY);

        newsArticleWriter.writeToSheet(newsArticles,
"daily_news_articles");

        FileOutputStream fileOutputStream = new FileOutputStream(new File(
"news_article_lists.xlsx"));
        newsArticleWriter.writeToFile(fileOutputStream);
    }
}

1、从MySQL导出数据

  • getNewsArticle 方法将sqlQuery作为参数,这定义了我们要在表上执行的查询。
  • 我们创建一个 JDBC Connection 对象,然后创建一个 Statement 对象,最后,executeQuery 将查询作为参数。
  • executeQuery 方法返回 ResultSet,其中包含针对表执行的查询的结果。

public class NewsArticleDao {

    public ResultSet getNewsArticles(String sqlQuery) throws SQLException {
        Connection connection = JDBCConnection.connect();
        Statement statement = connection.createStatement();
        return statement.executeQuery(sqlQuery);
    }
}


2、数据导出写入 Excel 工作表

  • 我们将使用名为Apache POI的第三方库来操作 Excel 文件。
  • 在 writeToSheet 方法中,我们首先创建一个工作表对象,然后迭代该工作表的 Resultset 和 createRow。

public class NewsArticleWriter {


    public void writeToSheet(ResultSet newsArticles, String sheetName) throws SQLException, IOException {
        XSSFSheet dailyNewsArticleSheet = ExcelUtils.createSheet(sheetName);
        int rowNumber = 0;
        while (newsArticles.next()) {
            createRow(newsArticles, dailyNewsArticleSheet, rowNumber);
            rowNumber++;
        }
    }

//我们对文章的标题和文章的链接感兴趣。我们还跟踪行号,以便我们为不同的行编写不同的文章。
    private void createRow(ResultSet newsArticles, XSSFSheet dailyNewsArticleSheet, int rowNumber) throws SQLException {
        String title = newsArticles.getString(
"title");
        String link = newsArticles.getString(
"link");

        Row row = dailyNewsArticleSheet.createRow(rowNumber);
        ExcelUtils.setRow(row,title,link);
    }

//现在,一旦我们的工作表准备就绪并且所有内容都已写入,那么我们最终可以将工作表写入输出文件。
    public void writeToFile(FileOutputStream out) throws IOException {
        ExcelUtils.write(out);
        out.close();
    }
}

  • 该项目可在GitHub上获取。