2010-05-19 146 views
2

嗨,我试图使一些代码颜色数据透视表。 它可以很好地为单元格着色,但如果刷新表格,所有的颜色都会消失,就好像颜色没有正确粘贴到数据透视表一样。C#VSTO:着色可移动单元格

我有以下代码(这是从更大的代码剪断):

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

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

我试着在VB做Excel中的宏,当它运行时,它完美地工作行为,免得我不明白为什么C#VSTO将无法正常工作......

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

Selection.Interior.Color = 15962653 

帮助是非常赞赏:)

编辑

这里有更多的代码。 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:下面的答案是否回答你的问题?如果没有,你可以发布更多的代码/细节,我会尽力提供更详细的分析。 – 2010-06-08 05:57:30

回答

0

尝试使用十六进制值代替,如0xFFFFFF

如果还是不行,请尝试使用XlRgbColor颜色常量像((Range)Globals.ThisWorkbook.Application.Selection).Interior.Color = Excel.XlRgbColor.rgbCornflowerBlue;

这里的限制是,你只能使用Excel的调色板 - 如果你想的那个之外的颜色,你就必须改变调色板可以是programaticallymanually。如果您的颜色不在调色板中,Excel将选择最接近的匹配项。

+0

终于回到了这个项目中。 无法使用十六进制工作:( – user344858 2010-06-10 11:56:34

+0

@tomboz:另外一个选项供您尝试,如上所述 – 2010-06-10 16:31:06

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 2010-06-10 11:57:09

0

我发现了一个完全不同的解决了这一功能,所以我不再需要在数据透视表上色任何=)

我做了一个完全重写,因此而不是保存数据透视表的DATABSE并重新生成它们,我只需将数据透视表保存为xlsx文件并从那里恢复它们。