【问题标题】:Add stylesheet to openxml excel file将样式表添加到 openxml excel 文件
【发布时间】:2023-03-15 07:40:02
【问题描述】:

我正在尝试在 Excel 文件中插入一些样式。现在数据部分工作得很好,但是当我打开 excel 时样式会引发错误。它抱怨样式表文件在 xml 的第 19 行有错误。我不知道那条线有什么问题。这是字体收集节点开始的地方。 任何想法为什么... 这是样式的xml

<?xml version="1.0" encoding="utf-8"?>
<x:styleSheet xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" mc:Ignorable="x14ac">
    <x:borders count="1">
        <x:border>
            <x:left style="thin">
                <x:color indexed="64" rgb="000000" />
            </x:left>
            <x:right style="thin">
                <x:color indexed="64" rgb="000000" />
            </x:right>
            <x:top style="thin">
                <x:color indexed="64" rgb="000000" />
            </x:top>
            <x:bottom style="thin">
                <x:color indexed="64" rgb="000000" />
            </x:bottom>
        </x:border>
    </x:borders>
    <x:fonts count="1">
        <x:font>
            <x:b />
            <x:sz val="12" />
            <x:color rgb="000000" />
            <x:name val="Arial" />
        </x:font>
    </x:fonts>
    <x:cellXfs>
        <x:xf fontId="0" borderId="0" applyFont="1" applyBorder="1" />
        <x:xf fontId="0" borderId="0" applyFont="1" applyBorder="1" />
        <x:xf fontId="0" borderId="0" applyFont="1" applyBorder="1" />
        <x:xf fontId="0" borderId="0" applyFont="1" applyBorder="1" />
        <x:xf fontId="0" borderId="0" applyFont="1" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf fontId="0" borderId="0" applyFont="1" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf fontId="0" borderId="0" applyFont="1" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf fontId="0" borderId="0" applyFont="1" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf fontId="0" borderId="0" applyFont="1" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf fontId="0" borderId="0" applyFont="1" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf fontId="0" borderId="0" applyFont="1" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
        <x:xf borderId="0" applyBorder="1" />
    </x:cellXfs>
</x:styleSheet>

更新

经过一些测试、谷歌搜索、头部撞击......我想出了以下样式表 xml

<?xml version="1.0" encoding="utf-8"?>
<x:styleSheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:x16r2="http://schemas.microsoft.com/office/spreadsheetml/2015/02/main" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" mc:Ignorable="x14ac x16r2 xr">
    <x:fonts count="2" x14ac:knownFonts="1">
        <x:font />
        <x:font>
            <x:b />
            <x:sz val="12" />
            <x:color rgb="FF000000" />
            <x:name val="Arial" />
            <x:family val="2" />
            <x:scheme val="minor" />
        </x:font>
    </x:fonts>
    <x:borders count="2">
        <x:border />
        <x:border>
            <x:left style="thin">
                <x:color rgb="FF000000" />
            </x:left>
            <x:right style="thin">
                <x:color rgb="FF000000" />
            </x:right>
            <x:top style="thin">
                <x:color rgb="FF000000" />
            </x:top>
            <x:bottom style="thin">
                <x:color rgb="FF000000" />
            </x:bottom>
        </x:border>
    </x:borders>
    <x:cellXfs count="3">
        <x:xf />
        <x:xf fontId="1" borderId="1" applyFont="1" applyBorder="1" />
        <x:xf borderId="1" applyBorder="1" />
    </x:cellXfs>
</x:styleSheet>

仍然 excel 抱怨文件在恢复文件后已损坏,它显示应用于每个单元格的样式会给出错误“修复的记录:来自 /xl/styles.xml 部分(样式)的格式”。 LibreOffice 正确打开文件,OPEN XML SDK 2.0 Productivity Tool 验证文件是否正确...为什么 excel 会报错.....

更新 在玩弄了代码之后,我解决了这个问题。 这两个问题也有帮助 Stylesheet 1 Stylesheet 2

似乎有一个创建节点的顺序,特别是cellStyleXfs和cellXfs,cellStyleXfs在cellXfs之前

工作的 XML

    <?xml version="1.0" encoding="utf-8"?>
<x:styleSheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:x16r2="http://schemas.microsoft.com/office/spreadsheetml/2015/02/main" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" mc:Ignorable="x14ac x16r2 xr">
    <x:fonts count="3" x14ac:knownFonts="1">
        <x:font />
        <x:font>
            <x:b />
            <x:sz val="12" />
            <x:color rgb="FF000000" />
            <x:name val="Arial" />
            <x:family val="2" />
            <x:scheme val="minor" />
        </x:font>
        <x:font>
            <x:b />
            <x:sz val="12" />
            <x:color rgb="FFFF0000" />
            <x:name val="Arial" />
            <x:family val="2" />
            <x:scheme val="minor" />
        </x:font>
    </x:fonts>
    <x:fills count="1">
        <x:fill />
    </x:fills>
    <x:borders count="2">
        <x:border />
        <x:border>
            <x:left style="thin">
                <x:color rgb="FF000000" />
            </x:left>
            <x:right style="thin">
                <x:color rgb="FF000000" />
            </x:right>
            <x:top style="thin">
                <x:color rgb="FF000000" />
            </x:top>
            <x:bottom style="thin">
                <x:color rgb="FF000000" />
            </x:bottom>
            <x:diagonal />
        </x:border>
    </x:borders>
    <x:cellStyleXfs count="1">
        <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
    </x:cellStyleXfs>
    <x:cellXfs count="4">
        <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
        <x:xf numFmtId="0" fontId="1" fillId="0" borderId="1" xfId="0" applyNumberFormat="1" applyFont="1" applyFill="1" applyBorder="1" />
        <x:xf numFmtId="0" fontId="2" fillId="0" borderId="1" xfId="0" applyNumberFormat="1" applyFont="1" applyFill="1" applyBorder="1" />
        <x:xf numFmtId="0" fontId="0" fillId="0" borderId="1" xfId="0" applyNumberFormat="1" applyFont="1" applyFill="1" applyBorder="1" />
    </x:cellXfs>
</x:styleSheet>

【问题讨论】:

    标签: openxml openxml-sdk


    【解决方案1】:

    Excel 仅限于palette of 56 colors。存储索引而不是您提供的实际 RGB 值。我不知道你是如何生成 xmls 的,但是你的字体节点应该是这样的:

    <x:fonts count="1">
        <x:font>
            <x:b />
            <x:sz val="12" />
            <x:color theme="1" />
            <x:name val="Arial" />
        </x:font>
    </x:fonts>  
    

    如果您使用 C# 或 VBA,则可以通过访问 Workbook.Colors Property 来设置您喜欢的颜色

    编辑

    与字体一样,边框需要存储索引,而不是您提供的实际 RGB 值。你的边界节点应该是这样的:

    <x:left style="thin">
        <x:color indexed="64" />
    </x:left>
    

    还要注意,边框需要以正确的顺序定义:左、右、上、下、对角线。在您的 xml 中似乎是正确的,但还是想在这里提及它。

    这是一个很好的example

    【讨论】:

    • 感谢回复,但不是字体节点的问题,我删除了字体节点仍然出现错误,这是样式xml上的错误,我仍然无法弄清楚是什么它是
    • 虽然我也需要颜色的索引,但似乎你可以两者都做......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多