【问题标题】:Change Sheet tab color of excel file using Open XML使用 Open XML 更改 Excel 文件的工作表选项卡颜色
【发布时间】:2015-07-11 10:11:41
【问题描述】:

我想更改 excel Xlsx 文档的工作表标签颜色。我正在使用以下代码,但它没有设置工作表颜色。设置工作表标签颜色时出现对象引用异常。

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 更改工作表标签颜色?

【问题讨论】:

    标签: openxml


    【解决方案1】:

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

    System.IO.IOException:当访问为 FileAccess.Read 时,无法使用 FileMode.Create、FileMode.CreateNew、FileMode.Truncate、FileMode.Append 获取流。

    其次,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 状态(强调我的):

    标准Alpha红绿蓝颜色值(ARGB)。
    此属性的可能值由 ST_UnsignedIntHex 简单类型定义 (§18.18.86)。

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

    这种简单类型的内容长度为正好 8 个十六进制数字。

    假设您想要纯色,您可以将 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());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      相关资源
      最近更新 更多