在Excel工作表中为非连续单元格着色

时间:2013-05-02 09:37:18

标签: c# excel office-interop

这就是:

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教程让我开始。

此解决方案使用bool数组,将要着色的单元格设置为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对象,但是我可以在这个问题上使用一些帮助。

5 个答案:

答案 0 :(得分: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的活动实例。

<强>更新

这是一段代码,可以帮助您指出问题所在。我在我的加载项中添加了一个功能区,并为功能区添加了一个简单的按钮。在此按钮的单击事件后面,我添加了以下代码:

    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

相同的代码在WinForms应用程序中适用于我,参考Excel 14.0(希望也可以使用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);
        }
    }

答案 1 :(得分:1)

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

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

对于单元格文本,请使用

[RangeObject].Font.Color

答案 2 :(得分: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"];

答案 3 :(得分:1)

我也很长时间都在努力解决这个问题。但今天我相信我终于找到了解决方案(和原因)。

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

无论如何,在我的电脑上我设置了捷克语区域设置,因此要使用的分隔符是分号,而不是逗号!如果我在Range方法的参数中使用它,它可以很好地工作。

从讨论中我得到的印象是你是瑞典语,所以你可能会设置瑞典语区域设置。它的默认列表分隔符也是分号,因此我觉得这可能也可以解决您的问题。您始终可以通过调用

来检查计算机区域设置中的分隔符集

System.Globalization.CultureInfo.InstalledUICulture.TextInfo.ListSeparator

希望这有帮助!

答案 4 :(得分:0)

范围地址字符串的最大长度为255.因此,您需要对列表进行分块,以使每个部分的组合范围地址长度小于255。