如何使用Excel格式的Excel格式引用另一个工作簿中的单元格?

时间:2018-03-23 18:31:55

标签: c# excel excel-formula excel-interop cell-formatting

我有两个来自不同工作簿的工作表:一个是我正在编辑的(xlwkstTempSummary),另一个是我要比较的值(xlwkstSummary)。我想根据导入工作表中的值将背景颜色应用于临时工作表中的单个列。这是我当前代码的片段:

Excel.Workbook xlwkbkImport = books.Open(file_location,misValue, true, 
    misValue, misValue, misValue, true, misValue, misValue, misValue, false, 
    misValue, misValue, misValue, 0);

Excel.Sheets sheets = xlwkbkImport.Worksheets;
Excel.Worksheet xlwkstSummary = (Excel.Worksheet)sheets.get_Item(1);

Excel.Range r = xlwkstTempSummary.get_Range("F" + summary_start_row.ToString(), "F" + (summary_start_row + clinic_row_count - 1).ToString());
string file_name = file_location.Name;
string file_directory = Path.GetDirectoryName(file_location);
Excel.FormatConditions r_format = r.FormatConditions;

Excel.FormatCondition c1 = r_format.Add((Excel.XlFormatConditionType)2) /*format based on expression*/,
                misValue,
                @"=AND(AND($G" + summary_start_row + @"<>""4 Star"", $G" + 
                summary_start_row + @"<>""5 Star"", $G" +
                summary_start_row + @"<>""75th"", $G" + 
                summary_start_row + @"<>""90th""), $F" +
                summary_start_row + @"<VLOOKUP($C" + summary_start_row + 
                @",'" + file_directory + @"[" + file_name + @"]Summary'!$A$9:$D$41,4,FALSE))", 
                misValue, misValue, misValue, misValue, misValue); 
Excel.Interior c1_interior = c1.Interior;
c1_interior.Color = Color.FromArgb(216, 49, 49); //Red

我目前正在使用vlookup从导入的工作表中获取我需要的值,并且直接在excel中编写时表达式工作正常,但是当我运行程序时,我收到以下错误:

System.ArgumentException:参数不正确。 (HRESULT异常:0x80070057(E_INVALIDARG))    at System.RuntimeType.ForwardCallToInvokeMember(String memberName,BindingFlags flags,Object target,Int32 [] aWrapperTypes,MessageData&amp; msgData)

我能想到它失败的唯一原因是无法在我的vlookup调用中正确解析导入的工作簿的名称。是否有人更熟悉Microsoft.Office.Interop.Excel库可以解释这个问题?

1 个答案:

答案 0 :(得分:0)

好的,所以我无法弄清楚为什么我对导入的工作簿的引用不起作用。我确实发现Path.GetPathDirectory(1)函数返回结尾没有“\”的文件路径,但添加它并没有改变错误。

我已经了解到我的原始方法存在缺陷,因为如果文件已在excel中打开,则VLookup将仅返回值,否则将询问文件的位置。这显然不是我想要的,因为这是一个自动化过程。

我的问题的解决方案是创建一个带有“非常隐藏”可见性的新工作表:

Excel.Worksheet xlwkstTempDataStore = TempSheets.Add(misValue, xlwkstTempCareGaps, misValue, misValue);
xlwkstTempDataStore.Name = "data";
xlwkstTempDataStore.Visible = (Excel.XlSheetVisibility)2; //Very Hidden

将数据从导入的工作簿复制到我的新工作表后,我只需要在我的VLookup中引用非常隐藏的工作表:

Excel.FormatCondition c1 = r_format.Add((Excel.XlFormatConditionType)2 /*format based on expression*/,
                                misValue,
                                @"=AND(AND($G" + summary_start_row + @"<>""4 Star"", $G" + summary_start_row + @"<>""5 Star"", $G" +
                                    summary_start_row + @"<>""75th"", $G" + summary_start_row + @"<>""90th""), $F" +
                                    summary_start_row + @"<VLOOKUP($C" + summary_start_row + @",data!$A$9:$D$" + last_data_store_row + @",4,FALSE))", 
                                misValue, misValue, misValue, misValue, misValue); 
                Excel.Interior c1_interior = c1.Interior;
                c1_interior.Color = Color.FromArgb(216, 49, 49); //Red