Java 根据 Excel 模板生成 Excel 到指定目录

简介

在很多实际应用场景中,我们需要根据 Excel 模板生成新的 Excel 文件,并将其保存到指定的目录中。Java 提供了很多库可以帮助我们实现这个功能,本文将介绍一种常用的方法。

准备工作

在开始编写代码之前,我们需要先准备一些必要的工作:

  1. 确保已经安装了 Java 开发环境。
  2. 下载并引入相关的 Java Excel 库。这里我们使用 Apache POI,它是一个非常流行的 Java 库,用于操作 Microsoft Office 格式文件。

代码实现

首先,我们需要将 Excel 模板文件加载到内存中。假设我们有一个名为 template.xlsx 的 Excel 模板文件,代码如下:

FileInputStream file = new FileInputStream(new File("template.xlsx"));
Workbook workbook = WorkbookFactory.create(file);

接下来,我们可以根据模板创建一个新的 Excel 文件,并在其中填充数据。假设我们有一些数据需要填充到 Excel 中,代码如下:

Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
cell.setCellValue("Hello, World!");

在上述代码中,我们获取了第一个工作表(Sheet)和第一行(Row),并在第一个单元格(Cell)中填充了数据。

最后,我们需要将生成的 Excel 文件保存到指定的目录中。代码如下:

FileOutputStream fileOut = new FileOutputStream("output.xlsx");
workbook.write(fileOut);
fileOut.close();

上述代码将生成的 Excel 文件保存为 output.xlsx

综合以上代码,我们可以得到完整的实现:

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

import java.io.*;

public class ExcelGenerator {

    public static void main(String[] args) {
        try {
            FileInputStream file = new FileInputStream(new File("template.xlsx"));
            Workbook workbook = WorkbookFactory.create(file);

            Sheet sheet = workbook.getSheetAt(0);
            Row row = sheet.getRow(0);
            Cell cell = row.getCell(0);
            cell.setCellValue("Hello, World!");

            FileOutputStream fileOut = new FileOutputStream("output.xlsx");
            workbook.write(fileOut);
            fileOut.close();

            System.out.println("Excel 文件生成成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

序列图

下面是生成 Excel 文件的过程的序列图:

sequenceDiagram
    participant Client
    participant Server
    participant Excel

    Client->>Server: 请求生成 Excel 文件
    Server->>+Excel: 加载 Excel 模板
    Excel-->>-Server: 返回模板
    Server->>+Excel: 填充数据
    Excel-->>-Server: 返回填充后的 Excel
    Server->>+Excel: 保存 Excel 文件
    Excel-->>-Server: 返回保存结果
    Server->>Client: 返回 Excel 文件生成成功

饼状图

在实际应用中,我们可能需要根据数据生成饼状图,以更直观地展示数据分布。下面是生成饼状图的代码示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.WorkbookUtil;

import java.io.*;

public class PieChartExample {

    public static void main(String[] args) {
        try {
            Workbook workbook = new XSSFWorkbook();

            Sheet sheet = workbook.createSheet(WorkbookUtil.createSafeSheetName("Pie Chart"));

            // 创建数据
            Row headerRow = sheet.createRow(0);
            Cell headerCell = headerRow.createCell(0);
            headerCell.setCellValue("Category");

            Row dataRow = sheet.createRow(1);
            Cell dataCell = dataRow.createCell(0);
            dataCell.setCellValue("A");

            // 创建饼状图
            Drawing<?> drawing = sheet.createDrawingPatriarch();
            ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 2, 1, 10, 15);

            Chart chart = drawing.createChart(anchor);
            ChartLegend legend = chart.getOrCreateLegend();
            legend.setPosition(LegendPosition.RIGHT);

            PieChartData data = chart.getChartDataFactory().createPieChartData();

            ChartDataSource<String> category = DataSources.fromStringCellRange(sheet, new CellRangeAddress(1, 1, 0, 0));
            ChartDataSource<Number> values = DataSources.fromNumericCell