107 lines
4.6 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
} |