C # VSTO: окраска поворотных ячеек - PullRequest
2 голосов
/ 19 мая 2010

Привет, я пытаюсь сделать цвет кода сводной таблицей. Он прекрасно работает с окраской ячеек, но если я обновлю таблицу, все цвета исчезнут, как если бы цвета не были правильно прикреплены к сводной таблице.

У меня есть следующий код (это фрагмент кода большего размера):

myPivotTable.PivotSelect("'" + item["Name"].ToString() + "'[All;Total]", XlPTSelectionMode.xlDataAndLabel, true);

((Range)Globals.ThisWorkbook.Application.Selection).Interior.Color = 15962653;

Я пытался сделать макрос в Excel в VB, и когда он работает, он работает отлично, поэтому я не понимаю, почему C # VSTO не будет работать ...

ActiveSheet.PivotTables("PivotTable1").PivotSelect "'ItemName'[All;Total]", xlDataAndLabel, True

Selection.Interior.Color = 15962653

Помощь очень ценится:)

EDIT

Вот немного больше кода. BaseVars.GlobalWB - это переменная, которая ссылается на активную книгу (Globals.ThisWorkBook). Это позволяет одновременно работать с 2 Excels без использования кода VSTO на неправильной книге.

foreach (DataRow item in myPivotTableFields.Tables[0].Rows)
        {
// Field name from data sheet
            myPivotField = (PivotField)myPivotFields.Item(item["Name"].ToString());
            // Field name in the pivot table
            myPivotField.Caption = item["Caption"].ToString();
            // Their subtotal value
            myPivotField.set_Subtotals(Type.Missing, GenerateSubTotalArray(item["SubTotal"].ToString()));

            #region Attribs

            //Include new items in manual filter
            if (item["Attrib01"].ToString() == "True")
            {
                myPivotField.IncludeNewItemsInFilter = true;
            }
            else
            {
                myPivotField.IncludeNewItemsInFilter = false;
            }

            // Show items labels in outline form
            if (item["Attrib02"].ToString() == "Outline")
            {
                myPivotField.LayoutForm = XlLayoutFormType.xlOutline;
            }
            else
            {
                myPivotField.LayoutForm = XlLayoutFormType.xlTabular;
            }

            // Display labels from the next field in the same column
            if (item["Attrib03"].ToString() == "True")
            {
                myPivotField.LayoutCompactRow = true;
            }
            else
            {
                myPivotField.LayoutCompactRow = false;
            }

            // Display subtotals at the top of each group
            if (item["Attrib04"].ToString() == "AtBottom")
            {
                myPivotField.LayoutSubtotalLocation = XlSubtototalLocationType.xlAtBottom;
            }
            else
            {
                myPivotField.LayoutSubtotalLocation = XlSubtototalLocationType.xlAtTop;
            }

            // Insert blank line after each item label
            if (item["Attrib05"].ToString() == "True")
            {
                myPivotField.LayoutBlankLine = true;
            }
            else
            {
                myPivotField.LayoutBlankLine = false;
            }

            // Show items with no data
            if (item["Attrib06"].ToString() == "True")
            {
                myPivotField.ShowAllItems = true;
            }
            else
            {
                myPivotField.ShowAllItems = false;
            }

            // Insert page break after each item
            if (item["Attrib07"].ToString() == "True")
            {
                myPivotField.LayoutPageBreak = true;
            }
            else
            {
                myPivotField.LayoutPageBreak = false;
            }
            #endregion

            // Set up the pivot table selection
            if (item["Selection"].ToString() != "(blank)")
            {
                myItems = new List<string>();
                myItems = GlobalFunc.Explode(item["Selection"].ToString());
                SetUpPivotTableSelection(myPivotTable, item["Name"].ToString(), myItems);
            }
            else if (item["Selection"].ToString() == "(blank)" && item["Orientation"].ToString() == "Filter")
            {
                myPivotField.ClearAllFilters();
                myPivotField.CurrentPage = "(All)";
            }

try
                {
                    myPivotField.ClearValueFilters();
                    myPivotField.ShowDetail = true;
                }
                catch (Exception ex)
                {
                    GlobalFunc.DebugWriter("Error during Pivot Table Reset: " + ex.Message);
                }

try
                {
                    myPivotTable.PivotSelect("'" + item["Name"].ToString() + "'[All;Total]", XlPTSelectionMode.xlDataAndLabel, true);

                    // Set up the fields borders if it has any
                    myRange = BaseVars.GlobalWB.Application.get_Range(BaseVars.GlobalWB.Application.Selection, BaseVars.GlobalWB.Application.Selection);
                    myRange.Borders[XlBordersIndex.xlEdgeBottom].LineStyle = (XlLineStyle)InsertLineStyle(item["Attrib12"].ToString());
                    myRange.Borders[XlBordersIndex.xlEdgeLeft].LineStyle = (XlLineStyle)InsertLineStyle(item["Attrib13"].ToString());
                    myRange.Borders[XlBordersIndex.xlEdgeRight].LineStyle = (XlLineStyle)InsertLineStyle(item["Attrib14"].ToString());
                    myRange.Borders[XlBordersIndex.xlEdgeTop].LineStyle = (XlLineStyle)InsertLineStyle(item["Attrib15"].ToString());
                }
                catch (Exception ex)
                {
                    GlobalFunc.DebugWriter("<LI>Error occured: " + ex.Message + "</LI>");
                }

                // Insert the colors of the field, gradient or solid
                if (item["Color_Total2"].ToString() != null && item["Color_Total2"].ToString() != "")
                {
                    Base.InsertGradient(myRange, int.Parse(item["Color_Total1"].ToString().Replace("0x", ""), System.Globalization.NumberStyles.HexNumber), int.Parse(item["Color_Total2"].ToString().Replace("0x", ""), System.Globalization.NumberStyles.HexNumber), false);
                }
                else if (item["Color_Total1"].ToString() != null && item["Color_Total1"].ToString() != "")
                {
                    BaseVars.GlobalWB.Application.get_Range(BaseVars.GlobalWB.Application.Selection, BaseVars.GlobalWB.Application.Selection).Interior.Color = int.Parse(item["Color_Total1"].ToString().Replace("0x", ""), System.Globalization.NumberStyles.HexNumber);
                }
}

