杰瑞科技汇

Java导出Excel时如何选择路径?

Java导出Excel并选择保存路径

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

Java导出Excel时如何选择路径?-图1
(图片来源网络,侵删)

使用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();
    }
}

注意事项

  1. 依赖库:以上示例使用了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>
  2. 文件扩展名:确保用户选择的文件扩展名与实际格式匹配(.xlsx用于XSSFWorkbook,.xls用于HSSFWorkbook)

  3. 异常处理:在实际应用中,应添加更完善的异常处理逻辑

    Java导出Excel时如何选择路径?-图2
    (图片来源网络,侵删)
  4. 线程安全:在Swing应用中,文件操作应在事件调度线程(EDT)中执行或使用SwingWorker

  5. 用户反馈:提供适当的用户反馈,如进度条或成功/失败消息

根据你的应用类型(桌面应用、Web应用等)选择合适的实现方式。

Java导出Excel时如何选择路径?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