M
Der Zugriff auf Excel über die Microsoft Office Interop Assemblies ist an sich sehr gut dokumentiert. Die PIA's sind rückwertskompatibel, d.h. wenn Du dein Projekt mit den PIA's zu Office 2003 kompilierst, wird Deine Anwendung auch dann laufen, wenn auf dem Zielcomputer die Office 2007 PIA's installiert sind. Da es hier nur um COM Interop geht, und die Anwendung Excel auf dem Rechner installiert sein muss, werden alle Excel-Versionen unterstützt, welche das installierte Microsoft Office-Paket auch unterstützt. Wenn Du dir nicht sicher sein kannst, dass Excel auf dem Zielrechner installiert ist, solltest Du die PIA's nicht verwenden, sie bringen nichts. COM-Interop ist langsam, wenn Du Performanz brauchst, ist es keine gute Idee. COM-Interop hat seine Tücken. Wenn Du z.B. eine aus .NET über Automatisierung geöffnete Excel-Instanz schließen willst, MUSST Du als Interop-Akrobat begabt sein. Machst Du hier Fehler, wird die Excel-Instanz nicht geschlossen und ein Speicher-Leck beginnt. Ein Beispiel. Dieser Code öffnet eine Datei, formatiert die erste Zelle um und schließt die Datei bzw. Excel. Und so sieht es aus:
using System;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;
namespace ExcelCharacters
{
static class Program
{
[STAThread]
static void Main()
{
ApplicationClass exApp = new ApplicationClass();
Workbook workbook = exApp.Workbooks.Open(
System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"Data.xls"),
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing
);
Worksheet worksheet = (Worksheet)workbook.Worksheets[1];
object missing = Type.Missing;
Range firstCell = worksheet.get_Range("A1", missing);
int length = firstCell.Value2.ToString().Length;
Console.WriteLine(String.Format("Formatting '{0}'", firstCell.Value2.ToString()));
for (int i = 1; i <= length; i = i + 2)
{
firstCell.get_Characters(i, 1).Font.ColorIndex = 32;
firstCell.get_Characters(i, 1).Font.Bold = true;
}
workbook.Save();
// Hexenküche...
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.FinalReleaseComObject(firstCell);
firstCell = null;
Marshal.FinalReleaseComObject(worksheet);
worksheet = null;
workbook.Close(false, Type.Missing, Type.Missing);
Marshal.FinalReleaseComObject(workbook);
workbook = null;
exApp.Quit();
Marshal.FinalReleaseComObject(exApp);
exApp = null;
Console.WriteLine("Press ENTER");
Console.ReadLine();
}
}
}
Wenn Du sowas brauchst, dann ist dies der richtige Weg.