Java导出Excel并选择保存路径
在Java中实现导出Excel文件并让用户选择保存路径的功能,通常需要结合Java Swing或JavaFX的文件选择对话框,以下是几种实现方式:

使用JFileChooser(Swing)
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelExportWithFileChooser {
public static void main(String[] args) {
// 创建主窗口
JFrame frame = new JFrame("Excel导出示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
// 创建导出按钮
JButton exportButton = new JButton("导出Excel");
exportButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 创建文件选择器
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("选择保存位置");
// 设置默认文件名
fileChooser.setSelectedFile(new File("导出数据.xlsx"));
// 显示保存对话框
int userSelection = fileChooser.showSaveDialog(frame);
if (userSelection == JFileChooser.APPROVE_OPTION) {
File fileToSave = fileChooser.getSelectedFile();
try {
// 创建Excel工作簿
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("数据");
// 创建标题行
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("姓名");
headerRow.createCell(1).setCellValue("年龄");
headerRow.createCell(2).setCellValue("部门");
// 创建数据行
Row dataRow = sheet.createRow(1);
dataRow.createCell(0).setCellValue("张三");
dataRow.createCell(1).setCellValue(25);
dataRow.createCell(2).setCellValue("技术部");
// 写入文件
FileOutputStream outputStream = new FileOutputStream(fileToSave);
workbook.write(outputStream);
workbook.close();
outputStream.close();
JOptionPane.showMessageDialog(frame, "Excel文件已成功保存到: " + fileToSave.getAbsolutePath());
} catch (Exception ex) {
JOptionPane.showMessageDialog(frame, "导出失败: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
}
}
});
// 添加按钮到窗口
frame.getContentPane().add(exportButton, BorderLayout.CENTER);
frame.setVisible(true);
}
}
使用JavaFX的FileChooser
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileOutputStream;
public class ExcelExportWithJavaFX extends Application {
@Override
public void start(Stage primaryStage) {
Button exportButton = new Button("导出Excel");
exportButton.setOnAction(e -> {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("选择保存位置");
fileChooser.setInitialFileName("导出数据.xlsx");
File file = fileChooser.showSaveDialog(primaryStage);
if (file != null) {
try {
// 创建Excel工作簿
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("数据");
// 创建标题行
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("姓名");
headerRow.createCell(1).setCellValue("年龄");
headerRow.createCell(2).setCellValue("部门");
// 创建数据行
Row dataRow = sheet.createRow(1);
dataRow.createCell(0).setCellValue("李四");
dataRow.createCell(1).setCellValue(30);
dataRow.createCell(2).setCellValue("市场部");
// 写入文件
FileOutputStream outputStream = new FileOutputStream(file);
workbook.write(outputStream);
workbook.close();
outputStream.close();
System.out.println("Excel文件已成功保存到: " + file.getAbsolutePath());
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
StackPane root = new StackPane();
root.getChildren().add(exportButton);
Scene scene = new Scene(root, 300, 200);
primaryStage.setTitle("Excel导出示例");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Web应用中的文件下载(Spring Boot示例)
如果是Web应用,通常通过浏览器下载文件:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
public class ExcelExportController {
@GetMapping("/export")
@ResponseBody
public void exportExcel(HttpServletResponse response) throws IOException {
// 设置响应头
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=export_data.xlsx");
// 创建Excel工作簿
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("数据");
// 创建标题行
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("姓名");
headerRow.createCell(1).setCellValue("年龄");
headerRow.createCell(2).setCellValue("部门");
// 创建数据行
Row dataRow = sheet.createRow(1);
dataRow.createCell(0).setCellValue("王五");
dataRow.createCell(1).setCellValue(28);
dataRow.createCell(2).setCellValue("财务部");
// 写入响应输出流
workbook.write(response.getOutputStream());
workbook.close();
}
}
注意事项
-
依赖库:以上示例使用了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> -
文件扩展名:确保用户选择的文件扩展名与实际格式匹配(.xlsx用于XSSFWorkbook,.xls用于HSSFWorkbook)
-
异常处理:在实际应用中,应添加更完善的异常处理逻辑
(图片来源网络,侵删) -
线程安全:在Swing应用中,文件操作应在事件调度线程(EDT)中执行或使用SwingWorker
-
用户反馈:提供适当的用户反馈,如进度条或成功/失败消息
根据你的应用类型(桌面应用、Web应用等)选择合适的实现方式。

