Java excel子表数据导出
时间: 2025-06-20 13:46:29 浏览: 15
### Java 实现 Excel 子表数据导出
在 Java 中实现 Excel 子表(Sheet)的数据导出可以通过多种库完成,比如 Apache POI、JXLS 和 EasyExcel。以下是基于这些工具的解决方案。
#### 使用 Apache POI 导出多个子表
Apache POI 是最常用的 Java 库之一,用于处理 Microsoft Office 文件格式。以下是一个简单的示例代码,展示如何创建带有多个子表的工作簿并填充数据:
```java
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MultiSheetExportExample {
public static void main(String[] args) throws IOException {
Workbook workbook = new XSSFWorkbook(); // 创建工作簿对象
List<String[]> data1 = getDataForSheet1();
createSheet(workbook, "Sheet1", data1); // 添加第一个子表及其数据
List<String[]> data2 = getDataForSheet2();
createSheet(workbook, "Sheet2", data2); // 添加第二个子表及其数据
try (FileOutputStream fileOut = new FileOutputStream("workbook.xlsx")) { // 输出到文件
workbook.write(fileOut);
}
workbook.close(); // 关闭工作簿资源
}
private static void createSheet(Workbook workbook, String sheetName, List<String[]> data) {
Sheet sheet = workbook.createSheet(sheetName); // 创建子表
int rowNum = 0;
for (String[] rowData : data) {
Row row = sheet.createRow(rowNum++); // 创建行
for (int colNum = 0; colNum < rowData.length; colNum++) {
Cell cell = row.createCell(colNum); // 创建单元格
cell.setCellValue(rowData[colNum]); // 设置单元格值
}
}
}
private static List<String[]> getDataForSheet1() {
List<String[]> data = new ArrayList<>();
data.add(new String[]{"ID", "Name"});
data.add(new String[]{"1", "Alice"});
data.add(new String[]{"2", "Bob"});
return data;
}
private static List<String[]> getDataForSheet2() {
List<String[]> data = new ArrayList<>();
data.add(new String[]{"Product", "Price"});
data.add(new String[]{"Apple", "$1.50"});
data.add(new String[]{"Banana", "$0.75"});
return data;
}
}
```
上述代码展示了如何使用 Apache POI 创建两个不同的子表 `Sheet1` 和 `Sheet2` 并分别填入不同结构的数据[^1]。
---
#### 使用 JXLS 导出带模板的多子表
如果希望简化开发流程,可以考虑使用 JXLS 来生成复杂的 Excel 报告。它支持通过模板定义样式和布局,从而减少手动编码量。以下是一个基本示例:
```xml
<!-- Maven Dependency -->
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-core</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>1.0.9</version>
</dependency>
```
假设我们有一个名为 `template.xls` 的模板文件,其中预设了两页子表的内容占位符,则可通过如下方式加载数据并生成最终文档:
```java
import org.jxls.common.Context;
import org.jxls.transform.Transformer;
import org.jxls.util.JxlsHelper;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
public class JxlsMultiSheetExample {
public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream("template.xls");
Transformer transformer = JxlsHelper.getInstance().createTransformer(is);
Map<String, Object> beans = getBeans();
Context context = new Context();
context.putVar("dataMap", beans);
JxlsHelper.getInstance().processTemplate(context, transformer);
File outputFile = new File("output_jxls.xls");
try (FileOutputStream os = new FileOutputStream(outputFile)) {
transformer.write(os);
} finally {
transformer.close();
}
}
private static Map<String, Object> getBeans() {
Map<String, Object> map = new HashMap<>();
List<Map<String, String>> list1 = new ArrayList<>();
list1.add(Map.of("id", "1", "name", "John"));
list1.add(Map.of("id", "2", "name", "Jane"));
List<Map<String, String>> list2 = new ArrayList<>();
list2.add(Map.of("product", "Laptop", "price", "1000"));
list2.add(Map.of("product", "Mouse", "price", "25"));
map.put("sheet1_data", list1);
map.put("sheet2_data", list2);
return map;
}
}
```
此方法允许开发者专注于业务逻辑而非底层细节[^2]。
---
#### 使用 EasyExcel 进行高效的大规模数据导出
对于大规模数据场景下的性能优化需求,推荐使用 Alibaba 提供的 EasyExcel 工具包。其设计目标就是解决大数据量情况下的内存占用过高问题。下面是利用该库向单个工作簿内的多个子表写入大量记录的一个例子:
```java
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import java.util.ArrayList;
import java.util.List;
public class EasyExcelMultiSheetExample {
public static void main(String[] args) {
String fileName = "easy_excel_output.xlsx";
try (ExcelWriter writer = EasyExcel.write(fileName).build()) {
writeSheet(writer, "Users", generateUserData());
writeSheet(writer, "Products", generateProductData());
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
private static void writeSheet(ExcelWriter writer, String sheetName, List<? extends BaseRowModel> dataList) {
Sheet sheet = new Sheet(1, 0, null);
sheet.setSheetName(sheetName);
writer.write(dataList, sheet);
}
private static List<UserData> generateUserData() {
List<UserData> users = new ArrayList<>();
for (int i = 1; i <= 100_000; i++) {
UserData user = new UserData();
user.setId(i);
user.setName("User_" + i);
users.add(user);
}
return users;
}
private static List<ProductData> generateProductData() {
List<ProductData> products = new ArrayList<>();
for (int i = 1; i <= 50_000; i++) {
ProductData product = new ProductData();
product.setCode("P" + i);
product.setDescription("Description of P" + i);
products.add(product);
}
return products;
}
}
class UserData extends BaseRowModel {
private Integer id;
private String name;
// Getters and Setters omitted for brevity.
}
class ProductData extends BaseRowModel {
private String code;
private String description;
// Getters and Setters omitted for brevity.
}
```
注意:EasyExcel 需要提前配置好项目中的依赖项,并确保模型类继承自 `BaseRowModel` 或者实现了相应的接口[^4]。
---
阅读全文
相关推荐


















