Γράψιμο και Διάβασμα σε φύλλο του 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 βιβλιοθήκης με το πλήθος των κλάσεων που περιλαμβάνει.

http://users.sch.gr/mouratx/VB-NET_Tips/DataManagement/Images/ExcelProject.jpg

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.

 

·         Χρήστος Μουρατίδης