Java生成Excel报表如何设置表头加粗、单元格缩进、价格列右对齐
解决方案
基于Apache POI的CellStyle样式机制即可实现你的三类格式需求,修改后的代码如下:
完整修改后代码
import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.xssf.usermodel.*; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.util.UUID; private static final String CONTENT_TYPE = "multipart/form-data"; private static final String FILE_NAME = "DemoReport"; private static final String FILE_EXTENSION = ".xlsx"; // 按需调整缩进字符数 private static final short INDENTION_NUM = 2; // 替换为你实际的价格列索引(从0开始计数) private static final int PRICE_COLUMN_INDEX = 3; public MultipartFile export(final UUID uuid) throws IOException { final XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("Report"); int rowCount = 0; // ========== 新增:预定义全局单元格样式 ========== // 表头加粗字体 XSSFFont headerFont = workbook.createFont(); headerFont.setBold(true); // 表头样式:加粗 + 缩进 XSSFCellStyle headerStyle = workbook.createCellStyle(); headerStyle.setFont(headerFont); headerStyle.setIndention(INDENTION_NUM); // 普通内容样式:缩进 + 默认左对齐 XSSFCellStyle commonStyle = workbook.createCellStyle(); commonStyle.setIndention(INDENTION_NUM); // 价格列样式:缩进 + 右对齐 XSSFCellStyle priceStyle = workbook.createCellStyle(); priceStyle.setIndention(INDENTION_NUM); priceStyle.setAlignment(HorizontalAlignment.RIGHT); // POI 3.x旧版本请替换为下方写法 // priceStyle.setAlignment(CellStyle.ALIGN_RIGHT); // ============================================== // 写入表头并应用样式 XSSFRow headerRow = sheet.createRow(rowCount++); writeTitles(headerRow, titles); for (XSSFCell cell : headerRow) { cell.setCellStyle(headerStyle); } // ========== 新增:数据行写入时应用对应样式 ========== // 以下替换你原来省略的写入数据逻辑 // for (你的业务数据对象 item : 数据列表) { // XSSFRow dataRow = sheet.createRow(rowCount++); // int colIndex = 0; // // 普通列写入 // XSSFCell commonCell = dataRow.createCell(colIndex++); // commonCell.setCellValue(item.getXXX()); // commonCell.setCellStyle(commonStyle); // // 其他普通列重复上述逻辑... // // // 价格列写入 // XSSFCell priceCell = dataRow.createCell(PRICE_COLUMN_INDEX); // priceCell.setCellValue(item.getPrice()); // priceCell.setCellStyle(priceStyle); // } // ============================================== final File outputFile = File.createTempFile(FILE_NAME, FILE_EXTENSION); try (FileOutputStream outputStream = new FileOutputStream(outputFile)) { workbook.write(outputStream); } catch (IOException e) { LoggingUtils.error("error... ", e); } final FileInputStream input = new FileInputStream(outputFile); final String fileName = FILE_NAME.concat(FILE_EXTENSION); return new MockMultipartFile(fileName, fileName, CONTENT_TYPE, IOUtils.toByteArray(input)); }
注意事项
- 样式必须全局预定义,不要在循环写数据时反复创建,避免触发POI的样式数量上限报错
- 可按需调整
INDENTION_NUM缩进值、PRICE_COLUMN_INDEX价格列索引适配业务需求
内容的提问来源于stack exchange,提问作者user16409822
相关产品推荐
相关产品推荐

