我试图弄清楚如何在OpenXML的电子表格单元格中横向打印文本。我在想可以通过Cell类的ExtendedProperties来完成。这就是我所拥有的。

  Cell cell = GetCell(worksheetPart.Worksheet, columnName, rowIndex);
  cell.DataType = CellValues.InlineString;
  cell.InlineString = new InlineString() { Text = new Text(textToInsert) };

  //fictitious method
  cell.ExtendedAttributes.SpinSideways();
  worksheetPart.Worksheet.Save()

最佳答案

单元格的样式在Excel文档的CellFormats部分中处理。当您查看XML并看到s属性设置为整数时,可以知道单元格何时具有格式:

<x:c r="A1" s="1" t="s" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
  <x:v>0</x:v>
</x:c>


该属性代表StyleIndex,它是CellFormat列表中与该单元格格式相对应的CellFormats索引。这是CellFormats的XML,希望可以使它更清晰一些:

<x:cellXfs count="2" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
  <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
  <x:xf numFmtId="0" fontId="0" fillId="1" borderId="1" xfId="0" />
</x:cellXfs>


在上面的XML中,我们有一个x:cellXfs元素,它是CellFormats元素,并且有两个x:xfCellFormat元素子元素。从StyleIndex属性我们知道我们想要CellFormats元素下的第一个索引(或第二个元素),这意味着我们想要这个CellFormat

<x:xf numFmtId="0" fontId="0" fillId="1" borderId="1" xfId="0" />


现在,要旋转单元格的文本,您将需要通过CellFormat对其进行控制。这是您需要使用以创建具有90度旋转角度的CellFormat的代码:

public CellFormat GenerateCellFormat()
{
    CellFormat cellFormat1 = new CellFormat(){ NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U, ApplyAlignment = true };
    Alignment alignment1 = new Alignment(){ TextRotation = (UInt32Value)90U };

    cellFormat1.Append(alignment1);
    return cellFormat1;
}


如果您希望文本以不同的角度旋转,则只需将90U替换为-90到90之间的任意角度即可。

现在,您需要将该CellFormat插入CellFormats,然后在要旋转的单元格的StyleIndex上设置新索引:

Cell cell = GetCell(worksheetPart.Worksheet, columnName, rowIndex);
cell.StyleIndex = InsertCellFormat(workbookPart, GenerateCellFormat());

// Helper method to insert the cell format in the CellFormats
public static uint InsertCellFormat(WorkbookPart workbookPart, CellFormat cellFormat)
{
    CellFormats cellFormats = workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First();
    cellFormats.Append(cellFormat);
    return (uint)cellFormats.Count++;
}

10-08 01:29