java 实现excel样式设置(居中、字体、大小、换行、合并行,列宽、指定特定字符串样式等)

Excel表格美化:单元格合并与富文本样式
本文介绍如何使用Apache POI库在HSSFWorkbook和XSSFWorkbook中创建Excel工作簿,设置单元格样式,包括字体、对齐方式、边框和自动换行,重点讲解了如何合并单元格并应用特定字符串样式,如加粗和下划线。
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

HSSFWorkbook workbook = new HSSFWorkbook();

Sheet sheet = workbook.createSheet();
sheet.setColumnWidth(0, 30*256);//设置当前sheet页第一列宽度
sheet.setColumnWidth(1, 70*256);//第二列宽度

CellStyle style = workbook.createCellStyle();

Font font = workbook.createFont();
font.setFontHeightInPoints((short) 13);
font.setFontName("仿宋_GB2312");
style.setFont(font5);//增加字体样式

style.setAlignment(CellStyle.ALIGN_CENTER);//增加水平居中样式-old
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//增加垂直居中样式-old

style.setAlignment(HorizontalAlignment.CENTER);//增加水平居中样式
style.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);//增加垂直居中样式

//excle边框样式添加
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);

//自动换行样式增加
style.setWrapText(true);

Row row=sheet.getRow(0);//获取第一行
if(row==null){sheet.createRow(0);}
Cell cell=row.getCell(0);//获取第一个单元格
if(cell==null){row.createCell(0);}
cell.setCellStyle(style);//开始设置单元格样式 

//设置单元格合并
int startrow=1;
int endrow=1;
int startcol=0;
int endcol=0;
CellRangeAddress  region = new CellRangeAddress (startrow, endrow, startcol, endcol);
sheet.addMergedRegion(region);

---------------------------------指定部分字符串样式

String content="测试数据";

    Font font = workbook.createFont();
    font.setFontHeightInPoints((short) 13);
    font.setFontName("仿宋_GB2312");

    Font font2 = workbook.createFont();
    font2.setUnderline((byte)1);

    HSSFRichTextString hts = new HSSFRichTextString(content);
    int n = content.indexOf("测试");
    hts.applyFont(n, n + 2, font); //从第n位开始,n+2位字符设置字体样式
    hts.applyFont(1,4,font2);//第2位到第4位字符串下添加下划线
    cell.setCellValue(hts);

------------------------------

