1

ClosedXml を使用して、Excel のセルの塗りつぶしの背景色を読み取ろうとしています。このサンプル コードを使用して、Excel ドキュメントのコンテンツを問題なく読み取ることができましたが、セルのFill BackgroundColorを 16 進値として読み取ることができません。BackgroundColorで定義されているThemeColorおよびThemeTintプロパティを確認できますが、これらをSystem.Colorまたは 16 進数値に変換する方法が見つかりません。これが私のコードです:

// Get all categories
while (!categoryRow.Cell(coCategoryId).IsEmpty())
{
    IXLCell categoryName = categoryRow.Cell(coCategoryName);
    categories.Add(categoryName.GetString() + " " + XLColor.FromTheme(categoryName.Style.Fill.BackgroundColor.ThemeColor, categoryName.Style.Fill.BackgroundColor.ThemeTint).Color.ToHex());
    categoryRow = categoryRow.RowBelow();
}

メソッドXLColor.FromThemeは常に「テーマの色を色に変換できません」という例外をスローするようです。ThemeColorおよびThemeTint値からSystem.Colorを取得する別の方法を知っている人はいますか?

アップデート:

私はすでにBackgroundColorのColorプロパティを使用しようとしたことを述べていませんでしたが、残念ながらこれは正しく入力されていません。デバッガで表示すると、このプロパティがメソッドXLColor で取得したのと同じ例外をスローしていることがわかります。テーマから。したがって、これは間違いなく ClosedXml のバグのようです。誰かが回避策を知っていますか?

4

3 に答える 3

2

ColorType必要に応じて、プロパティとワークブックのテーマを評価する必要があると思います。たとえば、次のようにします。

Private Function CellColor(ByVal cell As IXLCell, ByVal wb As XLWorkbook) As Drawing.Color

    Select Case cell.Style.Fill.BackgroundColor.ColorType
        Case XLColorType.Color
            Return cell.Style.Fill.BackgroundColor.Color

        Case XLColorType.Theme
            Select Case cell.Style.Fill.BackgroundColor.ThemeColor
                Case XLThemeColor.Accent1
                    Return wb.Theme.Accent1.Color
                Case XLThemeColor.Accent2
                    Return wb.Theme.Accent2.Color
                ...
            End Select
    End Select

BruceHill が指摘したように、これは着色/シェーディングを無視します。ClosedXML はこれをサポートしていないようで、手動で計算する必要があります。Office で使用されるアルゴリズムは、http ://social.msdn.microsoft.com/Forums/en-HK/oxmlsdk/thread/f6d26f2c-114f-4a0d-8bca-a27442aec4d0 にあります。

于 2012-06-26T07:05:56.830 に答える
0

この記事は非常に便利で、うまく機能しています。

「RgbToHls」関数に、最小値と最大値が等しい場合にアルファ値を設定しない小さなバグが見つかりました。

if (max == min)
        {

            hlsColor.H = 0;

            hlsColor.S = 0;

            hlsColor.L = max;

           --> **hlsColor.L = a;**
            return hlsColor;

        }
于 2013-01-04T16:33:44.340 に答える
0

テーマの色は単なる列挙値 ( Background1Text1など) であり、テーマから取得する必要がある実際の値を取得します。したがって、ワークブックでいくつかの「テーマ」プロパティを探してください。実際のテーマの色は、おそらくどこで定義されているでしょう。

于 2012-06-26T04:54:01.513 に答える