여기 내 해결책이 있습니다. 일부 Excel 2007 파일 (.xlsx)로 테스트했습니다. 이 프로그램은 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));
}
}
}
이 프로그램은 첫 번째 인수로 엑셀 파일의 이름을 가정합니다. 이 파일이 열리고 각 셀은 다른 글꼴 기준에 대해 테스트됩니다. "non-default-font"가있는 셀은 ranged에 대해 테스트되고이 범위를 벗어나는 셀은 콘솔에 출력됩니다.
평상시처럼 프로그램에 오류 처리 기능을 추가해야합니다. 그러나이 기능을 시작하면 좋을 것입니다.
멋지다. 이것은 보통'VB.Net'인가? 나는 이것을'C#'로 쉽게 번역 할 수 있다고 생각한다. –
@Hamish : 통합 문서 내에서 실행할 VBA입니다. – technomalogical
흠 ... 나는 이것을 사용할 수 있다고 생각하지만 Excel 파일을로드하고 분석하는 C# 코드를 선호합니다. –