Ответы [ 3 ]

1 голос
/ 01 июня 2010

Если вы используете C # VSTO, не используйте Selection.Interior.Color. Вместо этого используйте Selection.Interior.ColorIndex. В Excel используется 56-цветная палитра, и любые цвета, указанные вами в C #, «переводятся» в один из этих цветов палитры. Допустимые значения ColorIndex находятся в диапазоне от 1 до 56. Также ознакомьтесь с этой полезной ссылкой на цветовую палитру и Excel.

http://www.mvps.org/dmcritchie/excel/colors.htm

0 голосов
/ 17 июня 2010

Я нашел совершенно другое решение для этой функции, поэтому мне больше не нужно ничего раскрашивать в сводной таблице =)

Я полностью переписал, поэтому вместо сохранения сводных таблиц в базе данных и их регенерации я просто сохраняю сводные таблицы в файлы xlsx и восстанавливаю их оттуда.

0 голосов
/ 22 мая 2010

Попробуйте вместо этого использовать шестнадцатеричное значение, например 0xFFFFFF.

Если это не сработает, попробуйте использовать XlRgbColor цветовые константы, такие как ((Range)Globals.ThisWorkbook.Application.Selection).Interior.Color = Excel.XlRgbColor.rgbCornflowerBlue;

Ограничение здесь заключается в том, что вы можете использовать только палитру Excel - если вы хотите, чтобы цвет был вне этого, вам придется изменить палитру либо программно , либо вручную . Если вашего цвета нет в палитре, Excel выберет наиболее близкое соответствие.

...