java 中将数据库查询出的数据导成excel并邮件发送
时间: 2024-10-12 18:05:34 浏览: 33
在Java中,将数据库查询结果转换为Excel文件并作为附件通过邮件发送通常涉及以下几个步骤:
1. **连接数据库**:首先,你需要使用JDBC (Java Database Connectivity) 连接到你的数据库,比如使用`java.sql.Connection`和`java.sql.Statement`或者更现代的`java.sql.ResultSet`。
```java
Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
```
2. **读取数据到模型类**:假设你有一个`User`类对应数据库中的用户信息,将查询结果映射到这个类的对象列表。
```java
List<User> users = new ArrayList<>();
while (rs.next()) {
User user = new User(rs.getInt("id"), rs.getString("name"));
users.add(user);
}
```
3. **转换为Excel**:使用Apache POI库(`pom.xml`里添加依赖`<dependency>org.apache.poi</dependency>`),将数据写入`HSSFWorkbook`,创建一个新的工作表。
```java
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Users");
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("ID");
headerRow.createCell(1).setCellValue("Name");
for (User user : users) {
Row dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
dataRow.createCell(0).setCellValue(user.getId());
dataRow.createCell(1).setCellValue(user.getName());
}
```
4. **保存为文件**:将工作簿保存为Excel文件。
```java
FileOutputStream outputStream = new FileOutputStream(new File("users.xlsx"));
workbook.write(outputStream);
outputStream.close();
```
5. **发送邮件**:使用JavaMail API发送包含Excel文件的邮件。这里是一个简单的示例,需要替换实际的发件人、收件人和邮件内容等。
```java
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.example.com");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() { ... });
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("sender@example.com"));
message.setTo(new InternetAddress("recipient@example.com"));
message.setSubject("Users Report");
Multipart multipart = new MimeMultipart();
BodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource("users.xlsx");
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName("users.xlsx");
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
Transport.send(message);
```
阅读全文