Office
一套 Microsoft 高效工作软件,支持常见业务任务,包括文字处理、电子邮件、演示文稿以及数据管理和分析。
28 个问题
我有两个数据表。
我只想比较每个单元格值的两个数据表。如果数据表值有任何不匹配之处,我们必须在 DataTable-1 中突出显示,并且必须在 Excel 中更新。
怎么做..?
Note:此问题总结整理于: how to highlight cells in excel from two data table using c#
我写了一段代码来实现这一点,并将结果存储在表格格式:
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();
为了方便起见,我直接写了范围。在实际使用中,需要将其作为参数传递给该方法。
应该注意的是,我使用了范围。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);
}
在这种情况下,只需要一个参数来指定结果表的范围。
如果回复有帮助,请点击“接受答案”并点赞。 注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。