Zadanie Wykonać aplikację posiadającą możliwość komunikowania się (zapis/odczyt) pomiędzy obiektem DataGridView, a plikiem tekstowym i plikiem MS Excel. Niech formularz ma postać jak na rys. 1. Rysunek 1 Menu Plik niech posiada dwie pozycje: Tekstowy i Excel, a każda z nich niech posiada dwie pozycje Otwórz i Zapisz, patrz rys. 2. Rysunek 2 Copyright 2015, Janusz Bonarowski 1
Kod aplikacji Wszystkie uwagi zamieszczono w postaci komentarzy w kodzie aplikacji. Aplikacja będzie działać na komputerze, na którym zainstalowany jest: Visual Basic 2013 Express i Microsoft Excel 2010. ' '------------------------------------------------- ' Uwaga ' Jeśli zamierzamy korzystać z obiektów Excela ' to do projektu należy dodać referencję ' do biblioteki z tymi obiektami. ' Wykonujemy to sekwencją z menu: ' - PROJECT Add Reference... ' - w oknie Add Reference wybrać zakładkę COM ' - w lewej części okna wybrać Type Libraries ' - na liście zaznaczyć kratkę przy: ' - Microsoft Excel 14.0 Object Library ' (- Microsoft Office 14.0 Object Library, ta biblioteka może nie być konieczna) ' - Kliknąć przycisk OK '--------------------------------------------------- ' ' Uwaga! Poza blokiem klasy (Public Class) umieszczamy instrukcję ' zaimportowania przestrzeni nazw: Imports Excel = Microsoft.Office.Interop.Excel Public Class Form1 Private Sub mnutekstowyotworz_click(sender As Object, e As EventArgs) _ Handles mnutekstowyotworz.click ' Otwarcie pliku tekstowego do odczytu ' ------------------------------------ OpenFileDialog1.InitialDirectory = CurDir() OpenFileDialog1.Filter = _ "Pliki tekstowe (*.txt) *.txt Wszystkie pliki (*.*) *.*" OpenFileDialog1.FileName = "" OpenFileDialog1.ShowDialog() Private Sub OpenFileDialog1_FileOk(sender As Object, _ e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk ' Odczytanie danych z pliku tekstowego" ' --------------------================= Dim autorimie As String = "" Dim autornazwisko As String = "" Dim tytul As String = "" Dim sciezkaplik As String sciezkaplik = OpenFileDialog1.FileName FileOpen(1, sciezkaplik, OpenMode.Input) 'Usuń wiersze z grida zostawiając jeden (edycyjny) DataGridView1.Rows.Clear() Copyright 2015, Janusz Bonarowski 2
Do While Not EOF(1) Input(1, autorimie) Input(1, autornazwisko) Input(1, tytul) DataGridView1.Rows.Add(autorImie, autornazwisko, tytul) Loop FileClose(1) MsgBox(Err.Description, MsgBoxStyle.OkOnly, Err.Number) End Private Sub mnutekstowyzapisz_click(sender As Object, e As EventArgs) _ Handles mnutekstowyzapisz.click SaveFileDialog1.InitialDirectory = CurDir() SaveFileDialog1.Filter = _ "Pliki tekstowe (*.txt) *.txt Wszystkie pliki (*.*) *.*" SaveFileDialog1.FileName = "" SaveFileDialog1.ShowDialog() Private Sub SaveFileDialog1_FileOk(sender As Object, _ e As System.ComponentModel.CancelEventArgs) _ Handles SaveFileDialog1.FileOk 'Zapisywanie danych z grida do pliku tekstowego '---------------------------------------------- Dim autorimie, autornazwisko, tytul, wiersz As String Dim sciezkaplik As String Dim liczbawierszy As Integer Dim i As Integer sciezkaplik = SaveFileDialog1.FileName FileOpen(1, sciezkaplik, OpenMode.Output) liczbawierszy = DataGridView1.RowCount For i = 0 To liczbawierszy - 2 '<<<< UWAGA! Odejmujemy 2 autorimie = DataGridView1.Item(0, i).value '(koloumna, wiersz) autornazwisko = DataGridView1.Item(1, i).value tytul = DataGridView1.Item(2, i).value wiersz = autorimie & "," & autornazwisko & "," & tytul PrintLine(1, wiersz) Next FileClose(1) MsgBox("Informacje zapisano w pliku:" & vbcrlf & sciezkaplik) MsgBox(Err.Description, MsgBoxStyle.Exclamation, "Błąd zapisu") End Copyright 2015, Janusz Bonarowski 3
Private Sub mnuexcelzapisz_click(sender As Object, e As EventArgs) _ Handles mnuexcelzapisz.click SaveFileDialog2.InitialDirectory = CurDir() SaveFileDialog2.Filter = _ "Pliki Excel 2010 (*.xlsx) *.xlsx Wszystkie pliki (*.*) *.*" SaveFileDialog2.FileName = "" SaveFileDialog2.ShowDialog() Private Sub SaveFileDialog2_FileOk(sender As Object, _ e As System.ComponentModel.CancelEventArgs) _ Handles SaveFileDialog2.FileOk ' Zapisywanie danych z grida do pliku Excela '------------------------------------------- Dim objexcel As New Excel.Application Dim objzeszyt As Excel.Workbook Dim objarkusz As Excel.Worksheet Dim pliknowy As String Dim liczbawierszy As Integer ' Start Excela i utworzenie obiektu Aplikacja Excela. objexcel = CreateObject("Excel.Application") ' Pobranie nazwy pliku Excela wraz ze ścieżką pliknowy = SaveFileDialog2.FileName ' Otwarcie zeszytu Excela wskazanego w "plik" 'objzeszyt = objexcel.workbooks.open(plik) 'lub dodaj pusty zeszyt do Excela 'Uwaga. Otwieramy pusty zeszyt Excela z domyślną nazwą, 'którą później (niżej) zmienimy nazwę wpisaną w SaveDialog. 'Nazwa ta przechowywana jest w zmiennej "pliknowy". objzeszyt = objexcel.workbooks.add() ' Uaktywniamy pierwszy arkusz w Excelu ' i się do niego odwołujemy objarkusz = objzeszyt.activesheet liczbawierszy = DataGridView1.RowCount For i = 0 To liczbawierszy - 2 '<<<< UWAGA! Odejmujemy 2 'Przepisywanie wartości z grida do Excela 'Odwołanie do komórek Excela:.Cells(wiersz, kolukna) 'Odwołanie do komórek grida:.item(koloumna, wiersz) objarkusz.cells(i + 1, 1).Value = DataGridView1.Item(0, i).value objarkusz.cells(i + 1, 2).Value = DataGridView1.Item(1, i).value objarkusz.cells(i + 1, 3).Value = DataGridView1.Item(2, i).value Next ''Zapisanie Zeszytu - pliku Excela ze starą nazwą Copyright 2015, Janusz Bonarowski 4
''objzeszyt.save() 'Zapisanie Zeszytu jako pliku Excela z nową nazwą objzeszyt.saveas(pliknowy) 'Zamknięcie Zeszytu - pliku objzeszyt.close() 'Zamknięcie aplikacji Excel objexcel.quit() ' Zwalnianie pamięci po obiektach objexcel = Nothing objzeszyt = Nothing objarkusz = Nothing MsgBox("Program zakończył wpisywanie") MsgBox(Err.Description, MsgBoxStyle.Information, _ "błąd nr = " & Err.Number) End Private Sub mnuexcelotworz_click(sender As Object, e As EventArgs) _ Handles mnuexcelotworz.click OpenFileDialog2.InitialDirectory = CurDir() OpenFileDialog2.Filter = _ "Pliki Excel 2010 (*.xlsx) *.xlsx Wszystkie pliki (*.*) *.*" OpenFileDialog2.FileName = "" OpenFileDialog2.ShowDialog() Private Sub OpenFileDialog2_FileOk(sender As Object, _ e As System.ComponentModel.CancelEventArgs) _ Handles OpenFileDialog2.FileOk ' Zapisywanie danych z grida do pliku Excela '------------------------------------------- Dim objexcel As New Excel.Application Dim objzeszyt As Excel.Workbook Dim objarkusz As Excel.Worksheet Dim plik As String Dim autorimie, autornazwisko, tytul As String Dim i As Integer ' Start Excela i utworzenie obiektu Aplikacja Excela. objexcel = CreateObject("Excel.Application") ' Pobranie nazwy pliku Excela wraz ze ścieżką ' do otwarcia w Excelu plik = OpenFileDialog2.FileName 'Otwarcie zeszytu Excela wskazanego w "plik" objzeszyt = objexcel.workbooks.open(plik) Copyright 2015, Janusz Bonarowski 5
' Uaktywniamy pierwszy arkusz w Excelu ' i się do niego odwołujemy objarkusz = objzeszyt.activesheet 'Usuń wiersze z grida zostawiając jeden (edycyjny) DataGridView1.Rows.Clear() ' Pobieranie danych z kolejnego wiersza Arkusza Excela. ' Kryterium przerwania pętli: pętlę przerywamy gdy okaże się, ' że pierwsza komórka w wierszu jest pusta. i = 1 Do While objarkusz.cells(i, 1).value <> Nothing autorimie = objarkusz.cells(i, 1).Value.ToString autornazwisko = objarkusz.cells(i, 2).Value.ToString tytul = objarkusz.cells(i, 3).Value.ToString DataGridView1.Rows.Add(autorImie, autornazwisko, tytul) i = i + 1 Loop 'Zamknięcie Zeszytu - pliku objzeszyt.close() 'Zamknięcie aplikacji Excel objexcel.quit() ' Zwalnianie pamięci po obiektach objexcel = Nothing objzeszyt = Nothing objarkusz = Nothing MsgBox("Program zakończył wpisywanie do DataGridView") MsgBox(Err.Description, MsgBoxStyle.Information, _ "błąd nr = " & Err.Number) End End Class Copyright 2015, Janusz Bonarowski 6