如何testingExcel文件中的任何非标题单元格是粗体还是斜体

我们使用包含一些业务逻辑的Excel工作表(因此它经常由非IT编辑)。 一些C ++代码是在VBA中从同一张表中生成的 – 傻,我知道。 我打算在这个工作表上写一堆unit testing,确保严格的格式,以利于所有人。 例如,应该按照字母顺序sorting。 以前我没做过这样的工作, 甚至不知道要使用哪个库。 为了让我的脚湿润,我想find除“自动颜色,简单样式,Arial,大小10”以外的字体 – 例如红色或粗体或大小11或ComicSans字体的所有单元格。 然后,我想检查这些单元格是否是“非标题”单元格。 “标题”单元是已知命名范围的一部分。 例如,如果这样的单元格属于一个命名的范围“XYZheaders”,那么它是好的。 如果不是,那么我希望报告一个单元格的坐标(理想的情况是每个有问题的单元格都像“D25”这样的可读取的东西,并且指出问题是否与颜色,字体types,样式或大小有关。

编辑:我只是把这个问题的赏金,因为我正在寻找一个完整的C#示例。 如果您认为我的问题含糊不清,请提问。

这是我的解决scheme。 我已经testing了一些Excel 2007文件(.xlsx)。 该程序可以使用VS 2010(针对.NET 4)与以下四个引用构build:Microsoft.CSharp,Microsoft.Office.Interop.Excel,System和System.Core。

使用.NET 4使得使用Excel更容易一些。

无论如何,这里的代码:

using System; using System.Collections.Generic; using System.Linq; using Excel = Microsoft.Office.Interop.Excel; namespace ExcelTest { class Program { static void Main(string[] args) { Excel.Application excelapplication = null; Excel.Workbook workbook = null; try { excelapplication = new Excel.Application(); workbook = excelapplication.Workbooks.Open(args[0]); var errors = new Dictionary<string, List<string>>(); foreach (Excel.Worksheet sheet in workbook.Sheets) { int rowCount = sheet.UsedRange.Cells.Rows.Count; int colCount = sheet.UsedRange.Cells.Columns.Count; var usedCells = sheet.UsedRange.Cells; for (int i = 1; i <= rowCount; i++) { for (int j = 1; j <= colCount; j++) { Excel.Range range = usedCells[i, j]; List<string> cellErrors; if (HasNonDefaultFont(range, out cellErrors)) { if (!IsHeaderCell(workbook, range)) { string cellDisplayTitle = String.Format("{0}!{1}", sheet.Name, range.Address); errors[cellDisplayTitle] = cellErrors; } } } } } ReportErrors(errors); } finally { if (workbook != null) workbook.Close(); if (excelapplication != null) excelapplication.Quit(); } } static bool HasNonDefaultFont(Excel.Range range, out List<string> differences) { differences = new List<string>(); if (range.Font.Color != 0.0) differences.Add("Has font-color"); if (range.Font.Bold) differences.Add("Is bold"); if (range.Font.Italic) differences.Add("Is italic"); if (range.Font.Underline != (int)Microsoft.Office.Interop.Excel.XlUnderlineStyle.xlUnderlineStyleNone) differences.Add("Is underline"); if (range.Font.Strikethrough) differences.Add("Is strikethrough"); if (range.Font.Name != "Arial") differences.Add(String.Format("Font is {0}", range.Font.Name)); if (range.Font.Size != 10) differences.Add(String.Format("Font size is {0}", range.Font.Size)); return differences.Count != 0; } static bool IsHeaderCell(Excel.Workbook workbook, Excel.Range range) { // Look through workbook names: foreach (Excel.Name namedRange in workbook.Names) { if (range.Parent == namedRange.RefersToRange.Parent && range.Application.Intersect(range, namedRange.RefersToRange) != null) return true; } // Look through worksheet-names. foreach (Excel.Name namedRange in range.Worksheet.Names) { if (range.Parent == namedRange.RefersToRange.Parent && range.Worksheet.Application.Intersect(range, namedRange.RefersToRange) != null) return true; } return false; } static void ReportErrors(Dictionary<string, List<string>> errors) { if (errors.Count > 0) { Console.WriteLine("Found the following errors:"); Console.WriteLine("---------------------------------"); Console.WriteLine("{0,-15} | Error", "Cell"); Console.WriteLine("---------------------------------"); } foreach (KeyValuePair<string, List<string>> kv in errors) Console.WriteLine("{0,-15} | {1}", kv.Key, kv.Value.Aggregate((e, s) => e + ", " + s)); } } } 

该程序假设一个excel文件的名称作为其第一个参数。 打开该文件,并根据不同的字体标准testing每个单元格。 使用“非默认字体”的单元格会针对指定的范围进行testing,而落在这些范围之外的单元格将输出到控制台。

像往常一样error handling应该添加到程序 – 但希望这应该让你开始。

这应该做的伎俩,享受。 请记住,input新的范围名称不会触发包含此function的单元格的重新计算(因此创build范围名称后按F9 )。

 Option Explicit Public Function IsDataCellBoldOrItalic() As Boolean Dim rngName As Name Dim intersectRange As Name For Each rngName In ActiveWorkbook.Names If Not Intersect(rngName.RefersToRange, Application.ThisCell) Is Nothing Then IsDataCellBoldOrItalic = False Exit Function End If Next ''# Now we know we are not in a "header" cell IsDataCellBoldOrItalic = Application.ThisCell.Font.Bold Or Application.ThisCell.Font.Italic End Function