首页 > 解决方案 > 如何在 WPF C# 中使用 EPPlus 从 Excel 中正确导入字体颜色?

问题描述

背景

我正在构建一个简单的应用程序,它从 Excel 中的某些单元格读取文本并在 WPF-xaml 文本块中显示内容。

纯文本工作正常;除了字体颜色外,富文本工作正常。

有些颜色根本不会转移。我认为这与哪种颜色、标准或非标准有关,但情况似乎并非如此。

另一个可能相关的谜团是,有时颜色只有在带有富文本的情况下才能正确导入。

代码讨论

我使用嵌套的 for 循环逐个访问每个单元格,当到达一个空单元格时终止。对于每个单元格,我分别访问富文本数据并创建一个新运行,根据富文本数据(使用 if 语句)为运行分配属性。

代码

private void ReadExcelData()
                {
                ExcelRange cell;
                for (int row = 2; row < 27000; row++)
                    {
                    if (string.IsNullOrWhiteSpace(worksheet.Cells[row, 2].Value?.ToString())) { break; }
                    Card card = new Card();
                    card.codeCore = this;
                    for (int col = 2; col < 5; col++)
                        {
                        cell = worksheet.Cells[row, col];
                        foreach (OfficeOpenXml.Style.ExcelRichText part in cell.RichText)
                            {
                            Run textRun = new Run();
                            GetDataFromCell(part, textRun, cell);
                            switch (col)
                                {
                                case 2: card.firstTextPanel.Add(textRun); break;
                                case 3: card.secondTextPanel.Add(textRun); break;
                                case 4: card.thirdTextPanel.Add(textRun); break;
                                default:
                                    break;
                                }
                            }
                        }
                    cards.Add(card);
                    }
                }


    private void GetDataFromCell(OfficeOpenXml.Style.ExcelRichText part_a, Run textRun, ExcelRange cell_a)
        {
        if (cell_a.Style.Font.Bold) { textRun.FontWeight = FontWeights.Bold; }
        else if (part_a.Bold) { textRun.FontWeight = FontWeights.Bold; }
        if (cell_a.Style.Font.Italic) { textRun.FontStyle = FontStyles.Italic; }
        else if (part_a.Italic) { textRun.FontStyle = FontStyles.Italic; }
        if (cell_a.Style.Font.UnderLine) { textRun.TextDecorations = TextDecorations.Underline; }
        else if (part_a.UnderLine) { textRun.TextDecorations = TextDecorations.Underline; }

        textRun.Text = part_a.Text;
        textRun.Foreground = new SolidColorBrush(Color.FromRgb(part_a.Color.R, part_a.Color.G, part_a.Color.B));
    }

Excel

我的excel表

结果

第 1 页结果图片

第 2 页结果图片

第 3 页结果图片

问题

为什么会发生这种情况,我能做些什么来解决它?

标签: c#excelwpfepplustextblock

解决方案


推荐阅读