Продолжение предыдущей статьи про просмотр документов MS Office из приложения WPF.
Слегка переделаем контрол из предыдущей части для работы с таблицами Excel.
Переменные
private Word.Application word;
private Word.Document document;
заменим на
private Excel.Application excel;
private Excel.Workbook workbook;
Методы запуска/закрытия StartWord() и CloseWord() заменим на
/// <summary>
/// Запустить Excel
/// </summary>
private void StartExcel()
{
this.excel = new Excel.Application();
this.excel.Application.Caption = "EXCEL VIEWER";
this.excel.AutoRecover.Enabled = false;
// окно развёрнуто во весь экран => нормальное состояние
this.excel.WindowState = Excel.XlWindowState.xlNormal;
this.originalExcelWindowWidth = this.excel.Width;
this.originalExcelWindowHeight = this.excel.Height;
this.originalExcelWindowLeft = this.excel.Left;
this.originalExcelWindowTop = this.excel.Top;
this.excel.Width = 0.0;
this.excel.Height = 0.0;
this.excel.Left = -100;
this.excel.Top = -100;
this.excel.Visible = true;
this.excel.DisplayFullScreen = true;
foreach (Process proc in Process.GetProcessesByName("excel"))
if (proc.MainWindowTitle == "EXCEL VIEWER")
this.process = proc;
SetParent(this.process.MainWindowHandle, this.excelContainer.Handle);
ShowWindow(this.process.MainWindowHandle, SW_SHOWMAXIMIZED);
MakeExternalWindowBorderless(this.process.MainWindowHandle);
WindowsReStyle(this.process.MainWindowHandle);
MoveWindow(this.process.MainWindowHandle, -3, -3, this.excelContainer.Width + 6, this.excelContainer.Height + 6, true);
}
/// <summary>
/// Закрыть Excel
/// </summary>
private void CloseExcel()
{
if ((this.excel != null))
{
if (this.excel.Workbooks.Count > 0)
this.workbook.Close(SaveChanges: false);
foreach (string cb in this.hiddenBars)
this.excel.CommandBars[cb].Visible = true;
this.excel.DisplayFullScreen = false;
this.excel.Width = this.originalExcelWindowWidth;
this.excel.Height = this.originalExcelWindowHeight;
this.excel.Left = this.originalExcelWindowLeft;
this.excel.Top = this.originalExcelWindowTop;
this.excel.Quit();
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.ReleaseComObject(this.workbook);
Marshal.ReleaseComObject(this.excel);
}
}
Методы открытия/закрытия таблицы
/// <summary>
/// Открыть таблицу
/// </summary>
/// <param name="path">Путь к таблице Excel</param>
public void OpenExcelDocument(string path)
{
if (this.excel == null)
this.StartExcel();
foreach (Microsoft.Office.Core.CommandBar cb in this.excel.CommandBars)
{
if (cb.Visible && cb.Name != "Full Screen" && cb.Name != "Worksheet Menu Bar")
{
try
{
if (!this.hiddenBars.Contains(cb.Name))
this.hiddenBars.Add(cb.Name);
cb.Visible = false;
}
catch { }
}
}
if (this.excel.Workbooks.Count > 0)
this.workbook.Close(SaveChanges: false);
this.workbook = this.excel.Workbooks.Open(Filename: path, ReadOnly: true);
}
/// <summary>
/// Закрывает текущую таблицу
/// </summary>
public void CloseExcelDocument()
{
if (this.excel != null && this.excel.Workbooks.Count > 0)
this.workbook.Close(SaveChanges: false);
}
/// <summary>
/// Печатает текущий документ на принтере по умолчанию
/// </summary>
public void PrintExcelDocument()
{
if (this.excel != null && this.excel.Workbooks.Count > 0)
{
//this.workbook.PrintOutEx();
(this.workbook.ActiveSheet as Excel.Worksheet).PrintOutEx();
}
}
Изменим DependencyProperty File WPF-контрола
/// <summary>
/// Путь к файлу
/// </summary>
public string File
{
get { return (string)this.GetValue(FileProperty); }
set { this.SetValue(FileProperty, value); }
}
public static readonly DependencyProperty FileProperty = DependencyProperty.Register("File", typeof(string), typeof(Excel), new PropertyMetadata(null, OnFilePropertyChanged));
public static void OnFilePropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
{
Excel ech = sender as Excel;
if (ech == null || ech.control == null)
return;
if (string.IsNullOrWhiteSpace((string)e.NewValue))
ech.control.CloseExcelDocument();
else
ech.control.OpenExcelDocument((string)e.NewValue);
}
Всё остальное остаётся без изменений.
В следующей статье сделаем пробный проект и посмотрим что у нас получилось.