如何使用C#突出显示Excel中两个数据表中的单元格

Jiale Xue - MSFT 34,201 信誉分 Microsoft 供应商
2024-04-15T05:41:56.04+00:00

我有两个数据表。

我只想比较每个单元格值的两个数据表。如果数据表值有任何不匹配之处,我们必须在 DataTable-1 中突出显示,并且必须在 Excel 中更新。

怎么做..?

Note:此问题总结整理于: how to highlight cells in excel from two data table using c#

Office
Office
一套 Microsoft 高效工作软件,支持常见业务任务,包括文字处理、电子邮件、演示文稿以及数据管理和分析。
25 个问题
C#
C#
一种面向对象的类型安全的编程语言,它起源于 C 语言系列,包括对面向组件的编程的支持。
111 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Hui Liu-MSFT 40,666 信誉分 Microsoft 供应商
    2024-04-15T09:19:40.98+00:00

    我写了一段代码来实现这一点,并将结果存储在表格格式:

     Microsoft.Office.Interop.Excel.Application application = new Microsoft.Office.Interop.Excel.Application();  
                Workbook workbook = application.Workbooks.Open(@"D:\test44\excel\test1.xlsx");  
                Worksheet xlWorksheet = (Worksheet)workbook.Sheets[1];  
      
                Range range1 = xlWorksheet.get_Range("B6", "F11");  
                object[,] valueArray = (object[,])range1.get_Value(XlRangeValueDataType.xlRangeValueDefault);  
      
                Range range2 = xlWorksheet.get_Range("H6", "L11");  
                object[,] valueArray2 = (object[,])range2.get_Value(XlRangeValueDataType.xlRangeValueDefault);  
      
                List<Tuple<int, int>> res = new List<Tuple<int, int>>();  
      
                for (int i = 1; i <= valueArray.GetLength(0); i++)  
                {  
                    for (int j = 1; j <= valueArray.GetLength(1); j++)  
                    {  
                        if (valueArray[i, j].ToString() != valueArray2[i, j].ToString())  
                        {  
                            res.Add(new Tuple<int, int>(i, j));  
                        }  
                    }  
                }  
      
                string rangeStart = "B14";  
                string rangeEnd = "F19";  
               
                Range range = xlWorksheet.get_Range(rangeStart, rangeEnd);  
                range.set_Value(XlRangeValueDataType.xlRangeValueDefault, valueArray2);  
                xlWorksheet.ListObjects.Add(XlListObjectSourceType.xlSrcRange, range,  
          Type.Missing, XlYesNoGuess.xlYes, Type.Missing).Name = "TestTable";  
                xlWorksheet.ListObjects["TestTable"].TableStyle = "TableStyleMedium3";  
                 
                foreach (var item in res)  
                {  
                    string cell = (char)(item.Item2 + 64) + item.Item1.ToString();  
                    Console.WriteLine(cell);  
                    range.Range[cell].Font.Color = ColorTranslator.ToOle(Color.Red);  
                }  
      
                workbook.Save();  
                workbook.Close();  
                application.Quit();  
    

    56501-capture.png 为了方便起见,我直接写了范围。在实际使用中,需要将其作为参数传递给该方法。

    应该注意的是,我使用了范围。Range[cell] 在代码中。这个“单元格”的位置是相对于“range”对象的,而不是相对于整个excel文件的。例如,如果“cell”是“C3”,它实际上是这张纸的“C16”,这是图片中第一个突出显示的单元格。

    而且,如果可能的话,我建议您还将初始表修改为与结果表相同的格式,以便您可以使用以下代码获取其值,而无需指定范围。

                List<object[,]> tables = new List<object[,]>();  
                for (int i = 1; i <= xlWorksheet.ListObjects.Count; i++)  
                {  
                    Range srcRow = xlWorksheet.ListObjects[i].Range;  
                    object[,] valueArray = (object[,])srcRow.get_Value(  
        XlRangeValueDataType.xlRangeValueDefault);  
                    tables.Add(valueArray);  
                }  
    

    在这种情况下,只需要一个参数来指定结果表的范围。


    如果回复有帮助,请点击“接受答案”并点赞。 注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。

    1 个人认为此答案很有帮助。
    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助