如何在 SpreadsheetML 中指定合并单元格

How do I specify merged cells in SpreadsheetML

我正在尝试使用 SpreadsheetML 生成 Excel 报告服务器端并通过浏览器下载报告。我一切正常,正在下载我需要的文件。但是,当我尝试合并正在创建的其中一张工作表中的单元格时,我 运行 遇到了问题。我在网上找到了两种不同的语法并尝试了它们但都没有成功。我将文件另存为 .xml 文件,它们将正常打开并显示预期数据,但单元格未合并。

第一种语法在元素上使用 "mergeAcross" 限定符,并且应该将指定数量的单元格合并到当前单元格中。第二种语法使用元素。我已经在下面粘贴了两次尝试的实际 xml 代码。如果我能弄清楚 XML 应该是什么,那么我就可以轻松地以编程方式创建它。

版本 1

<?xml version='1.0'?>
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<ss:Worksheet ss:Name='Distribution List Overview'>
<ss:Table>
    <ss:Row>
        <ss:Cell mergeAcross="2"><ss:Data ss:Type="String">First Cell Entry</ss:Data></ss:Cell>
        <ss:Cell><ss:Data ss:Type="String">Third Cell</ss:Data></ss:Cell>
    </ss:Row>
</ss:Table>
</ss:Worksheet>
</ss:Workbook>

版本 1

<?xml version='1.0'?>
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<ss:Worksheet ss:Name='Distribution List Overview'>
<ss:Table>
    <ss:Row>
        <ss:Cell><ss:Data ss:Type="String">First Cell Entry</ss:Data></ss:Cell>
        <ss:Cell><ss:Data ss:Type="String">Third Cell</ss:Data></ss:Cell>
    </ss:Row>
</ss:Table>
<mergeCells count="2">
    <mergeCell ref="A1:B1"/>
</mergeCells>
</ss:Worksheet>
</ss:Workbook>

以上两种方法都无法创建合并单元格。我希望在单元格 C1 中用 "Third Cell" 填充单元格 A1 和 B1 "First Cell Entry"。相反,我在单元格 A1 中得到 "First Cell Entry",在单元格 B1 中得到 "Third Cell"。任何帮助或建议将不胜感激。这是我需要让一些遗留代码正常工作的唯一剩余项目,我不想将整个报告转换为 OpenXML SDK 代码。

尝试用 ss:MergeAcross 替换 mergeAcross。换句话说,使用:

<ss:Cell ss:MergeAcross="2"><ss:Data ss:Type="String">First Cell Entry</ss:Data></ss:Cell>

此外,您可能会注意到,要获得 "A1:B1" 合并单元格,您需要将 ss:MergeAcross 值设置为 1,而不是 2。

马里奥的回答仍然是这个问题的正确答案。

但是,由于有不错的流量解决了这个问题,我想我会添加一些示例代码,用于一些我在处理此报告时必须挖掘的额外操作。

这里是如何向文件添加样式信息的示例。在工作簿元素

之后立即将如下所示的块添加到您的文件中
<?xml version='1.0'?><ss:Workbook xmlns:ss='urn:schemas-microsoft-com:office:spreadsheet'>
<ss:Styles>
  <ss:Style ss:ID='1'>
    <ss:Font ss:Bold='1'/>
    <ss:Alignment ss:Horizontal='Center'/>
  </ss:Style>
</ss:Styles>
<ss:Worksheet ss:Name='Distribution List Overview'>

定义了一种样式,用于设置字体粗细并使每个单元格中的文本水平居中。您似乎能够向块中添加任意数量的样式参数,并且应该能够指定 Excel 支持的几乎所有内容。您必须做一些研究才能找出正确的元素名称是什么,但它们似乎与 Excel 命令非常相似,因此猜测并不像听起来那么难。

您可以通过将样式描述符附加到目标元素来将其添加到单元格或行中,如下所示

<ss:Cell ss:StyleID='1'>

要指定水平对齐方式和换行文本,请在 'ss:Styles' 和 '/ss:Styles' 元素之间声明另一个样式块,并为其指定唯一标识符

<ss:Style ss:ID='3'>
    <ss:Alignment ss:Vertical='Bottom' ss:WrapText='1'/>    
</ss:Style>

可以使用以下样式结构创建边框

<ss:Style ss:ID='4'>
<ss:Font ss:Bold='1'/>
<ss:Borders>
    <ss:Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/>
    <ss:Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/>
    <ss:Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/>
    <ss:Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/>
</ss:Borders>

分配给单元格时,这会将文本字体设置为粗体,并在所有边上应用正常粗细的边框。调整 Weight 参数使边框更粗。

最后,我花了很长时间研究如何将多条记录添加到单个单元格。据我所知,您不能将表格嵌套在单元格内,因此我不得不弄清楚如何对 alt-enter 进行编码以在单元格内引起换行。这需要自定义样式以及一些内联插入的特殊文本。您需要启用我上面显示的换行,然后使用“ ”字符串来分隔您的行。下面的块将使用上面指定的示例样式在两行中的指定单元格中显示两个名称

<ss:Cell ss:StyleID='3'>
  <ss:Data ss:Type='String'>Jane Doe&#10Janet Doe</ss:Data>
</ss:Cell>

我还没有找到将多种样式应用于单个元素的方法,因此我不得不创建多种样式,其中一些样式差异很小,并为每个单元格分配格式化所有内容所需的特定样式 ID正确。例如,我必须创建一种具有普通文本和正常粗细边框的样式,一种具有粗体文本和普通边框,一种具有粗体文本和粗体边框,因为我无法想出一种分别应用字体粗细和边框粗细的方法.