如何在Apache POI的XSLFTable单元格添加对应百分比宽度的圆角矩形
实现XSLFTable单元格内文本下方的百分比圆角矩形
要在XSLFTable第一列文本下方添加对应第二列百分比宽度的圆角矩形,核心是给单元格添加形状并根据百分比动态计算宽度,以下是完整的实现代码:
import org.apache.poi.sl.usermodel.* import org.apache.poi.xslf.usermodel.* import java.awt.Rectangle import java.io.FileOutputStream fun main() { val pptx = XMLSlideShow() val slide = pptx.createSlide() val tbl = slide.createTable() tbl.anchor = Rectangle(10, 90, 200, 150) // 修正列宽设置:第一列150,第二列50 tbl.setColumnWidth(0, 150.0) tbl.setColumnWidth(1, 50.0) // 工具方法:解析百分比字符串为小数(如"8.3%" → 0.083) fun parsePercentage(percentStr: String): Double { return percentStr.replace("%", "").toDouble() / 100.0 } // 工具方法:给单元格添加文本下方的圆角进度条 fun addProgressBar(cell: XSLFTableCell, percent: Double, columnWidth: Double) { val cellAnchor = cell.anchor // 计算进度条宽度:列宽 × 百分比 val barWidth = columnWidth * percent // 进度条的位置:文本下方,这里假设文本高度约20,可根据实际调整 val barAnchor = Rectangle( cellAnchor.x + 5, // 左边距5 cellAnchor.y + 25, // 文本下方偏移25 barWidth.toInt(), 10 // 进度条高度 ) // 创建圆角矩形形状 val shape = cell.createShape(barAnchor) as XSLFAutoShape shape.shapeType = ShapeType.ROUND_RECTANGLE // 设置圆角半径(可调整) shape.setRoundRectArc(10, 10) // 设置填充颜色(浅蓝色) shape.fillColor = java.awt.Color(180, 220, 255) // 移除边框 shape.lineWidth = 0.0 } // 第一行数据 val tr1 = tbl.addRow() val td1 = tr1.addCell() val td2 = tr1.addCell() val textRun1 = td1.addNewTextParagraph().addNewTextRun() textRun1.setText("Option 1") val percentStr1 = "8.3%" val textRun2 = td2.addNewTextParagraph().addNewTextRun() textRun2.setText(percentStr1) // 添加进度条 addProgressBar(td1, parsePercentage(percentStr1), 150.0) // 第三行数据(修正原代码的文本赋值错误) val tr3 = tbl.addRow() val td3 = tr3.addCell() val td4 = tr3.addCell() val textRun3 = td3.addNewTextParagraph().addNewTextRun() textRun3.setText("Option 3") val percentStr3 = "51.9%" val textRun4 = td4.addNewTextParagraph().addNewTextRun() textRun4.setText(percentStr3) textRun4.isBold = true // 添加进度条 addProgressBar(td3, parsePercentage(percentStr3), 150.0) // 输出文件 FileOutputStream("table_with_progress.pptx").use { pptx.write(it) } pptx.close() }
关键说明:
- 百分比解析:通过
parsePercentage方法将百分比字符串转换为小数,用于计算矩形宽度。 - 形状创建:在单元格内创建
ROUND_RECTANGLE形状,通过setRoundRectArc设置圆角半径。 - 位置与尺寸计算:根据单元格锚点确定矩形的位置,宽度为第一列宽度乘以百分比值,高度和偏移量可根据文本大小调整。
- 样式设置:给矩形设置填充色并移除边框,让进度条更美观。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

