【问题标题】:Default cell type in OOXML spreadsheetOOXML 电子表格中的默认单元格类型
【发布时间】:2019-10-09 11:40:13
【问题描述】:

我收到了奇怪的 XLSX 文件 (OOXML)。这是其工作表的一些代码片段(xl/worksheets/sheet1.xml):

    <row r="2" spans="1:6" x14ac:dyDescent="0.25">
        <c r="A2" s="11" t="s">
            <v>33</v>
        </c>
        <c r="B2" s="10">
            <v>444</v>
        </c>
        <c r="C2" s="5"/>
        <c r="D2" s="12">
            <v>1</v>
        </c>
        <c r="E2" s="5"/>
        <c r="F2" s="3"/>
    </row>

注意第二个单元格 - 它没有 't' 属性。 根据ECMA-376(附件 A.2,第 3918 页,第 2301 行),单元格的默认类型(如果未提及)为“n”(数字):

<xsd:attribute name="t" type="ST_CellType" use="optional" default="n"/>

如果我尝试在Apache POI 中调用getCellType(),我会得到NUMERIC。没关系。

但是当我使用 LibreOffice 打开文件时,我看到单元格具有“文本”类型: 对此有什么解释吗?

PS。该文件由 MS Excel 生成

【问题讨论】:

  • 单元格类型和格式在 Excel 中是不同的东西!
  • @Gagravarr 你的意思是 getCellType() != Category(在图片上)吗?
  • Cell Type 是关于文件格式的存储,加上一堆可以/不能做的东西。单元格数据格式是关于如何将文件中的原始数字格式化为数字/日期/%/货币/等
  • 根据您显示的XML:在&lt;c r="B2" s="10"&gt; 中,属性s(样式索引)指向样式部分中的单元格样式,其数字格式设置为@(文本) .这意味着单元格使用数字格式文本进行格式化。这与属性t(单元格数据类型)无关。
  • @AxelRichter 谢谢你的回答,我发现字符串可以以数字格式存储

标签: java excel apache-poi openxml libreoffice-calc


【解决方案1】:

我解决了这个问题(感谢@AxelRichter 的评论)。

主要是字符串可以存储在NUMERIC类型的单元格。为此,使用了特殊的@ 格式。

这里是代码(Apache POI):

String fs = c.getCellStyle().getDataFormatString();
if (BuiltinFormats.getBuiltinFormat(fs)==49){
    String value = ((XSSFCell)c).getRawValue();
    //do something
}

Link to BuiltinFormats

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    相关资源
    最近更新 更多