Доброе время суток Хаброжители.
Буквально на днях, ко мне и моим коллегам обратились «опытные пользователи» Excel. По специфике работы «опытные пользователи» часто используют офисный пакет для оформления документации. Как ни странно, таблицы Excel так же часто встречаются. Как и на Хабре, не допустимо выпускать документы с орфографическими ошибками. Стандартной возможности excel, по подсветке орфографических ошибок нет. В связи с этим я разработал Add-ins для Excel который бы реализовывал такой функционал.
Проверить наличие ошибок не так и сложно, есть стандартный SpellCheck, которым я и воспользовался. Реализовывать предполагается 2 части:
1) проверка уже заполненных ячеек
2) проверка в реальном времени при вводе.
Сама логики работы простая, В первом случае проверяем все ячейки, если есть ошибка, выделяем лексемы и проверяем каждую лексему отдельно, для ошибочных лексем, создаем примечание и выделяем ошибочную лексему красным цветом. Во втором случае просто подписываемся на событие изменения ячейки и делаем все как в 1 случае только с меньшим диапазоном.
Приступим:
Запускаем VisualStudio, создаем расширение для Excel 2007.
При регистрации плагина, подпишемся на событие Cell-Changed и вызовем нашу функцию (функция будет описана чуть позже).
Больше при регистрации ничего делать не будем. Проверку всей книги оставим пользователю по вызову.
Создаем свою вкладку в Ribbon. Добавляем новый Item Ribbon (Visual Designer)/
Создадим новую вкладку, первую не трогаем, т.к. она зарезервирована.
Так же, добавим 2 кнопки проверки: проверка всей книги, и проверку текущего листа.
Пропишем в событиях кнопок следующий код
Для всей книги
Для листа
Ну и самое главное, создадим статичный класс SpellCheck в котором и опишем нашу функцию проверки
После компиляции и загрузки плагина проверяем работу

Это всё чего не хватало Excel для автоматической проверки.
Как всегда, если у вас есть более интересные методы реализации, делитесь опытом
UPD: По просьбам хаброжителей, выложил готовый Плагин тут
Буквально на днях, ко мне и моим коллегам обратились «опытные пользователи» Excel. По специфике работы «опытные пользователи» часто используют офисный пакет для оформления документации. Как ни странно, таблицы Excel так же часто встречаются. Как и на Хабре, не допустимо выпускать документы с орфографическими ошибками. Стандартной возможности excel, по подсветке орфографических ошибок нет. В связи с этим я разработал Add-ins для Excel который бы реализовывал такой функционал.
Проверить наличие ошибок не так и сложно, есть стандартный SpellCheck, которым я и воспользовался. Реализовывать предполагается 2 части:
1) проверка уже заполненных ячеек
2) проверка в реальном времени при вводе.
Сама логики работы простая, В первом случае проверяем все ячейки, если есть ошибка, выделяем лексемы и проверяем каждую лексему отдельно, для ошибочных лексем, создаем примечание и выделяем ошибочную лексему красным цветом. Во втором случае просто подписываемся на событие изменения ячейки и делаем все как в 1 случае только с меньшим диапазоном.
Приступим:
Запускаем VisualStudio, создаем расширение для Excel 2007.
При регистрации плагина, подпишемся на событие Cell-Changed и вызовем нашу функцию (функция будет описана чуть позже).
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
//Подпишемся на событие изменения ячейки
Globals.ThisAddIn.Application.Cells.Worksheet.Change += new Excel.DocEvents_ChangeEventHandler(Worksheet_Change);
}
void Worksheet_Change(Excel.Range Target)
{
SpellCheck.SpellChecker(Target);
}
Больше при регистрации ничего делать не будем. Проверку всей книги оставим пользователю по вызову.
Создаем свою вкладку в Ribbon. Добавляем новый Item Ribbon (Visual Designer)/
Создадим новую вкладку, первую не трогаем, т.к. она зарезервирована.
Так же, добавим 2 кнопки проверки: проверка всей книги, и проверку текущего листа.
Пропишем в событиях кнопок следующий код
Для всей книги
private void OrfoCheckAll_Click(object sender, RibbonControlEventArgs e)
{
var excel = Globals.ThisAddIn.Application;
var wss = excel.Worksheets;
var app = excel.Application;
foreach (var ws in wss)
{
var sheet = ws as Excel.Worksheet;
if (sheet != null)
{
var range = sheet.UsedRange;
foreach (var cll in range)
{
var cell = cll as Excel.Range;
SpellCheck.SpellChecker(cell);
}
}
}
}
Для листа
private void OrfoCheckCurrentSheet_Click(object sender, RibbonControlEventArgs e)
{
var excel = Globals.ThisAddIn.Application;
var app = excel.Application;
var sheet = app.ActiveSheet as Excel.Worksheet;
if (sheet != null)
{
var range = sheet.UsedRange;
foreach (var cll in range)
{
var cell = cll as Excel.Range;
SpellCheck.SpellChecker(cell);
}
}
}
Ну и самое главное, создадим статичный класс SpellCheck в котором и опишем нашу функцию проверки
public static class SpellCheck
{
public static void SpellChecker(Excel.Range Target)
{
var app = Globals.ThisAddIn.Application.Application;
string str = Target.Text.ToString();
if (app.CheckSpelling(str, Type.Missing, true) == false)
{
foreach (string tmp in ((string)str).Split(' '))
{
if (app.CheckSpelling(tmp, Type.Missing, Type.Missing) == false)
{
if (Target.Comment == null)
{
Target.AddComment("Ошибка в слове " + tmp);
Target.Characters[str.IndexOf(tmp) + 1, tmp.Length].Font.ColorIndex = 3;
}
else
{
Excel.Characters c = Target.Comment.Shape.TextFrame.Characters(Type.Missing, Type.Missing);
if (!c.Caption.Contains(tmp))
{
c.Caption = c.Caption + " " + tmp;
}
Target.Characters[str.IndexOf(tmp) + 1, tmp.Length].Font.ColorIndex = 3;
}
}
else
{
Target.Characters[str.IndexOf(tmp) + 1, tmp.Length].Font.ColorIndex = 0;
}
}
}
else
{
if (Target.Comment != null)
{
if (Target.Comment.Shape.AlternativeText.Contains("Ошибка в слове "))
{
Target.Characters[str.IndexOf(str), str.Length].Font.ColorIndex = 0;
Target.Comment.Delete();
}
}
}
}
После компиляции и загрузки плагина проверяем работу

Это всё чего не хватало Excel для автоматической проверки.
Как всегда, если у вас есть более интересные методы реализации, делитесь опытом
UPD: По просьбам хаброжителей, выложил готовый Плагин тут