杰瑞科技汇

Java导出Excel时如何实现单元格换行?

Java 导出 Excel 实现换行

在 Java 中导出 Excel 时实现单元格内容换行,主要有以下几种方法:

Java导出Excel时如何实现单元格换行?-图1
(图片来源网络,侵删)

使用 Apache POI

Apache POI 是最常用的 Java 操作 Excel 的库,以下是实现换行的示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
public class ExcelExportWithLineBreak {
    public static void main(String[] args) throws Exception {
        // 创建工作簿
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Sheet1");
        // 创建行和单元格
        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);
        // 设置单元格内容(包含换行符)
        String text = "第一行\n第二行\n第三行";
        cell.setCellValue(text);
        // 设置换行
        CellStyle style = workbook.createCellStyle();
        style.setWrapText(true); // 设置自动换行
        cell.setCellStyle(style);
        // 调整行高以适应换行内容
        row.setHeightInPoints((text.split("\n").length) * sheet.getDefaultRowHeightInPoints());
        // 写入文件
        try (FileOutputStream out = new FileOutputStream("output.xlsx")) {
            workbook.write(out);
        }
        workbook.close();
    }
}

关键点:

  • setWrapText(true) 启用自动换行
  • 需要手动调整行高以显示所有换行内容
  • 换行符使用 \n

使用 EasyExcel

EasyExcel 是阿里巴巴开源的简化版 POI,实现方式类似:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import org.apache.poi.ss.usermodel.*;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
public class EasyExcelExportWithLineBreak {
    public static void main(String[] args) throws Exception {
        String fileName = "output.xlsx";
        // 创建写入样式
        WriteCellStyle writeCellStyle = new WriteCellStyle();
        writeCellStyle.setWrapped(true); // 设置自动换行
        // 准备数据
        List<List<String>> data = new ArrayList<>();
        List<String> row1 = new ArrayList<>();
        row1.add("第一行\n第二行\n第三行");
        data.add(row1);
        // 写入Excel
        EasyExcel.write(fileName, data.getClass())
                .sheet("Sheet1")
                .registerWriteHandler(new AbstractCellWriteHandler() {
                    @Override
                    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
                        if (cell != null) {
                            cell.setCellStyle(writeCellStyle);
                            // 调整行高
                            if (cell.getStringCellValue() != null) {
                                String[] lines = cell.getStringCellValue().split("\n");
                                Row row = cell.getRow();
                                row.setHeightInPoints(lines.length * writeSheetHolder.getSheet().getDefaultRowHeightInPoints());
                            }
                        }
                    }
                })
                .doWrite(data);
    }
}

使用 JXL (较老但简单)

import jxl.Workbook;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.Label;
import java.io.File;
import java.io.IOException;
public class JxlExportWithLineBreak {
    public static void main(String[] args) throws Exception {
        WritableWorkbook workbook = Workbook.createWorkbook(new File("output.xls"));
        WritableSheet sheet = workbook.createSheet("Sheet1", 0);
        // 创建换行样式
        WritableCellFormat wrapFormat = new WritableCellFormat();
        wrapFormat.setWrap(true);
        // 写入带换行的内容
        Label label = new Label(0, 0, "第一行\n第二行\n第三行", wrapFormat);
        sheet.addCell(label);
        // 调整行高
        sheet.setRowHeight(0, (sheet.getRowHeight(0) * 3));
        workbook.write();
        workbook.close();
    }
}

注意事项

  1. 行高调整:启用换行后,通常需要手动调整行高才能看到换行效果
  2. 列宽调整:有时也需要调整列宽以适应内容
  3. 不同版本差异:POI 的 HSSF(.xls) 和 XSSF(.xlsx) 处理方式略有不同
  4. 性能考虑:大数据量时,POI 的 XSSF 比 HSSF 更高效

高级技巧

如果需要更精确的控制换行,可以使用 CellUtil 类:

// 使用 CellUtil 设置样式
CellUtil.setCellStyleProperties(cell, Map.of(
    "wrap_text", true
));

或者使用 WorkbookHelper 工具类简化操作:

Java导出Excel时如何实现单元格换行?-图2
(图片来源网络,侵删)
// 假设有工具类
ExcelUtils.setWrapText(cell, true);
ExcelUtils.adjustRowHeightForWrapText(row, cell);

方法都可以实现 Java 导出 Excel 时的换行功能,选择哪种取决于你的具体需求和项目环境。

Java导出Excel时如何实现单元格换行?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