<think>我们之前已经提供了一个完整的示例代码来解决用户的问题:设置微软雅黑字体、加粗、垂直居中并自动换行。现在用户再次询问相同的问题,可能是希望得到更简洁的指导或者对某些细节的强调。 因此,我们将总结关键步骤,并提醒一些注意事项。 关键步骤: 1. 创建字体设置微软雅黑、加粗。 2. 创建单元格样式设置垂直居中(VerticalAlignment.CENTER)和水平居中(如果需要)以及自动换行(wrapText=true)。 3. 将字体应用到样式。 4. 将样式应用到单元格。 注意:在设置样式时,POI中单元格样式是作用在单元格上的,所以需要为不同样式创建不同的样式对象(避免样式覆盖)。 另外,用户可能关心的是如何确保垂直居中。在之前的代码中,我们使用了: style.setVerticalAlignment(VerticalAlignment.CENTER); 下面我们给出一个更简洁的示例代码片段,只展示如何创建一个同时满足以下条件的样式: - 字体:微软雅黑 - 加粗 - 垂直居中 - 自动换行 同时,我们注意到用户之前的问题中有一个引用[1]提到设置样式的一个坑:不要直接修改已有的CellStyle,因为它是共享的,修改会影响到所有使用这个样式的单元格。因此,我们应该创建新的样式。 代码片段: ```java // 创建加粗、微软雅黑字体、垂直居中、自动换行样式 private static XSSFCellStyle createBoldCenteredWrapStyle(XSSFWorkbook workbook) { // 创建字体 XSSFFont font = workbook.createFont(); font.setFontName("微软雅黑"); font.setBold(true); font.setFontHeightInPoints((short) 12); // 创建样式 XSSFCellStyle style = workbook.createCellStyle(); style.setFont(font); // 水平居中(可选,用户可能需要水平居中,如果不需要可以去掉或改为左对齐) style.setAlignment(HorizontalAlignment.CENTER); // 垂直居中 style.setVerticalAlignment(VerticalAlignment.CENTER); // 自动换行 style.setWrapText(true); return style; } ``` 使用这个样式: ```java // 在创建单元格后 XSSFCell cell = row.createCell(0); cell.setCellValue("这是一个长文本,将自动换行并且垂直居中字体为微软雅黑加粗"); cell.setCellStyle(createBoldCenteredWrapStyle(workbook)); ``` 注意事项: 1. 和行高:自动换行需要足够的和行高才能显示出来,否则可能显示为####。因此,可能需要设置和行高。 2. 样式复用:如果需要多次使用相同的样式,应该只创建一次并复用,避免创建过多的样式对象(Excel样式数量限制)。 3. 跨平台字体:如果需要在非Windows系统上运行,考虑使用备用字体(如前面提到的跨平台解决方案)。 另外,关于引用[1]中提到的坑:修改样式时不要直接使用cell.getCellStyle(),因为这样会获取到工作簿中共享的样式,修改它会影响到所有使用该样式的单元格。正确做法是创建一个新的样式,然后设置给单元格。 例如,错误做法: ```java CellStyle style = cell.getCellStyle(); // 这样获取的是共享样式 Font font = workbook.getFontAt(style.getFontIndex()); font.setColor(IndexedColors.RED.getIndex()); // ... 这样修改会影响其他单元格 ``` 正确做法: ```java CellStyle oldStyle = cell.getCellStyle(); CellStyle newStyle = workbook.createCellStyle(); newStyle.cloneStyleFrom(oldStyle); // 克隆旧样式 // 然后修改新样式 Font font = workbook.createFont(); // 设置字体的属性(包括颜色) font.setColor(IndexedColors.RED.getIndex()); newStyle.setFont(font); cell.setCellStyle(newStyle); ``` 因此,在我们的示例中,我们都是创建新的样式。 如果用户需要在一个单元格中设置部分文本为红色,部分为黑色,则需要使用RichTextString,并且不能通过设置整个单元格的样式实现,而是使用RichTextString来组不同样式的文本。 但是,这个问题不在当前需求内,我们只是提及。 最后,生成相关问题: 根据当前主题(POI设置样式)和用户可能遇到的后续问题,我们生成以下相关问题: §§相关问题§§ 1. 如何在Java POI中设置Excel单元格的部分文本样式(如部分文字加粗、变色)? 2. 如何在Java POI中设置单元格的背景颜色和边框样式? 3. 使用POI导出Excel时如何避免内存溢出(OOM)? </think># Java POI设置微软雅黑字体、加粗、垂直居中并自动换行Java POI中设置Excel单元格的微软雅黑字体、加粗、垂直居中并自动换行,需要综使用字体设置和单元格样式。以下是完整实现代码: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; import java.io.FileOutputStream; public class ExcelStyler { public static void main(String[] args) throws Exception { try (Workbook workbook = new XSSFWorkbook()) { Sheet sheet = workbook.createSheet("样式示例"); // 创建样式:微软雅黑、加粗、垂直居中、自动换行 CellStyle style = createStyledCellStyle(workbook); // 创建示例行 Row row = sheet.createRow(0); // 创建示例单元格(包含长文本) Cell cell = row.createCell(0); cell.setCellValue("这是一段需要自动换行的长文本,使用微软雅黑字体,加粗并垂直居中显示。" + "当文本长度超过单元格度时,会自动换行显示在下一行。" + "Java POI提供了丰富的API来控制单元格的各种样式。"); cell.setCellStyle(style); // 设置和行高以显示换行效果 sheet.setColumnWidth(0, 30 * 256); // 30个字符度 row.setHeightInPoints(150); // 设置行高为150磅 // 保存文件 try (FileOutputStream out = new FileOutputStream("StyledExcel.xlsx")) { workbook.write(out); System.out.println("Excel文件生成成功!"); } } } // 创建单元格样式:微软雅黑、加粗、垂直居中、自动换行 private static CellStyle createStyledCellStyle(Workbook workbook) { // 创建字体样式 Font font = workbook.createFont(); font.setFontName(getSafeFontName()); // 设置微软雅黑字体(跨平台) font.setBold(true); // 设置加粗 font.setFontHeightInPoints((short) 12); // 设置字号 // 创建单元格样式 CellStyle style = workbook.createCellStyle(); style.setFont(font); // 应用字体 style.setAlignment(HorizontalAlignment.LEFT); // 水平左对齐 style.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中 style.setWrapText(true); // 启用自动换行 // 可选:设置边框 style.setBorderTop(BorderStyle.THIN); style.setBorderRight(BorderStyle.THIN); style.setBorderBottom(BorderStyle.THIN); style.setBorderLeft(BorderStyle.THIN); return style; } // 跨平台安全字体设置 private static String getSafeFontName() { String os = System.getProperty("os.name").toLowerCase(); if (os.contains("win")) { return "微软雅黑"; // Windows系统 } else if (os.contains("mac")) { return "PingFang SC"; // macOS系统 } else { return "Noto Sans CJK SC"; // Linux及其他系统 } } } ``` ## 关键技术点解析 ### 1. 字体设置(微软雅黑 & 加粗) ```java Font font = workbook.createFont(); font.setFontName("微软雅黑"); // 设置字体 font.setBold(true); // 启用加粗 ``` ### 2. 垂直居中 ```java style.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中 ``` ### 3. 自动换行 ```java style.setWrapText(true); // 启用自动换行 ``` ### 4. 跨平台字体解决方案 ```java private static String getSafeFontName() { String os = System.getProperty("os.name").toLowerCase(); if (os.contains("win")) { return "微软雅黑"; } else if (os.contains("mac")) { return "PingFang SC"; } else { return "Noto Sans CJK SC"; } } ``` ### 5. 行高设置 ```java sheet.setColumnWidth(0, 30 * 256); // 256为Excel单位 row.setHeightInPoints(150); // 设置行高为150磅 ``` ## 样式复用注意事项 在POI中创建单元格样式时需要注意: - **避免直接修改已有样式**:直接修改`cell.getCellStyle()`会影响所有使用该样式的单元格[^1] - **正确做法是创建新样式**: ```java // 正确做法:创建新样式并应用到单元格 CellStyle newStyle = workbook.createCellStyle(); newStyle.cloneStyleFrom(existingStyle); // 复制原有样式 // 修改新样式... cell.setCellStyle(newStyle); ``` ## 效果说明 1. **微软雅黑字体**:跨平台兼容方案确保不同系统正常显示 2. **加粗**:字体加粗显示,突出重要内容 3. **垂直居中**:文本在单元格垂直方向居中显示 4. **自动换行**:长文本根据自动换行显示 5. **边框设置**:可选添加单元格边框使内容更清晰
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间 流逝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值