使用打开 XML 更改 excel 文件的 Sheet 选项卡颜色

Change Sheet tab color of excel file using Open XML

我想更改 excel Xlsx 文档的 sheet 选项卡颜色。我正在使用以下代码,但它没有设置 sheet 颜色。当我设置 sheet 选项卡颜色时出现对象引用异常。

public static string filepath = @"C:\Test\Book1.xlsx";
private static void ChangeSheetcolor()
{
    try
    {
        using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(filepath, false))
        {
            WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
            IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
            //my code
            WorksheetPart worksheetPart =
                  GetWorksheetPartByName(spreadSheetDocument, "Sheet1");

            if (worksheetPart != null)
            {
             //   worksheetPart.Worksheet.SheetProperties.TabColor.Rgb = DocumentFormat.OpenXml.HexBinaryValue.FromString("Red");
                worksheetPart.Worksheet.SheetProperties.TabColor.Rgb = DocumentFormat.OpenXml.HexBinaryValue.FromString("#CCCCCC");
                // Save the worksheet.
                worksheetPart.Worksheet.Save();
            }
        }
    }
    catch (Exception ex)
    { 

    }            
}
private static WorksheetPart
     GetWorksheetPartByName(SpreadsheetDocument document,
     string sheetName)
{
    IEnumerable<Sheet> sheets =
       document.WorkbookPart.Workbook.GetFirstChild<Sheets>().
       Elements<Sheet>().Where(s => s.Name == sheetName);
    if (sheets.Count() == 0)
    {
        //does not exist
        return null;
    }
    string relationshipId = sheets.First().Id.Value;
    WorksheetPart worksheetPart = (WorksheetPart)
         document.WorkbookPart.GetPartById(relationshipId);
    return worksheetPart;
}

如何使用 Open XML dll 更改 sheet 选项卡颜色?

据我所知,您似乎有 3 个问题。首先,您调用的 Open 方法的第二个参数表示文件是否可编辑。如果你想编辑文件,你需要在这里传递 true 否则你会在保存工作表时遇到以下异常:

System.IO.IOException: Cannot get stream with FileMode.Create, FileMode.CreateNew, FileMode.Truncate, FileMode.Append when access is FileAccess.Read.

其次,SheetPropertiesTabColor 可能为空。在 XSD 中,它们被定义为

<xsd:element name="sheetPr" type="CT_SheetPr" minOccurs="0" maxOccurs="1"/>

<xsd:element name="tabColor" type="CT_Color" minOccurs="0" maxOccurs="1"/>

请注意,两者都有 minOccurs="0",因此两者都可以为空。如果是,您只需创建新实例并将它们分配给 Worksheet.

最后,Rgb 属性 可以说是错误地命名为 documentation 州(强调我的):

Standard Alpha Red Green Blue color value (ARGB).
The possible values for this attribute are defined by the ST_UnsignedIntHex simple type (§18.18.86).

18.18.86 继续说(再次强调我的):

This simple type's contents have a length of exactly 8 hexadecimal digit(s).

假设您想要纯色,您可以将 Alpha 通道设置为 FF。您也不应该包含前导 #,因此对于纯红色,例如您应该使用 "FFFF0000"。有关 ARGB 值的更多详细信息,请参见 this question

把所有这些放在一起你的代码变成这样:

public static string filepath = @"C:\Test\Book1.xlsx";
private static void ChangeSheetcolor()
{
    try
    {
        using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(filepath, false))
        {
            WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
            IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
            //my code
            WorksheetPart worksheetPart =
                    GetWorksheetPartByName(spreadSheetDocument, "Sheet1");

            if (worksheetPart != null)
            {
                //create the SheetProperties if it doesn't exist
                if (worksheetPart.Worksheet.SheetProperties == null)
                    worksheetPart.Worksheet.SheetProperties = new SheetProperties();
                //create the TabColor if it doesn't exist
                if (worksheetPart.Worksheet.SheetProperties.TabColor == null)
                    worksheetPart.Worksheet.SheetProperties.TabColor = new TabColor();
                //this will set the tab color to Red
                //note the value is an ARGB not an RGB
                worksheetPart.Worksheet.SheetProperties.TabColor.Rgb = DocumentFormat.OpenXml.HexBinaryValue.FromString("FFFF0000");
                // Save the worksheet.
                worksheetPart.Worksheet.Save();
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}