/*************************************\ * Excel-Dokumente lesen und * * bearbeiten * * * * Kapitel: Erweiterte * * Programmierthemen * * Zuordnung: C#-Buch V2.0 14.2 * * * * Copyright 2015 by Benjamin Jung * \*************************************/ using System; using System.Windows.Forms; using Microsoft.Office.Interop.Excel; // zusätzlich ist der Projektverweis auf COM -> Microsoft Excel xx-Objectlibrary namespace CSV20.Excel { public partial class Form1 : Form { // oExcelApp benötigt den kompletten Namensraum, da andernfalls der Compiler den Unterschied zwischen // "Microsoft.Office.Interop.Excel.Application" und "System.Windows.Forms.Application" nicht erkennen kann private Microsoft.Office.Interop.Excel.Application oExcelApp = new Microsoft.Office.Interop.Excel.Application(); private Workbook oWorkbook = null; private Worksheet oWorksheet = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Range oRange; string sSpaltenName; object oValue; if (openFileDialogExcel.ShowDialog() == System.Windows.Forms.DialogResult.OK) { // Datei öffnen und aktives Blatt und benutzten Bereich auswählen oWorkbook = oExcelApp.Workbooks.Open(openFileDialogExcel.FileName); oWorksheet = (Worksheet)oWorkbook.ActiveSheet; oRange = oWorksheet.UsedRange; // Zellen vom Dokument in die Ansicht laden for (int i = 0; i < oRange.Columns.Count; i++) { if (i >= dataGridViewExcel.Columns.Count) { // bilden der Spalten-Namen: A, B, C, D, E, ..., A1, B1, C1, ..., A2, B2, ... sSpaltenName = ((char)('A' + i % 26)).ToString(); if (Math.Floor(i / 26.0) != 0) sSpaltenName += Math.Floor(i / 26.0).ToString(); dataGridViewExcel.Columns.Add(sSpaltenName, sSpaltenName); } for (int j = 0; j < oRange.Rows.Count; j++) { // Zeilen werden nur beim 1. Durchlauf hinzugefügt if (i == 0) { dataGridViewExcel.Rows.Add(); } oValue = (oRange.Cells[j + 1, i + 1] as Range).Value; // muss unbedingt abgefangen werden if (oValue != null) { dataGridViewExcel.Rows[j].Cells[i].Value = oValue.ToString(); } } } // Fenster minimieren und danach wieder in normale Fenstergröße zurückkehren, // dies ist ein Trick, sodass wir die Anwendung wieder in den Vordergrund bekommen, // da Excel unsichtbar geöffnet wird this.WindowState = FormWindowState.Minimized; this.WindowState = FormWindowState.Normal; } else // Bei Abbruch, Fenster schließen { Close(); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // Beim Schließen des Fensters, Dokument schließen if (oWorkbook != null) oWorkbook.Close(); } private void buttonSpeichern_Click(object sender, EventArgs e) { if (MessageBox.Show("Sind Sie sicher dass Sie die Änderungen übernehmen möchten?\nDie Quelldatei wird überschrieben!", "Speichern?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { // Daten von der Ansicht in das Dokument schreiben for (int i = 0; i < dataGridViewExcel.Rows.Count - 1; i++) for (int j = 0; j < dataGridViewExcel.Columns.Count; j++) if (dataGridViewExcel.Rows[i].Cells[j].Value != null) (oWorksheet.Cells[i + 1, j + 1] as Range).Value = dataGridViewExcel.Rows[i].Cells[j].Value.ToString(); else (oWorksheet.Cells[i + 1, j + 1] as Range).Value = ""; // Speichervorgang auslösen oWorkbook.Save(); } } } }