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

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日

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd