2013-05-02 63 views
5

这是会发生什么:颜色的非连续细胞在Excel片

enter image description here

xlValues被设定为Excel.Range对象。

我曾尝试以下为好,全部给我同样的错误:

//xlValueRange = xlSheet... 
.get_Range("A1:A5,A15:A25,A50:A65"); 
.UsedRange.Range["A1:A5,A15:A25,A50:A65"]; 
.Range["A1:A5,A15:A25,A50:A65"]; 

xlApp.ActiveWorkbook.ActiveSheet.Range["A1:A5,A15:A25,A50:A65"]; 
//I have also tried these alternatives with ".Select()" after the brackets and 
//", Type.Missing" inside the brackets 

//This works though... 
xlSheet.Range["A1:A5"]; 

我试图重新着色特定的细胞在Excel工作表,我已经通过使用两个找到了解决办法循环,但它太慢了。通过30 000个单元格的列需要几分钟时间。

我从来没有做过这样的事情,我用this教程让我开始。

该解决方案使用布尔型数组,其单元格的颜色设置为true。 (recolored)

//using Excel = Microsoft.Office.Interop.Excel; 

xlApp = new Excel.Application(); 
xlApp.Visible = true; 
xlBook = xlApp.Workbooks.Add(Type.Missing); 
xlSheet = (Excel.Worksheet)xlBook.Sheets[1]; 

for (int i = 1; i < columns + 1; i++) 
{ 
    for (int j = 1; j < rows + 1; j++) 
    { 
     if (recolored[j, i]) 
      xlSheet.Cells[j+1, i+1].Interior.Color = Excel.XlRgbColor.rgbRed; 
     } 
    } 
} 

我想什么做的是这样的:

Excel.XlRgbColor[,] color; 
//Loop to fill color with Excel.XlRgbColor.rgbRed at desired cells. 

var startCell = (Excel.Range)xlSheet.Cells[1, 1]; 
var endCell = (Excel.Range)xlSheet.Cells[rows, columns]; 
var xlRange = xlSheet.Range[startCell, endCell]; 

xlRange.Interior.Color = color; 

这一次让我在最后一行的错误,虽然;

Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))


我的第一个猜测将是使一个Excel.Range对象覆盖我想有红色和使用该对象到位xlRange的,像这样的细胞:

RangeObject.Interior.Color = Excel.XlRgbColor.rgbRed; 

我不知道是否可以制作一个Excel.Range这样的空白对象,但我可以在这个上使用一些帮助。

回答

1

我有同样的问题,事实证明,这是一个糟糕的列表分隔符 - 在我的情况,而不是逗号应该有一个分号。

所以不是

.Range["A1:A5,A15:A25,A50:A65"]; 

尝试:

private string listSep = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator; 

.Range["A1:A5" + listSep + "A15:A25" + listSep + "A50:A65"]; 
+0

终于开始尝试这个解决方案。对不起,迟到接受,这是最后的解决方案:) – 2016-05-16 08:11:13

1

[RangeObject].Interior.Color更改单元格背景颜色。使用此

[RangeObject].Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red); 

对于细胞的文字,使用

[RangeObject].Font.Color 
+0

我知道这个选择,为什么比'Excel.XlRgbColor.rgbRed'好?如果你说我应该在第二个例子中使用它,我将不得不要求你进一步详细一点,因为我已经尝试过了,但无济于事。 – 2013-05-02 09:54:01

2

您可以通过使用范围的逗号分隔列表这样的选择不连续的单元格:

this.Application.ActiveWorkbook.ActiveSheet.Range["A2:A4,B3:B16"].Select(); 

然后,您可以重新 - 颜色的选择使用:

Selection.Interior.Color = ColorTranslator.ToOle(Color.Yellow); 

这将摆脱您遇到麻烦的着色循环。

另外,在VSTO加载项中,您通常不需要在代码中执行new Excel.Application()。加载项类中的this.Application应允许您访问Excel的活动实例。

UPDATE

下面是一段代码,应该帮助你针点您的问题。我为我的加载项添加了一个Ribbon,并向Ribbon添加了一个简单的按钮。这个按钮的Click事件的背后,我加入以下代码:

private void button1_Click(object sender, RibbonControlEventArgs e) 
    { 
     try 
     { 
      var App = Globals.ThisAddIn.Application; 

      if (App == null) 
       System.Windows.Forms.MessageBox.Show("App is null"); 
      else 
      { 
       var Sheet = App.ActiveSheet; 

       if (Sheet == null) 
        System.Windows.Forms.MessageBox.Show("Sheet is null"); 
       else 
       { 
        var Rng = Sheet.Range["A1:A5,A15:A25,A50:A65"]; 

        if (Rng == null) 
         System.Windows.Forms.MessageBox.Show("Rng is null"); 
        else 
        { 
         Rng.Select(); 
        } 
       } 
      } 
     } 
     catch (Exception ee) 
     { 
      System.Windows.Forms.MessageBox.Show("Exception: " + ee.Message); 
     } 
    } 

在我结束这段代码成功运行,并选择细胞的非连续范围。尝试一下你的目的,让我知道你看到了什么。

更新2

相同的代码工作对我来说在参照到Excel 14.0 WinForms应用程序(将有望与Excel 12.0工作太)。只需要一些小的改动。这是完整的代码。

private void button1_Click(object sender, RibbonControlEventArgs e) 
    { 
     try 
     { 
      var App = new Microsoft.Office.Interop.Excel.Application(); 

      if (App == null) 
       System.Windows.Forms.MessageBox.Show("App is null"); 
      else 
      { 
       App.Workbooks.Add(); 

       var Sheet = App.ActiveSheet; 

       if (Sheet == null) 
        System.Windows.Forms.MessageBox.Show("Sheet is null"); 
       else 
       { 

        Microsoft.Office.Interop.Excel.Range Rng = Sheet.get_Range("A1"); 

        Rng.Select(); 

        Rng = Sheet.get_Range("A1:A5,A15:A25,A50:A65"); 

        if (Rng == null) 
         System.Windows.Forms.MessageBox.Show("Rng is null"); 
        else 
        { 
         Rng.Select(); 

         App.Selection.Interior.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbYellow; 

         App.ActiveWorkbook.SaveAs("testtest.xlsx"); 

         App.Quit(); 
        } 
       } 
      } 
     } 
     catch (Exception ee) 
     { 
      System.Windows.Forms.MessageBox.Show("Exception: " + ee.Message); 
     } 
    } 
+0

'Excel.XlRgbColor.rgbRed'和'ColorTranslator.ToOle(Color.Yellow)'之间有什么区别,他们似乎都有效。感谢你的回答,我会看看我能用它做什么。 – 2013-05-02 09:51:13

+0

我还没有使用第一个,但你应该更喜欢那个我建议的,因为我包含一个函数调用,而你的是一个普通的常量值。 – dotNET 2013-05-02 09:53:00

+0

我正在使用数字('[1,1],[4,65]'见我上面的循环)找到单元格而不是名称('A1,D65')。我可以用数字选择不连续的单元吗? – 2013-05-02 11:30:12

0

范围地址字符串的最大长度为255。所以,你需要大块的列表中,这样每个合并范围地址节小于255长。

1

我也在这个问题上苦苦挣扎了很长时间。但是今天我相信我终于找到了解决方案(和原因)。

问题是,Excel使用当前区域设置来确定逗号运算符,即。两个范围之间的分隔符(不要问我为什么 - 对我来说,就像本地化函数名称一样疯狂)。

不管怎样,我的电脑上我有捷克区域设置于是就用分隔符是分号,不是逗号!如果我在Range方法的参数中使用它,它可以很好地工作。

从讨论中我得到的印象是,你是瑞典人,所以你可能有瑞典的语言环境设置。它的默认列表分隔符也是分号,因此我认为这也可能解决您的问题。你总是可以通过调用

System.Globalization.CultureInfo.InstalledUICulture.TextInfo.ListSeparator

希望这有助于检查分离器,电脑区域设置设置!

+0

我没有注意到@banataffer的答案,基本上表明相同。不过,我认为你应该检查'InstalledUICulture'而不是'CurrentCulture',因为这两者可能不同,Excel肯定不会使用你程序的特定文化。 – 2016-05-12 13:59:13

+0

这是很久以前,我没有打扰寻找旧项目尝试banantaffers答案。但我现在有空闲时间,而且这种方法很有效。三年(几乎到了一天),我终于得到了解决这个问题的方法:)我不能接受你的答案,因为banantaffer是第一个,但有一个当之无愧的upvote! – 2016-05-16 08:10:02