Open XML SDK 備忘録

おもにExcelファイル (.xlsx) を扱います。

P-SPACE
就学奨励費システム

マイナンバー対応 特別支援教育 就学奨励費 支給業務支援システム

詳細...

P-SPACE
就学奨励費ソフトウェア

特別支援教育 就学奨励費 支給業務支援ソフトウェア

詳細...

開発室
(備忘録そのほか)

システム開発にまつわる(かもしれない)調査・実験結果など

詳細...

セルの書式設定 - フォントの操作

以前の記事「セルの書式設定 - その2」を踏まえて、セルのフォントを操作するコードを紹介します。

今回処理対象とするシートはA列のいくつかのセルに文字が入力されています。

C:\Users\Public\Documents\openxmlsdk14.xlsx

このシートのセルA1, A2のフォントを変更するコードを以下に示します。

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace OpenXMLSDK_Sample7 {
    class Program {
        static void Main(string[] args) {
            const string FILE = @"C:\Users\Public\Documents\openxmlsdk14.xlsx";
            const string SHEET_NAME = "Sheet1";

            using (SpreadsheetDocument excelDoc = SpreadsheetDocument.Open(FILE, true)) {
                WorkbookPart bookPart = excelDoc.WorkbookPart;

                int sheet_index = GetWorksheetIndex(bookPart, SHEET_NAME);
                WorksheetPart sheet_part = GetWorksheetPart(bookPart, sheet_index);

                //A1
                Cell cell = GetCell(sheet_part, "A1");
                
                Font font = new Font() {
                    Color = new Color() { Rgb = new HexBinaryValue("FF00FF00") },
                    Bold = new Bold() { Val = new BooleanValue(true) }
                };

                SetFont(bookPart, cell, SHEET_NAME, font);
                
                //A2
                cell = GetCell(sheet_part, "A2");
                font = new Font() {
                    Color = new Color() { Indexed = new UInt32Value((uint)4) },
                    FontName = new FontName() { Val = "Times New Roman" },
                    FontSize = new FontSize() {  Val = new DoubleValue(14.0) },
                    Strike = new Strike() { Val = new BooleanValue(true) }
                };
                SetFont(bookPart, cell, SHEET_NAME, font);

            }
            //ファイルを開く
            System.Diagnostics.Process.Start(FILE);
        }

        private static void SetFont(WorkbookPart bookPart, Cell cell, string sheet_name, Font font_to_set) {
            if (cell == null || bookPart == null) {
                return;
            }

            IEnumerable<CellFormat> cell_formats = bookPart.WorkbookStylesPart.Stylesheet.CellFormats.Elements<CellFormat>();

            CellFormat format_to;
            if (cell.StyleIndex != null) {
                CellFormat cell_xf = cell_formats.ElementAt(Convert.ToInt32(cell.StyleIndex.Value));

                int sheet_index = GetWorksheetIndex(bookPart, sheet_name);
                WorksheetPart sheet_part = GetWorksheetPart(bookPart, sheet_index);
                int referenced_count = sheet_part.Worksheet.Descendants<Cell>().Count(c => c.StyleIndex == cell.StyleIndex);

                if (referenced_count == 0) {
                    format_to = cell_xf;
                } else {
                    format_to = cell_xf.Clone() as CellFormat;

                    bookPart.WorkbookStylesPart.Stylesheet.CellFormats.Append(format_to);
                    cell.StyleIndex = new UInt32Value((uint)cell_formats.Count() - 1);
                }
            } else {
                format_to = new CellFormat();
                format_to.Alignment = new Alignment() { Vertical = new EnumValue<VerticalAlignmentValues>(VerticalAlignmentValues.Center) };
                bookPart.WorkbookStylesPart.Stylesheet.CellFormats.Append(format_to);
                cell.StyleIndex = new UInt32Value((uint)cell_formats.Count() - 1);
            }

            //Get the x:font to modify
            Font font = null;
            Fonts fonts = bookPart.WorkbookStylesPart.Stylesheet.Fonts;
            if (format_to.FontId != null && format_to.FontId.HasValue) {
                font = fonts.Elements<Font>().ElementAt(Convert.ToInt32(format_to.FontId.Value));
            } else {
                font = new Font();
                font.FontSize = new FontSize() { Val = 11 };
                fonts.Append(font);
                fonts.Count++;
                format_to.FontId = new UInt32Value((uint)fonts.Count() - 1);
            }

            //Copy the font_to_set to the font.
            CopyFont(font_to_set, font);

            bookPart.WorkbookStylesPart.Stylesheet.Save();
        }

        private static void CopyFont(Font font_from, Font font_to) {
            if (font_to.FontSize != null) {
                font_to.FontSize = new FontSize() { Val = font_to.FontSize.Val };
            }

            if (font_from.Color != null) {
                if (font_to.Color == null) {
                    font_to.Color = new Color();
                }

                if (font_from.Color.Indexed != null) {
                    font_to.Color.Indexed = new UInt32Value(font_from.Color.Indexed.Value);
                }
                if (font_from.Color.Rgb != null) {
                    font_to.Color.Rgb = new HexBinaryValue(font_from.Color.Rgb);
                }
                if (font_from.Color.Theme != null) {
                    font_to.Color.Theme = new UInt32Value(font_from.Color.Theme.Value);
                }
                if (font_from.Color.Tint != null) {
                    font_to.Color.Tint = new DoubleValue(font_from.Color.Tint.Value);
                }
            }

            if (font_from.FontName != null) {
                font_to.FontName = new FontName() { Val = font_from.FontName.Val };
            }

            if (font_from.Bold != null) {
                font_to.Bold = new Bold() { Val = new BooleanValue(font_from.Bold.Val) };
            }

            if (font_from.Italic != null) {
                font_to.Italic = new Italic() { Val = new BooleanValue(font_from.Italic.Val) };
            }

            if (font_from.Underline != null) {
                font_to.Underline = new Underline() { Val = font_from.Underline.Val };
            }

            if (font_from.Strike != null) {
                font_to.Strike = new Strike() { Val = new BooleanValue(font_from.Strike.Val) };
            }

            if (font_from.VerticalTextAlignment != null) {
                font_to.VerticalTextAlignment = new VerticalTextAlignment() { Val = font_from.VerticalTextAlignment.Val };
            }

            if (font_from.FontFamilyNumbering != null) {
                font_to.FontFamilyNumbering = new FontFamilyNumbering() { Val = font_from.FontFamilyNumbering.Val };
            }

            if (font_from.FontCharSet != null) {
                font_to.FontCharSet = new FontCharSet() { Val = font_from.FontCharSet.Val };
            }

            if (font_from.FontScheme != null) {
                font_to.FontScheme = new FontScheme() { Val = font_from.FontScheme.Val };
            }
        }
        // 以下省略...
    }
}

 「以下省略」とした部分に定義されているメソッドについては「セルの書式設定 - 表示形式」など、以前の記事をご覧ください。

はじめにフォントをセットするセルに書式がセットされているかどうかを確認します。

書式がセットされている場合、さらにそのセルから参照されているCellFormatが他のセルから参照されているかどうかを調べます。(54行目、61行目)
他のセルから参照されていない場合はそのCellFormatにフォントの設定を反映します。(62行目)
他のセルから参照されている場合はそのクローンを作成して、そのセルがこのクローンを参照するようにしたうえでこのクローンにフォントの設定を反映します。(64~66行目)

書式がセットされていない場合は新たにCellFormatを生成してこれをフォントをセットするセルから参照されるようにします。(70~73行目)

77行目から87行目にかけて編集するフォントを特定して(あるいは生成して)、そのフォントに引数「font_to_set」の内容を反映します。(90行目)

このコードを実行すると、セルA1, A2のフォントが変わります。