洛瑟玛 2023-01-11 10:05 采纳率: 100%
浏览 16
已结题

POI获取twoCellAnchor下的ext对象失败

使用POI读取文本框高度时,获取不到该标签对象

如下是一个Excel的Drawing.xml的文件。

<xdr:twoCellAnchor>
        <xdr:from>
            <xdr:col>9</xdr:col>
            <xdr:colOff>449580</xdr:colOff>
            <xdr:row>1</xdr:row>
            <xdr:rowOff>160020</xdr:rowOff>
        </xdr:from>
        <xdr:to>
            <xdr:col>9</xdr:col>
            <xdr:colOff>2842260</xdr:colOff>
            <xdr:row>1</xdr:row>
            <xdr:rowOff>937260</xdr:rowOff>
        </xdr:to>
        <mc:AlternateContent
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
            <mc:Choice
                xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" Requires="a14">
                <xdr:sp>
                    <xdr:nvSpPr>
                        <xdr:cNvPr id="3" name="文本框 2"/>
                        <xdr:cNvSpPr txBox="1"/>
                    </xdr:nvSpPr>
                    <xdr:spPr>
                        <a:xfrm>
                            <a:off x="10035540" y="381000"/>
                            <a:ext cx="2392680" cy="777240"/>

正常情况下,a:ext cx="2392680" cy="777240"这些内容应该是可以获取到的,代码如下。

height = (short)((int)ctTwoCellAnchor2.getSp().getSpPr().getXfrm().getExt().getCy()

但是我现在在getSp的时候就空指针异常了,无法获取到sp这个对象,我猜想可能是由于mc:AlternateContent这个标签的原因,
但是网上关于mc:AlternateContent的资料很少,有没有人可以解答一下。

  • 写回答

1条回答 默认 最新

  • m0_54204465 2023-01-11 10:21
    关注

    POI是Apache下的一个开源项目,是一种用Java编写的库,可以用于读取和写入Microsoft Office格式的文件。你提到在使用POI读取文本框高度时,不能获取到xdr:twoCellAnchor下的<a:ext>对象,这可能是由于在xml文件中出现了"mc:AlternateContent"标签导致的,它会使得文档在不同应用程序中显示不同的内容。建议你可以通过检查代码并使用最新版本的POI来解决这个问题。举个例子, 你可以使用以下代码来访问文本框高度:

    import org.apache.poi.xssf.usermodel.*;
    
    XSSFWorkbook workbook = new XSSFWorkbook("path/to/workbook.xlsx");
    XSSFDrawing drawing = workbook.getSheetAt(0).createDrawingPatriarch();
    
    for (XSSFShape shape : drawing.getShapes()) {
        if (shape instanceof XSSFSimpleShape) {
            XSSFSimpleShape textbox = (XSSFSimpleShape) shape;
            int height = textbox.getHeight();
            System.out.println("Textbox height: " + height);
        }
    }
    
    

    代码首先创建了一个XSSFWorkbook对象并打开了一个名为"workbook.xlsx"的Excel文件。然后通过workbook.getSheetAt(0).createDrawingPatriarch(); 找到第一个sheet中的所有图形.
    接下来使用 for loop 遍历所有图形, 如果该图形是一个文本框,则将其强制转换为XSSFSimpleShape对象,最后调用 getHeight() 方法获取高度,并将其打印出来。

    注意,在这段代码中, 依然需要判断mc:AlternateContent是否存在,如果存在需要做特殊处理

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月9日
  • 已采纳回答 2月1日
  • 创建了问题 1月11日

悬赏问题

  • ¥20 创建taro项目,在vscode上能够写跨平台写微信小程序代码
  • ¥15 网站出现错误跳转问题
  • ¥15 Docker容器里已经安装了ssh,但打包迁移到新机器一直容器一直提示unrecognized service。
  • ¥15 综合布线实例设计,就好看好看不恐怖可好滤镜好聚
  • ¥15 使用moviepy库视频合并时出错
  • ¥30 FLUENT液固传质UDF
  • ¥15 怎么看梯度直方图以,怎么判断梯度消失/爆炸,怎么解决
  • ¥15 aspnetdll文件访问拒绝
  • ¥15 wpf中在模版中寻找元素
  • ¥15 MFC平台生成指定圆