如何用Java把查询出的内容导出到Excel表格?

如何用Java把查询出的内容导出到Excel表格

比如说我查询到了数据库的一些数据,想要把这些数据有组织的导出到一个excel文件里面,应该怎么实现?

阅读 1.4k
avatarAI BotBETA

你可以使用 Apache POI 库来创建和修改 Excel 文件。以下是一个简单的例子,它将查询到的数据写入到 Excel 文件中:

import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

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

public class ExportToExcel {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String user = "root";
        String password = "password";
        String query = "SELECT * FROM mytable";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(query)) {

            Workbook workbook = new XSSFWorkbook();
            Sheet sheet = workbook.createSheet("Data");
            int rowNum = 0;

            while (rs != null && rs.next()) {
                Row row = sheet.createRow(rowNum++);
                int colNum = 0;

                for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
                    Cell cell = row.createCell(colNum++);
                    cell.setCellValue(rs.getString(i));
                }
            }

            try (FileOutputStream outputStream = new FileOutputStream("data.xlsx")) {
                workbook.write(outputStream);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们首先创建一个 Workbook 对象和一个 Sheet 对象。然后,我们遍历查询结果,为每一行创建一个 Row 对象,并为每个单元格创建一个 Cell 对象。最后,我们将工作簿写入到一个名为 "data.xlsx" 的文件中。在执行这个代码之前,你需要确保你的项目中包含了 Apache POI 的库。你可以通过 Maven 或者 Gradle 来添加这个依赖。

2 个回答

先导入POI相关的第三方jar包

<!-- 使用apache poi需要的依赖  -->
 <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi</artifactId>
       <version>4.0.1</version>
 </dependency>
 <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi-ooxml</artifactId>
       <version>4.0.1</version>
 </dependency>
 <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.19</version>
</dependency>
<!-- 使用druid连接池建立java程序与mysql数据库的连接需要的依赖  -->
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.26</version>
</dependency>
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <version>1.0.9</version>
</dependency>

向Excel写入文件

package excelTest;

import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 使用poi将数据写入excel文件中
 */
public class WriteExcelTest {
    public static void main(String[] args) {

        XSSFWorkbook xssfWorkbook = null;
        FileOutputStream out = null;
        try {
            //创建工作簿
            xssfWorkbook = new XSSFWorkbook();
            //创建表
            XSSFSheet xssfSheet = xssfWorkbook.createSheet("first_sheet");
            //创建行,这里创建四行
            XSSFRow row1 = xssfSheet.createRow(0);
            XSSFRow row2 = xssfSheet.createRow(1);
            XSSFRow row3 = xssfSheet.createRow(2);
            XSSFRow row4 = xssfSheet.createRow(3);
            //为第一行创建单元格并赋值
            row1.createCell(0).setCellValue("姓名");
            row1.createCell(1).setCellValue("年龄");
            row1.createCell(2).setCellValue("性别");
            //为第二行创建单元格并赋值
            row2.createCell(0).setCellValue("张三");
            row2.createCell(1).setCellValue("18");
            row2.createCell(2).setCellValue("男");
            //为第三行创建单元格并赋值
            row3.createCell(0).setCellValue("李四");
            row3.createCell(1).setCellValue("17");
            row3.createCell(2).setCellValue("男");
            //为第四行创建单元格并赋值
            row4.createCell(0).setCellValue("黄蓉");
            row4.createCell(1).setCellValue("20");
            row4.createCell(2).setCellValue("女");
            //创建一个输出流
            out = new FileOutputStream("D:/output.xlsx");
            //将创建的工作簿内容写入磁盘
            xssfWorkbook.write(out);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭资源,需做非空判断
                if (out != null) {
                    out.close();
                }
                if (xssfWorkbook != null) {
                    xssfWorkbook.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("输出成功!");
    }
}

具体不知道是如何把数据查询出来的,通常可以通过循环来把数据设置到Excel上。
下面是通过循环设置数据的方法,其基于GcExcel的API,可以给特定的单元格设值。

public void LoopSetValue() {
    Workbook wb = new Workbook();
    IWorksheet sheet = wb.getWorksheets().get(0);
    int val = 1;
    for (int row = 0; row < 10; row++) {
        for (int col = 0; col < 10; col++) {
            sheet.getRange(row, col).setValue(val);
            val++;
        }
    }
    wb.save("output/loopSetValue.xlsx");
}

导出后结果如图:
image.png
另外,GcExcel 支持直接将二维数组设置到一片区域上,这样就无需在使用二重循环,同时执行速度上,也更快。

public void SetArrayToRange() {
    Workbook wb = new Workbook();
    IWorksheet sheet = wb.getWorksheets().get(0);
    Object[][] data = new Object[][]{
            {"Name", "City", "Birthday", "Eye color", "Weight", "Height"},
            {"Richard", "New York", new GregorianCalendar(1968, 5, 8), "Blue", 67, 165},
            {"Nia", "New York", new GregorianCalendar(1972, 6, 3), "Brown", 62, 134},
            {"Jared", "New York", new GregorianCalendar(1964, 2, 2), "Hazel", 72, 180},
            {"Natalie", "Washington", new GregorianCalendar(1972, 7, 8), "Blue", 66, 163},
            {"Damon", "Washington", new GregorianCalendar(1986, 1, 2), "Hazel", 76, 176},
            {"Angela", "Washington", new GregorianCalendar(1993, 1, 15), "Brown", 68, 145}
    };

    sheet.getRange(0, 0, data.length, data[0].length).setValue((Object) data);
    wb.save("output/SetArrayToRange.xlsx");
}

结果如下:
image.png
更多的Excel读取和设置,可以参考GcExcel的区域操作:GcExcel Java 在线Demo | 区域操作

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题