LogicSoft.com.pl - systemy informatyczne

Zapisywanie danych do Excela w C#

Uwaga, otwiera nowe okno. PDFDrukujEmail

Podczas pracy z kontrolką typu DataGridView ważnym elementem wydaje się zapis jej zawartości do pliku. Z tego właśnie powodu w tym artykule opisze jak w łatwy sposób za pomocą dostarczonej biblioteki Microsoft.Office.Interop.Excel zapisać dane do Excela w C#.

Pierwszym krokiem w tym przypadku będzie stworzenie odpowiedniego okna aplikacji. W jego skład wchodzą: pole typu DataGridView (nazwa: dgvData), dwa pola Button (bZapisz i bDodajKolumne) oraz pole typu TextBox (tbNazwaKolumny). W moim przypadku wygląda to jak na załączonym zrzucie ekranu.

Kolejnym krokiem, który należy wykonać, to dołączenie do pliku referencji do biblioteki Microsoft.Office.Interop.Excel poprzez Add Reference->Zakładka COM->Microsoft Excel 12.0 Object Library->OK. Następnie należy zadeklarować korzystanie z przestrzeni nazw.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MSExcel = Microsoft.Office.Interop.Excel;

Przypisanie stosowane jest po to,aby za każdym razem nie wypisywać Microsoft.Office.Interop.Excel, oraz po to, aby typ DataTable używany podczas edycji pola DataGridView nie wchodził w konflikt z polem DataTable znajdującym się w wyżej wymienionej przestrzeni nazw.

Następnie należy zadeklarować odpowiednią zmienną globalną typu DataTable, w której będzie przechowywana zawartość kontrolki DataGridView.

DataTable dataTable = new DataTable("Moja tablica");

Kolejnym krokiem jest napisanie kodu do obsługi zdarzeń odpowiedzialnych za naciśnięcie odpowiednich przycisków.

private void bDodajKolumne_Click(object sender, EventArgs e)
{
if (tbNazwaKolumny.Text != string.Empty)
{
if (!(dataTable.Columns.Contains(tbNazwaKolumny.Text)))
{
dataTable.Columns.Add(tbNazwaKolumny.Text, typeof(string));
tbNazwaKolumny.Text = string.Empty;
}
}
dgvData.DataSource = dataTable;
}

private void bZapisz_Click(object sender, EventArgs e)
{
object misValue = System.Reflection.Missing.Value;
MSExcel._Workbook excelWorkBook;
MSExcel._Worksheet excelSheet;
MSExcel.Application excelApp = new MSExcel.Application();
excelWorkBook = (MSExcel._Workbook)excelApp.Workbooks.Add("Skoroszyt");
excelSheet = (MSExcel._Worksheet)excelWorkBook.ActiveSheet;
for (int y = 0; y < dataTable.Columns.Count; y++) excelSheet.Cells[1, y+1] = dataTable.Columns[y].Caption;
for (int i = 0; i < dataTable.Rows.Count; i++)
{
for (int x = 0; x < dataTable.Columns.Count; x++)
{
string txt = string.Format("{0}",dataTable.Rows[i][x].ToString());
excelSheet.Cells[i+2, x+1] = txt;
}
}
excelWorkBook.SaveAs(Application.StartupPath + @"\tekst.xls", MSExcel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, MSExcel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
excelWorkBook.Close(true, misValue, misValue);
excelApp.Quit();
}

Podczas naciskania na przycisk Dodaj kolumne wykonuje się kod, którego zadaniem jest sprawdzenie, czy pole tekstowe zawiera jakies dane. Jeżeli zawiera, to do zmiennej DataTable zostaje dodana kolumna o nazwie podanej w polu TextBox, w przeciwnym wypadku nic się nie dzieje.
Natomiast gdy naciskamy przycisk Zapisz, aplikacja tworzy obiekt aplikacji Excel, następnie miejsce robocze oraz strone, na której będą zapisywane dane. Pierwsza pętla tworzy nagłowki, czyli przepisuje nazwy kolumn do pierwszego wiersza arkusza. Druga pętla for przechodzi po wszystkich wartościach znajdujących się w wierszach i kolumnach typu DataTable by kolejno przepisywać je w odpowiednie pola arkusza kalkulacyjnego. Po wyjściu z pętli plik zostaje zapisany jako tekst.xls w katalogu, w którym znajduje się aplikacja, a następnie aplikacja Excela i przestrzeń robocza zostają zamknięte w celu zwolnienia zasobów. Poniższe zrzuty ekranu pokazują działanie aplikacji.

W ten o to łatwy i szybki sposób powstała niewielka aplikacja służąca do zapisu danych znajdujących się w kontrolce DataGridView do arkusza kalkulacyjnego. Jednak istnieje wada tego rozwiązania - działanie aplikacji wymaga, aby na komputerze na którym jest ona uruchamiana był zainstalowany Microsoft Excel. Rozwiązaniem tego problemu jest znalezienie innej - lepszej biblioteki do eksportu danych z C# do Excela.

W razie jakichkolwiek pytań, zapraszam do działu kontakt.