这就是:
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
对象,但是我可以在这个问题上使用一些帮助。
答案 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。