test_excel_test_visualstudio/Excel/Form1.cs

107 lines
4.6 KiB
C#

/*************************************\
* 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();
}
}
}
}