8

Excelスプレッドシートでセルの背景色を取得しようとしています。Open XML 2.0 SDKを使用しており、*。xlsxファイルを開いてセル値を取得することができます。背景色を取得するための私のコードは次のとおりです。

   public BackgroundColor GetCellBackColor(Cell theCell, SpreadsheetDocument document)
    {
        BackgroundColor backGroundColor = null;
        WorkbookStylesPart styles = SpreadsheetReader.GetWorkbookStyles(document);
        int cellStyleIndex = (int)theCell.StyleIndex.Value;
        CellFormat cellFormat = (CellFormat)styles.Stylesheet.CellFormats.ChildElements[cellStyleIndex];
        Fill fill = (Fill)styles.Stylesheet.Fills.ChildElements[(int)cellFormat.FillId.Value];
        backGroundColor = fill.PatternFill.BackgroundColor;

        return backGroundColor;
    }

ここでの私の問題は、それPatternFill.BackgroundColorが自然数を返すことです。これはスタイルのIDだと思います。私の問題は、コードの行が

DocumentFormat.OpenXml.Spreadsheet.Color c = (DocumentFormat.OpenXml.Spreadsheet.Color)styles.Stylesheet.Colors.ChildElements[Int32.Parse(backGroundColor.InnerText)];

エラーで返されます。なぜなら......多分それStylesheet.Colorsは私がExcelで「組み込み」の色を使用したためです-自己定義の色ではありませんか?!null

「backGroundColor-Value」から実際の色数を「計算」する方法はありますか?

4

2 に答える 2

13

Excelスプレッドシートのセルの塗りつぶしパターンは、背景色と前景色の2色で構成されています。前景色という用語は、ここでは少し誤解を招く可能性があります。フォントの色ではなく、パターンの塗りつぶしの前景色です。

たとえば、セルの背景を単色でForegroundColor塗りつぶすと、セルの関連オブジェクトのプロパティがPatternFill選択された単色値にBackgroundColor設定されますが、オブジェクトはシステムの前景色に設定されます。オブジェクトのPatternTypeプロパティはに 設定されます。PatternFillPatternValues.Solid

したがって、セルの背景の色の値(塗りつぶし)を取得するには、関連するオブジェクトのForegroundColorプロパティを分析する必要がありPatternFillます。インスタンスが表す「色のタイプ」を決定する必要があります。

  1. 自動色とシステム依存色
  2. インデックスカラー。
  3. ARGBカラー(アルファ、赤、緑、青)
  4. テーマベースの色。
  5. 色に適用される色合いの値。

さまざまな「カラータイプ」の詳細については、次の リンクを参照してください。

andクラスのInnerTextプロパティの意味は 、色の種類によって異なることに注意してください。たとえば、テーマベースの色の場合、プロパティはコレクションのインデックスに設定されます。ForegroundColorBackgroundColorInnerTextColorScheme

次の例では、スプレッドシートドキュメントのすべてのセルのすべての背景色情報を印刷します。

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();
}
于 2012-05-28T18:49:38.107 に答える
1

セルの背景色としてどのRGBカラーが適用されているかをテストする必要がある同様のユースケースがありました。関数からコードに追加するだけで、

backGroundColor = fill.PatternFill.BackgroundColor.Rgb.Value;
return backgroundColor;

これにより、セルの背景で使用されているRGBカラー値が返されます。

于 2021-05-26T07:22:59.297 に答える