Excelファイルの非ヘッダーセルが太字であるかイタリックであるかをテストする方法

StackOverflow https://stackoverflow.com/questions/3188303

質問

いくつかのビジネスロジックを含むExcelシートを使用します(したがって、それはしばしば非ITによって編集されます)。一部のC ++コードは、同じシートからVBAで生成されます - ばかげています、私は知っています。このワークシートに対して多くのユニットテストを書いて、すべての利益のために厳格な形式を確保する予定です。たとえば、物事はアルファベット順にソートする必要があります。私はこれまでこの種の仕事をしたことがありません。どのライブラリを使用するかさえわかりません。足を濡らすには、「自動色、プレーンスタイル、アリアル、サイズ10」以外のフォントを持つすべてのセルを見つけたいと思います。たとえば、赤または太字またはサイズ11、またはComicsansフォントです。次に、これらの細胞が「非ヘッダー」細胞であるかどうかを確認したいと思います。 「ヘッダー」セルは、既知の範囲の一部であるセルです。たとえば、そのようなセルが名前付き範囲「Xyzheaders」に属している場合、それは大丈夫です。そうでない場合は、セルの座標を報告したいと思います(問題があるすべてのセルで「D25」のような人間が読み取るものとして、問題が色、フォントタイプ、スタイル、またはサイズのものであるかどうかを示したいと思います。 。

編集: 完全なC#サンプルを探しているので、この質問に賞金をかけました。私の質問が曖昧だと思うなら、質問してください。

役に立ちましたか?

解決

これが私の解決策です。 Excel 2007ファイル(.xlsx)でテストしました。このプログラムは、次の4つの参照を使用して、VS 2010(ターゲティング.NET 4)を使用して構築できます: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ファイルの名前を最初の議論として想定しています。このファイルが開かれ、各セルは異なるフォント基準に対してテストされます。 「非デフォルトフォント」のセルは、指定された範囲に対してテストされ、これらの範囲の外側にあるセルはコンソールに出力されます。

いつものように、いくつかのエラーハンドリングをプログラムに追加する必要がありますが、うまくいけば、これにより開始する必要があります。

他のヒント

これはトリックをするはずです、楽しんでください。新しい範囲名を入れると、この関数を含むセルの再計算がトリガーされないことに留意してください(したがって、ヒットします 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top