Excelスプレッドシートのセルの塗りつぶしパターンは、背景色と前景色の2色で構成されています。前景色という用語は、ここでは少し誤解を招く可能性があります。フォントの色ではなく、パターンの塗りつぶしの前景色です。
たとえば、セルの背景を単色でForegroundColor
塗りつぶすと、セルの関連オブジェクトのプロパティがPatternFill
選択された単色値にBackgroundColor
設定されますが、オブジェクトはシステムの前景色に設定されます。オブジェクトのPatternType
プロパティはに
設定されます。PatternFill
PatternValues.Solid
したがって、セルの背景の色の値(塗りつぶし)を取得するには、関連するオブジェクトのForegroundColor
プロパティを分析する必要がありPatternFill
ます。インスタンスが表す「色のタイプ」を決定する必要があります。
- 自動色とシステム依存色
- インデックスカラー。
- ARGBカラー(アルファ、赤、緑、青)
- テーマベースの色。
- 色に適用される色合いの値。
さまざまな「カラータイプ」の詳細については、次の
リンクを参照してください。
andクラスのInnerText
プロパティの意味は
、色の種類によって異なることに注意してください。たとえば、テーマベースの色の場合、プロパティはコレクションのインデックスに設定されます。ForegroundColor
BackgroundColor
InnerText
ColorScheme
次の例では、スプレッドシートドキュメントのすべてのセルのすべての背景色情報を印刷します。
public static PatternFill GetCellPatternFill(Cell theCell, SpreadsheetDocument document)
{
WorkbookStylesPart styles = SpreadsheetReader.GetWorkbookStyles(document);
int cellStyleIndex;
if (theCell.StyleIndex == null) // I think (from testing) if the StyleIndex is null
{ // then this means use cell style index 0.
cellStyleIndex = 0; // However I did not found it in the open xml
} // specification.
else
{
cellStyleIndex = (int)theCell.StyleIndex.Value;
}
CellFormat cellFormat = (CellFormat)styles.Stylesheet.CellFormats.ChildElements[cellStyleIndex];
Fill fill = (Fill)styles.Stylesheet.Fills.ChildElements[(int)cellFormat.FillId.Value];
return fill.PatternFill;
}
private static void PrintColorType(SpreadsheetDocument sd, DocumentFormat.OpenXml.Spreadsheet.ColorType ct)
{
if (ct.Auto != null)
{
Console.Out.WriteLine("System auto color");
}
if (ct.Rgb != null)
{
Console.Out.WriteLine("RGB value -> {0}", ct.Rgb.Value);
}
if (ct.Indexed != null)
{
Console.Out.WriteLine("Indexed color -> {0}", ct.Indexed.Value);
//IndexedColors ic = (IndexedColors)styles.Stylesheet.Colors.IndexedColors.ChildElements[(int)bgc.Indexed.Value];
}
if (ct.Theme != null)
{
Console.Out.WriteLine("Theme -> {0}", ct.Theme.Value);
Color2Type c2t = (Color2Type)sd.WorkbookPart.ThemePart.Theme.ThemeElements.ColorScheme.ChildElements[(int)ct.Theme.Value];
Console.Out.WriteLine("RGB color model hex -> {0}", c2t.RgbColorModelHex.Val);
}
if (ct.Tint != null)
{
Console.Out.WriteLine("Tint value -> {0}", ct.Tint.Value);
}
}
static void ReadAllBackgroundColors()
{
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open("c:\\temp\\bgcolor.xlsx", false))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
foreach(WorksheetPart worksheetPart in workbookPart.WorksheetParts)
{
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
foreach (Row r in sheetData.Elements<Row>())
{
foreach (Cell c in r.Elements<Cell>())
{
Console.Out.WriteLine("----------------");
PatternFill pf = GetCellPatternFill(c, spreadsheetDocument);
Console.Out.WriteLine("Pattern fill type -> {0}", pf.PatternType.Value);
if (pf.PatternType == PatternValues.None)
{
Console.Out.WriteLine("No fill color specified");
continue;
}
Console.Out.WriteLine("Summary foreground color:");
PrintColorType(spreadsheetDocument, pf.ForegroundColor);
Console.Out.WriteLine("Summary background color:");
PrintColorType(spreadsheetDocument, pf.BackgroundColor);
}
}
}
}
}
static void Main(string[] args)
{
ReadAllBackgroundColors();
}