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

时间:2019-02-15 19:42:04

标签: asp.net excel openxml

我正在尝试使用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中用“第三单元格”填充单元格A1和B1的“第一单元格进入”。相反,我在单元格A1中获得了“第一个单元格输入”,而在单元格B1中获得了“第三单元格”。任何帮助或建议,将不胜感激。这是剩下的,我需要使一些旧代码起作用,并且我不想将整个报告转换为OpenXML SDK代码。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

马里奥的答案仍然是该问题的正确答案。

但是,由于有不错的访问量困扰着这个问题,我认为我将为处理此报告时必须挖掘的一些其他操作添加一些示例代码。

这里是如何向文件添加样式信息的示例。在工作簿元素之后立即在您的文件中添加如下所示的块

<?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>

当分配给单元格时,这会将文本字体设置为粗体,并以正常粗细在所有边上应用边框。调整“权重”参数以使边框变粗。

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

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

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