首页 > 解决方案 > 有没有办法从现有的 excel 文件创建现有字体的列表?

问题描述

如果现有的 excel 工作表有一个带有相关名称和大小的字体列表,有没有办法在添加新字体/大小之前生成一个列表来查看字体和大小是否已经存在?

示例图像

通过开放 XML 添加内容时,是否希望查看字体(名称/大小)是否存在或只是将另一个添加fontID到列表中?

标签: c#openxml

解决方案


要获取文档中的所有可用字体,您可以使用以下代码段

        var doc = SpreadsheetDocument.Open(@"test.xlsx", true);
        var styles = doc.WorkbookPart.WorkbookStylesPart;
        var stylesheet = styles.Stylesheet;
        var availableFonts = stylesheet.Fonts.Cast<Font>();
        foreach (var font in availableFonts)
        {
            Console.WriteLine($"Font name: {font.FontName.Val}, font size: {font.FontSize.Val}");
        }

如果您想检查存在并添加,如果它不存在,您可以使用以下

        if (!availableFonts.Any(font => font.FontSize.Val == 20 && font.FontName.Val == "Comic Sans MS"))
        {
            var font = new Font();
            font.Append(new FontSize(){ Val = 20 });
            font.Append(new FontName(){ Val = "Comic Sans MS"});
            stylesheet.Fonts.Append(font);
        }

旁注:要将此字体应用于单元格,您需要创建 CellFormat ( stylesheet.CellFormats) 并填写 FontId。您使用其索引来引用字体stylesheet.Fonts。要将 CellFormat 应用于需要设置 StyleIndex 的单元格,请参考 中创建的 CellFormat 的索引stylesheet.CellFormats。沿着这条线的东西

        stylesheet.CellFormats.Append(new CellFormat()
        {
            FontId = 1
        });
        var worksheetPart = doc.WorkbookPart.WorksheetParts.First();
        var firstCell = worksheetPart.Worksheet.Descendants<Cell>().First();
        firstCell.StyleIndex = 1;

推荐阅读