Frage

Wir verwenden eine Excel-Tabelle, die einige Business-Logik enthält (und so ist es oft von Nicht-IT bearbeitet wird). Some C ++ Code in VBA aus dem gleichen Blatt erzeugt - dumm, ich weiß. Ich plane eine Reihe von Unit-Tests gegen dieses Arbeitsblatt zu schreiben, strenges Format zum Wohl aller zu gewährleisten. Zum Beispiel sollten die Dinge alphabetisch sortiert werden. Ich habe nicht diese Art von Arbeit vorher getan; nicht einmal sicher, welche Bibliothek zu verwenden. Um meine Füße nass wird, würde Ich mag alle Zellen finden, die andere Schrift hat als „automatische Farbe, normale Art, Arial, Größe 10“ - zum Beispiel rot oder fett oder Größe 11 oder Comic Sans MS Schriftart. Dann möchte ich überprüfen, ob diese Zellen „nicht-Header“ Zellen sind. Die „header“ Zellen sind solche, die Teil der bekannten benannten Bereiche sind. Zum Beispiel, wenn eine solche Zelle gehört zu einem benannten Bereich „XYZheaders“ ist, dann ist es OK. Wenn nicht, dann mag ich die Koordinaten einer Zelle berichten (idealerweise als etwas vom Menschen lesbar wie „D25“ für jede Zelle, die ein Problem hat, sowie angeben, ob das Problem mit der Farbe, Schriftart, Stil oder Größe .

EDIT: Ich habe Prämie nur auf diese Frage, weil ich für eine vollständige C # Probe suchen. Bitte stellen Sie Fragen, wenn Sie denken, dass meine Frage nicht eindeutig ist.

War es hilfreich?

Lösung

Hier ist meine Lösung. Ich habe es mit einigen Excel 2007-Dateien (.xlsx) getestet. Microsoft.CSharp, Microsoft.Office.Interop.Excel, System und System.Core: Das Programm kann mit den folgenden vier Referenzen unter Verwendung von VS 2010 (Targeting .NET 4) gebaut werden.

Mit .NET 4 macht es etwas leichte Arbeit mit Excel.

Wie auch immer hier ist der Code:

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));
        }
    }
}

Das Programm nimmt den Namen einer Excel-Datei als erstes Argument. Diese Datei wird geöffnet und jede Zelle ist gegen verschiedene font-Kriterien getestet. Die Zellen, die mit „Nicht-Standard-Schriftart“ wird getestet, gegen die genannten reichte, und diejenigen, die außerhalb dieser Bereiche fallen, sind auf der Konsole.

Wie üblich einige Fehlerbehandlung in das Programm aufgenommen werden soll -. Aber hoffentlich sollte dies Ihnen den Einstieg

Andere Tipps

Das sollte es tun, genießen. Beachten Sie, dass in neuen Range Names setzen keinen recalc einer Zelle auslösen diese Funktion enthält (Hit so F9 nach Bereichsnamen erstellen).

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top