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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:42:36