Условное форматирование панели данных C # EPPlus со сплошной заливкой - PullRequest
0 голосов
/ 02 октября 2018

Я создаю отчеты Excel, которые включают несколько столбцов, которые представляют собой процентные данные.Так как отчеты предназначены для презентаций, я хочу, чтобы они выглядели красиво, отформатировав процентные данные с панелями данных со сплошной заливкой.Каким-то образом это оказывается чрезвычайно трудным, поскольку в EPPlus нет прямой настройки для сплошной заливки для панели данных, но, тем не менее, я пришел к ответу, который содержится в этом посте:

Несовместимый вид между ручной и кодированной версиямисплошной панели данных и минимальное значение в панели данных

Однако, как бы я ни старался редактировать код для своего приложения, у меня есть только один столбец, который заканчивается сплошной заливкой, а остальное - градиентом.Несмотря на то, что я изменил узел в вопросе на список узлов, такой как ниже:

        var cfNodes = xdoc.SelectNodes("/default:worksheet/default:conditionalFormatting/default:cfRule", nsm);
        foreach(XmlNode cfNode in cfNodes)
        {
            cfNode.AppendChild(extLstCf);
        }

, а также для элементов листа:

        var wsNodes = xdoc.SelectNodes("/default:worksheet", nsm);
        foreach(XmlElement wsNode in wsNodes)
        {
            wsNode.AppendChild(extLstWs);
        }

Я также попытался поиграться с изменением xmlпараметр <sqref>, но он все еще не охватывает все мои столбцы на панели данных.Я думаю, что должно быть что-то, что я могу изменить в xml, чтобы выполнить то, что я хочу, но я не знаю, что искать ...

1 Ответ

0 голосов
/ 05 октября 2018

Хорошо, ребята, это заняло у меня несколько дней, но я наконец понял это.Возможно, есть более простой способ сделать это, но до сих пор я понял, как это работает для меня:

Необходимо добавить узел списка расширений XML для рабочего листа на уровне уровня рабочего листа, который включает элементы панели числовых данныхчто ваша рабочая таблица содержит, и каждая из них должна иметь gradient = 0 для сплошной заливки I. Например, моя рабочая таблица содержит две панели данных, поэтому моя выглядит так:

        var extLstWs = xdoc.CreateNode(XmlNodeType.Element, "extLst", xdoc.DocumentElement.NamespaceURI);
        extLstWs.InnerXml = @"<ext uri=""{78C0D931-6437-407d-A8EE-F0AAD7539E65}"" 
                                        xmlns:x14=""http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"">
                                    <x14:conditionalFormattings>
                                    <x14:conditionalFormatting xmlns:xm=""http://schemas.microsoft.com/office/excel/2006/main"">
                                    <x14:cfRule type=""dataBar"" id=""{3F3F0E19-800E-4C9F-9CAF-1E3CE014ED86}"">
                                        <x14:dataBar minLength=""0"" maxLength=""100"" gradient=""0"">
                                        <x14:cfvo type=""num"">
                                            <xm:f>0</xm:f>
                                        </x14:cfvo>
                                        <x14:cfvo type=""num"">
                                            <xm:f>100</xm:f>
                                        </x14:cfvo>
                                        <x14:negativeFillColor rgb=""FFFF0000""/><x14:axisColor rgb=""FF000000""/>
                                        </x14:dataBar>
                                    </x14:cfRule>
                                    <xm:sqref>A1:A20</xm:sqref>
                                    </x14:conditionalFormatting>
                                    <x14:conditionalFormatting xmlns:xm=""http://schemas.microsoft.com/office/excel/2006/main"">
                                        <x14:cfRule type=""dataBar"" id=""{3F3F0E19-800E-4C9F-9CAF-1E3CE014ED86}"">
                                        <x14:dataBar minLength=""0"" maxLength=""100"" gradient=""0"">
                                            <x14:cfvo type=""num"">
                                            <xm:f>0</xm:f>
                                            </x14:cfvo><x14:cfvo type=""num"">
                                            <xm:f>200</xm:f>
                                            </x14:cfvo><x14:negativeFillColor rgb=""FFFF0000""/>
                                            <x14:axisColor rgb=""FF000000""/>
                                        </x14:dataBar>
                                        </x14:cfRule>
                                        <xm:sqref>B1:B20</xm:sqref>
                                    </x14:conditionalFormatting>
                                    </x14:conditionalFormattings>
                                </ext>";
        var wsNode = xdoc.SelectSingleNode("/default:worksheet", nsm);
        wsNode.AppendChild(extLstWs);

Обратите внимание, как я получил два подузла<x14:conditionalFormattings> там, по одному для каждой панели данных.

Во-вторых, еще один список расширений для узлов правил условного форматирования необходимо добавить под узлом <cfRule>, также по одному для каждой панели данных.Я смог использовать цикл foreach, чтобы найти все панели данных в моей рабочей таблице и добавить один и тот же xml к каждой из них, как показано ниже:

        var cfNodes = xdoc.SelectNodes("/default:worksheet/default:conditionalFormatting/default:cfRule", nsm);
        foreach (XmlNode cfnode in cfNodes)
        {
            var extLstCfNormal = xdoc.CreateNode(XmlNodeType.Element, "extLst", xdoc.DocumentElement.NamespaceURI);
            extLstCfNormal.InnerXml = @"<ext uri=""{B025F937-C7B1-47D3-B67F-A62EFF666E3E}"" 
                            xmlns:x14=""http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"">
                            <x14:id>{3F3F0E19-800E-4C9F-9CAF-1E3CE014ED86}</x14:id></ext>";

            cfnode.AppendChild(extLstCfNormal);
        }

После выполнения вышеизложенного я наконец смог показать все свои панели данныхс твердой заливкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...