Γράψιμο και Διάβασμα σε φύλλο του Excel
Το παρακάτω
παράδειγμα γράφει και διαβάζει πληροφορίες σε αρχείο του Excel (workbook). Το απλοϊκό παράδειγμά μας αφορά ένα βιβλιοπωλείο
που κρατά, για κάθε βιβλίο, τις πληροφορίες (πεδία) : Τίτλος και τιμή πώλησης.
Για την
εμφάνιση και διαχείριση των δεδομένων επί της οθόνης θα χρησιμοποιήσουμε ένα DataGridView control που θα έχει ως πηγή ένα DataTable. Το
DataTable θα επικοινωνεί με ένα αντικείμενο Workbook
της Excel Object library,
διαμέσου του οποίου, μέσω κώδικα, θα διαβάζουμε ή γράφουμε τα δεδομένα.
Για να
φορτώσουμε τη βιβλιοθήκη αυτή θα πρέπει να προσθέσουμε την κατάλληλη αναφορά
στο Solution Explorer (μενού Project -> Add Reference... -> καρτέλα
COM -> Microsoft Excel 11.0 Object Library για την έκδοση 2003). Το Excel μπορούμε να το
χειριστούμε, λοιπόν, προγραμματιστικά διαμέσου αυτής της COM βιβλιοθήκης με το
πλήθος των κλάσεων που περιλαμβάνει.
Imports Excel
Public Class Form1
Dim fpath$ = System.Windows.Forms.Application.ExecutablePath
& "\..\"
Dim fname$
= "ΠΩΛΗΣΕΙΣ ΒΙΒΛΙΩΝ.xls"
'H λίστα των βιβλίων.
'Θα χρησιμεύσει ως πηγή δεδομένων του DataGridView.
Dim TableBooks As New System.Data.DataTable
Dim x As New Excel.Application
'------------------------------------------------
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
'Δημιούργησε τα πεδία πληροφοριών του DataTable
Dim c As New DataColumn
c.ColumnName = "Τίτλος"
c.DataType = GetType(System.String)
TableBooks.Columns.Add(c)
c = Nothing
c = New DataColumn
c.ColumnName = "Ποσό"
c.DataType = GetType(System.Single)
TableBooks.Columns.Add(c)
c = Nothing
'Ορισέ το ως πηγή για το DataGridView
‘και κάνε κάποιες μορφοποιήσεις.
With grdData
.DataSource = TableBooks
.ColumnHeadersDefaultCellStyle.Font = New _
System.Drawing.Font(.Font.FontFamily, .Font.Size,_
FontStyle.Bold)
.Columns(0).Width = 180
.Columns(1).Width = 100
.Columns(1).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.TopRight
.Columns(1).DefaultCellStyle.Format = "c" 'Currency formated value
End With
End Sub
'------------------------------------------------
'Αποθήκευση των δεδομένων του Grid στο Excel file
(workbook) διαμέσου του
‘DataTable και workbook.
Private Sub btnWriteToExcelFile_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnWriteToExcelFile.Click
Dim wBook As Workbook
Dim wSheet As Worksheet
Try
'Προσθήκη νέου βιβλίου εργασίας στην εφαρμογή.
wBook = x.Workbooks.Add
'Προσθήκη νέου φύλλου εργασίας στο βιβλίο.
wSheet = wBook.Worksheets.Add
'Προσθήκη επικεφαλίδων και μορφοποιήσεις.
With wSheet
.Name = "ΠΩΛΗΣΕΙΣ 2006"
.Range("A1").Value = "Βιβλία" :
.Range("B1").Value = "Ποσά"
.Range("A1:B1").Font.Name =
"Arial"
.Range("A1:B1").Font.Size = 12
.Range("A1:B1").Font.Bold = True
.Range("A1:B1").Font.Color = _
Microsoft.VisualBasic.RGB(0,
0, 255)
End With
Dim cnt% = TableBooks.Rows.Count, i%
Dim r As DataRow
'index πρώτης γραμμής δεδομένων.
Dim initSheetDataRow% = 2
'index γραμμής συνόλου.
Dim SheetSumRow% = initSheetDataRow
+ cnt + 1
'Διάβασε μία-μία εγγραφή του DataTable
‘και γράψε μία γραμμή στο Εxcel file (WorkBook).
With wSheet
For i = 0 To cnt - 1
r = TableBooks.Rows(i)
'Προσθήκη δεδομένων και μορφοποιήσεις.
.Range("A" & initSheetDataRow + i).Value =
r("Τίτλος")
.Range("B" & initSheetDataRow + i).Value = r("Ποσό")
Next
'Καθόρισε τη γραμμή συνόλων και τον τύπο Sum του αθροίσματος των 'ποσών της στήλης.
'Επίσης μορφοποιήσεις. Ειδικά στην μορφή εμφάνισης των αριθμών
'των ποσών.
.Range("A"
& SheetSumRow).Value =
"Σύνολα "
.Range("B" & SheetSumRow).Formula = "=Sum(B"
& initSheetDataRow & _
":B"
& SheetSumRow - 2 & ")"
.Range("A" & SheetSumRow
& ":B" & SheetSumRow).Font.Bold = True
.Range("B" & initSheetDataRow
& ":B" & SheetSumRow - 2, _
"B" & SheetSumRow).NumberFormat = "#.###,00 €"
.Columns("A:B").Autofit()
.Columns("B").HorizontalAlignment = XlHAlign.xlHAlignRight
End With
'Αποθήκευση.
wBook.SaveAs(fpath & fname)
wBook.Close()
MsgBox("Το βιβλίο εργασίας ΠΩΛΗΣΕΙΣ ΒΙΒΛΙΩΝ.xls
δημιουργήθηκε")
Catch ex As Exception
MsgBox("Δεν μπορώ να δημιουργήσω το βιβλίο εργασίας" & vbCrLf & _
ex.Message, MsgBoxStyle.Critical)
Finally
wBook = Nothing :
wSheet = Nothing
End Try
End Sub
'----------------------------------------
'Ανάγνωση των δεδομένων του Excel file (workbook) και
‘μεταφορά τους στο Grid, διαμέσου του DataTable και workbook.
Private Sub btnReadFromExcelFile_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles
btnReadFromExcelFile.Click
Dim wBook As Workbook
Dim wSheet As Worksheet
Dim initSheetDataRow% = 2, i%
= 0
Try
wBook = x.Workbooks.Open(fpath & fname)
wSheet = wBook.Worksheets("ΠΩΛΗΣΕΙΣ 2006")
Dim Title$, Timi!
Dim r As DataRow
'Καθάρισε τiς γραμμές του dataTable.
TableBooks.Rows.Clear()
With wSheet
Title = .Range("A"
& initSheetDataRow).Value
While Title IsNot
Nothing
Timi = .Range("B" & initSheetDataRow
+ i).Value
'Τοποθέτησέ τις σε ένα DataRow.
r = TableBooks.NewRow
r("Τίτλος") = Title
r("Ποσό") = Timi
'Πρόσθεσε τη γραμμή στο DataTable.
TableBooks.Rows.Add(r)
'Διάβασε την επόμενη, μη κενή, γραμμή του Excel sheet.
i += 1
Title = .Range("A" & initSheetDataRow
+ i).Value
End While
End With
wBook.Close()
Catch ex As Exception
MsgBox("Δεν μπορώ να διαβάσω τη γραμμή : " & _
initSheetDataRow + i & " από το φύλλο Excel" & vbCrLf
& _
ex.Message, MsgBoxStyle.Critical)
Finally
wBook = Nothing : wSheet =
Nothing
End Try
End Sub
'------------------------------------------------
'Καθαρισμός του Grid.
Private Sub bntResetGrid_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles bntResetGrid.Click
'Διέγραψε τις γραμμές από το DataTable.
TableBooks.Rows.Clear()
End Sub
'------------------------------------------------
'Άνοιγμα του Excel file
(workbook) στο Excel.
Private Sub btnOpenExcelFile_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnOpenExcelFile.Click
Try
x.Workbooks.Open(fpath & fname)
x.Visible = True
Catch ex As Exception
MsgBox("Δεν μπορώ να ανοίξω το βιβλίο εργασίας" & vbCrLf & _
ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
'----------------------------------------
'Έλεγχος εγκυρότητας του ποσού. Πρέπει να είναι Single type.
Private Sub grdData_CellValidating(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) _
Handles
grdData.CellValidating
If e.FormattedValue.ToString
= "" Then Exit Sub
If e.ColumnIndex = 1
Then 'Ποσό.
Try
Dim _cost! = CSng(e.FormattedValue)
Catch
MsgBox("Δεν δώσατε έγκυρη τιμή ποσού", _
MsgBoxStyle.Information,
"Ποσό πώλησης")
e.Cancel = True
End Try
End If
End Sub
'------------------------------------------------
End Class
Παρατηρήσεις :
1) Πρέπει να έχετε
υπόψη ότι για να τρέξει η εφαρμογή στο σύστημα του χρήστη πρέπει να είναι
εγκατεστημένο το Microsoft Office 2003. Ανάλογα με την έκδοση που υπάρχει στο
σύστημα του χρήστη πρέπει να χρησιμοποιήσετε την αντίστοιχη έκδοση της Excel Object Library (εδώ 11.0) στο μηχάνημα
ανάπτυξης της εφαρμογής.
2) Μετά την
προσθήκη της βιβλιοθήκης του Excel προστίθεται αυτόματα, επίσης, στο Solution Explorer και η αναφορά Microsoft.Office.Core
για τη βιβλιοθήκη Microsoft Office 11.0 Object Library, που περιλαμβάνει μερικές απαριθμήσεις κ.α. που
είναι κοινές στις εφαρμογές του Office.
·
Χρήστος
Μουρατίδης