是否有方法/方式来检索单元格值的文本颜色?

时间:2019-05-22 09:47:36

标签: c# openxml openxml-sdk

我需要使用带有C#的OpenXML从Excel文件中检索数据,并将其显示在dataGridView中。

我检索了所需的所有值,但我也必须检索该值的文本颜色,以便能够按文件中的原样显示它们。

我在不同的线程中研究了如何更改文本的颜色,并尝试使用相同的方式,但是我找不到一种可以使数据的所有颜色都呈现的方法。

我试图检索单元格的颜色,有时我具有Rgb值,但是在大多数情况下,我只有颜色索引,或者什么也没有。

我试图查看Excel文件的XML文件,但是找不到链接所有内容的方法

private string GetTextColor(Cell cell, Stylesheet stylesheet)
{
        CellFormats cellFormats = stylesheet.CellFormats;
        DocumentFormat.OpenXml.Spreadsheet.CellFormat cellFormat = cellFormats.Descendants<DocumentFormat.OpenXml.Spreadsheet.CellFormat>().ElementAt(Convert.ToInt32(cell.StyleIndex.Value));
        var textColor = stylesheet.Descendants<DocumentFormat.OpenXml.Spreadsheet.Color>().ElementAt(Convert.ToInt32(cellFormat.FillId.Value));
        return textColor.Rgb; //Null most of the case
}

我不知道是否还有另一种方法来获取文本的颜色,我尝试了很多方法,但是找不到一个...

提前感谢您的时间!

2 个答案:

答案 0 :(得分:0)

过去对我有用:

int colorNumber = System.Convert.ToInt32(((Range) cell.Interior.Color);
Color color = System.Drawing.ColorTranslator.FromOle(colorNumber);

答案 1 :(得分:0)

我终于找到了一种方法:

我发现可以通过两种方式找到颜色:直接从RGB十六进制代码或在ColorScheme中找到颜色,具体取决于主题中是否定义了所使用的颜色。

所以首先,我像这样遍历单元格的TableCellProperties:

public async Task<IEnumerable<MyModel>> GetMyModelAsync(IEnumerable<string> input)
{
    //await Task.Delay(1);
    return await Elastic.Apm.Agent.Tracer
       .CurrentTransaction.CaptureSpan("MyQuery", "DB", async (span) =>
       {
           span.Labels["query"] = MyQuery;
           using var _dbConnection = new OracleConnection(connString);
           var myModels = await _dbConnection.QueryAsync<MyModel>(MyQuery,
               new
               {
                   input
               });
           return myModels;
       }, "my db query");
}

然后我也遍历SolidFill:

foreach(D.TableCellProperties cPr in _cell.Elements<D.TableCellProperties>())

(其中D定义为foreach(D.SolidFill sldFill in cPr.Elements<D.SolidFill>())

在此之后,我可以检测SchemeColor或RgbColorHexModel是否不为空。

第一种情况: 如果值using D = DocumentFormat.OpenXml.Drawing;不为空,我将检索文件配色方案中包含的所有颜色:

sldFill.ShemeColor

然后,我将进行迭代,直到找到相同的颜色名称。之后,我可以使用此参数检索RGB值:

presentationDocument.PresentationPart.ThemePart.Theme.ThemeElements.ColorScheme;

第二种情况: 如果值//colorName represent the color found in the ColorScheme colorName.Elements<D.RgbColorModelHex>() 不为null,我将像这样检索十六进制代码:

sldFill.RgbColorModelHex