2010-05-19 3 views
2

HI, я пытаюсь сделать некоторый цвет кода сводной таблицей. Он прекрасно подходит для раскрашивания ячеек, которые он должен использовать, но если я обновляю таблицу, все цвета исчезают, как если бы цвета не были должным образом привязаны к сводной таблице.C# VSTO: Окрашивание выделенных ячеек

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

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); 
       } 
} 
+0

@tomboz: делает ниже ответ на ваш вопрос? если нет, можете ли вы разместить больше кода/деталей, и я попытаюсь предоставить более подробный анализ. –

ответ

0

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

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

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

+0

Наконец-то вернулся в этот проект. И не может заставить его работать, используя hex :( – user344858

+0

@tomboz: еще один вариант для вас, как описано выше. –

1

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

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

+0

Это тоже не работает ... Он окрашивает ячейки, но обновляет сводную таблицу снова делает ячейки белыми ... Это доказывает твердую гайку для взлома – user344858

0

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

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