You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何输出带格式的Excel文档?含单元格颜色、宽度设置

关于Java导出带格式Excel的问题解答

首先直接给结论:CSV完全没办法支持富格式——说白了,CSV就是纯文本文件,只存数据内容,单元格颜色、列宽、字体样式这些格式信息根本没有对应的存储逻辑,哪怕你硬塞进去,Excel打开也只会当成普通文本内容,完全不会识别成格式。

所以要实现你要的非标准单元格颜色、自定义列宽,必须放弃CSV,改用真正的Excel格式(比如.xlsx),Java生态里有非常成熟的工具库可以搞定,给你推荐两个最常用的:

1. Apache POI

这是Java操作Office文档的老牌工具,功能全,能覆盖几乎所有Excel格式需求。举个简单的例子,实现设置列宽和单元格背景色:

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

import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelFormatDemo {
    public static void main(String[] args) throws IOException {
        // 创建工作簿和工作表
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("DemoSheet");

        // 设置列宽(第1列,单位是1/256个字符宽度)
        sheet.setColumnWidth(0, 20 * 256);

        // 创建单元格样式:设置背景色
        CellStyle style = workbook.createCellStyle();
        style.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 创建单元格并应用样式
        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);
        cell.setCellValue("带背景色的单元格");
        cell.setCellStyle(style);

        // 写入文件
        try (FileOutputStream fos = new FileOutputStream("formatted_excel.xlsx")) {
            workbook.write(fos);
        }
        workbook.close();
    }
}

2. EasyExcel

如果你的数据量比较大(比如几万行以上),Apache POI的内存占用会比较高,推荐用阿里开源的EasyExcel,它是基于POI做的优化,内存友好,API也更简洁。示例代码大概是这样:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.alibaba.excel.write.style.row.SimpleRowStyleStrategy;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.ArrayList;
import java.util.List;

public class EasyExcelDemo {
    // 定义数据类
    static class DemoData {
        private String content;

        public DemoData(String content) {
            this.content = content;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }
    }

    public static void main(String[] args) {
        String fileName = "easyexcel_formatted.xlsx";
        // 准备数据
        List<DemoData> data = new ArrayList<>();
        data.add(new DemoData("自定义列宽+背景色示例"));

        // 写入Excel,设置列宽自适应,自定义单元格样式
        EasyExcel.write(fileName, DemoData.class)
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 自适应列宽
                .registerWriteHandler(new SimpleRowStyleStrategy(
                        null, 
                        // 设置单元格背景色
                        createCellStyle(IndexedColors.LIGHT_BLUE.getIndex())
                ))
                .sheet("Sheet1")
                .doWrite(data);
    }

    private static CellStyle createCellStyle(short colorIndex) {
        Workbook workbook = new XSSFWorkbook();
        CellStyle style = workbook.createCellStyle();
        style.setFillForegroundColor(colorIndex);
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        return style;
    }
}

总结

  • 别再纠结CSV了,它天生就不是用来存格式的;
  • 选Apache POI还是EasyExcel,看你的数据量和功能需求:功能全选POI,大数据量选EasyExcel;
  • 两个库的官方文档都很详细,遇到特殊格式需求可以去查对应API。

内容的提问来源于stack exchange,提问作者badsoup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:05:13