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
相关产品推荐
相关产品推荐

