在使用 OpenXml 读取 XLSX 模板时如何获取与列相关的缺失“样式”属性?

问题描述 投票:0回答:1

目标是什么?

将数据从数据源(现在为“数据表”)提取到 xlsx 文件中。

到目前为止发生了什么?

  1. 创建了一个新的 XLSX 文件。添加了列,并且还设置了相同的列格式。现在该文件被用作模板。

  2. 使用“OpenXML”SDK,我可以将数据泵入此 Excel 模板。

  3. 打开文件后,我可以看到单元格格式不正确。

  4. 另一个项目有类似的代码。当我比较样式相关的 XML 时,发现缺少“style”属性。

请参阅以下内容(工作正常)

`<x:cols xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <x:col min="1" max="1" width="11.44140625" *style="27"* customWidth="1" />
    <x:col min="2" max="2" width="12.88671875" style="27" bestFit="1" customWidth="1" />
</x:cols>`

请参阅以下内容(工作的地方)

`<x:cols xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <x:col min="1" max="1" width="14" customWidth="1" />
    <x:col min="2" max="2" width="20.26171875" customWidth="1" />
    <x:col min="3" max="3" width="16.83984375" customWidth="1" />
    <x:col min="4" max="4" width="15" customWidth="1" />
</x:cols>`

没有款式信息。

再次查看 XLSX 文件。 我可以看到功能区和单元格中的格式。 XLSX 模板似乎存在一些问题。 我一直在阅读 http://officeopenxml.com/anatomyofOOXML-xlsx.php 以了解对象模型来对问题进行排序。

期待

我需要解决格式问题。看起来问题仅与 XLSX 模板有关。但不知道我在创建XLSX模板时缺少哪里。

openxml excel-2007 openxml-sdk
1个回答
0
投票

你的任务看起来像我的。

XML 在特定情况下定义样式
cell
(大多数情况下)

sheet__.xml
中,当
__
是数字时,您可以在
workbook.xml
中找到它,
xml
文件有一些子元素:

  • <sheetPr>
  • <dimension>
  • <sheetViews>
  • <cols>
  • <sheetData>
  • ...

<sheetData>
元素包含
<row>
元素,
<row>
内部是一些
<cell>

<cell>
看起来像:

<c r="E6" s="3">
    <v>10.0</v>
</c>

有一个属性

s
,在本例中等于
2

xl/styles.xml中定义的样式

xl/styles.xml
中,定义了一些样式,例如:

<styleSheet>
    <numFmts count="13"> ... </numFmts>
    <fonts count="64"> ... </font>
    <fills count="36"> ... </font>
    <borders count="15"> ... </borders>
    <cellStyleXfs count="65"> ... </cellStyleXfs>
    <cellXfs count="142"> 
        <xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
        <xf numFmtId="0" fontId="4" fillId="2" borderId="0" xfId="0" applyFont="1" applyFill="1" applyAlignment="1">
            <alignment horizontal="left" vertical="center"/>
        </xf>
        <xf numFmtId="183" fontId="4" fillId="0" borderId="1" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1">
            <alignment horizontal="left" vertical="center"/>
        </xf>
        ...
    </cellXfs>
    ...
</styleSheet>

这意味着什么:

您的单元格 E6 有

s="2"
,因此它将获取
third
列表中的
cellXfs
元素:

    <xf numFmtId="183" fontId="4" fillId="0" borderId="1" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1">
            <alignment horizontal="left" vertical="center"/>
    </xf>

因此,您的单元格的

numFmtId
索引应该为 0。
numFmts
标签定义每个使用的
formatCode
numFmtId

<numFmts count="13">
    ...
    <numFmt numFmtId="180" formatCode="yyyy/mm/dd"/>
    <numFmt numFmtId="181" formatCode="\:"/>
    <numFmt numFmtId="182" formatCode="#,##0_ ;[Red]\-#,##0\ "/>
    <numFmt numFmtId="183" formatCode="#0.00%"/>
    <numFmt numFmtId="184" formatCode="\¥#,##0"/>
</numFmts>
numFmt
之后的下一个样式是
fontId
。在这种情况下,它等于
0

fonts
标签看起来像:

<fonts count="64">
    <font>
        <sz val="9"/>
        <name val="Arial"/>
        <family val="3"/>
        <charset val="128"/>
    </font>
    <font>
        <sz val="9"/>
        <name val="Arial"/>
        <family val="3"/>
        <charset val="128"/>
    </font>
</fonts>

fontId=0
获取
<fonts>
标签中的第一个元素。所以你的细胞会有
size = 9, font name = Arial
...

您可以在c-rex找到更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.