vb.net 教程 10-2 Excel操作4 比较完整的工作表操作

Posted VB.Net

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb.net 教程 10-2 Excel操作4 比较完整的工作表操作相关的知识,希望对你有一定的参考价值。

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

前面几篇教程已经讲述了如何载入excel工作表中的数据,本节内容将讲述如何实现工作表数据的增、改、删,并实现对工作表操作比较完整的代码。

数据的增加和删除都可以使用  sheet.Cells(Row, Column).Value = 值 来实现。

数据的删除可以使用  Wsheet.Rows(行号).Delete 来实现对整行的删除,也可以使用 sheet.Cells(Row, Column).Value = "" 来实现。

设计界面如下:

实现新增的代码:

    '添加新的数据到Excel
    Private Sub addToExcel(ByVal id As String, ByVal computerCompany As String,
                           ByVal computerType As String, ByVal computerPrice As String,
                           ByVal computerCount As String)
        maxRow += 1
        Wsheet.Cells(maxRow, 1).Value = id
        Wsheet.Cells(maxRow, 2).Value = computerCompany
        Wsheet.Cells(maxRow, 3).Value = computerType
        Wsheet.Cells(maxRow, 4).Value = computerPrice
        Wsheet.Cells(maxRow, 5).Value = computerCount

    End Sub

由于是新增,所以在现有最大行数的基础上的下一行写入数据。

实现修改的代码:

    '修改Excel中的数据
    Private Sub editToExcel(ByVal id As String, ByVal computerCompany As String,
                           ByVal computerType As String, ByVal computerPrice As String,
                           ByVal computerCount As String)

        Dim currentExcelRow As Integer = lvCurrentRow + 1      '对应Excel当前正在编辑的行
        Wsheet.Cells(currentExcelRow, 1).Value = id
        Wsheet.Cells(currentExcelRow, 2).Value = computerCompany
        Wsheet.Cells(currentExcelRow, 3).Value = computerType
        Wsheet.Cells(currentExcelRow, 4).Value = computerPrice
        Wsheet.Cells(currentExcelRow, 5).Value = computerCount

    End Sub

由于是修改,所以在现有选中行的基础上进行修改。

实现删除的代码:

    '删除Excel中的数据
    Private Sub delToExcel(ByVal rowNumber As Integer)

        rowNumber = rowNumber + 2
        Wsheet.Rows(rowNumber).Delete
        maxRow -= 1
    End Sub

需要注意的是:这里是按照 Rows(行集合) 中的数据删除。因此,如果listview中删除第一行,即rowNumber=0,但是,对应的Excel中为Rows(2),请读者自己想一下为什么是2。

最后,请不要忘了保存数据:

Wbook.Save()

全部代码如下:

Imports System.ComponentModel
Imports Microsoft.Office.Interop


Public Class Form4
    Private filename As String
    Dim xls As Excel.Application
    Dim Wbook As Excel.Workbook
    Dim Wsheet As Excel.Worksheet   '要编辑的工作表

    Dim currentState As Integer         '0:删除现有数据;1:增加新的数据;2:编辑现有数据
    Dim lvCurrentRow As Integer    '用于记录当前正在编辑的行号
    Dim maxColumn As Integer    '记录Excel中工作表的最大有效列数
    Dim maxRow As Integer       '记录Excel中工作表的最大有效行数

    Dim isOperate As Boolean       '添加、修改、删除操作了均为True;未操作或者操作并保存了则为False

    Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Width = 530

        isOperate = False

        filename = Application.StartupPath & "\\例子.xls"
        xls = New Excel.Application
        'xls.Visible = True
        With lvExcel
            .GridLines = True           '显示表格线
            .FullRowSelect = True       '选择整行数据
            .MultiSelect = False        '只允许选择一行数据
            .View = View.Details
        End With
        With tsslInfo
            .AutoSize = False
            .Width = 220
            .TextAlign = ContentAlignment.MiddleLeft
            .Text = ""
        End With
        With tInfo
            .Enabled = False
            .Interval = 2000
        End With

    End Sub

    '载入Excel中的数据
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnLoad.Click
        Wbook = xls.Workbooks.Open(filename)

        Wsheet = Wbook.Worksheets(1)    '或者工作表名("Sheet1")

        lvExcel.Items.Clear()

        '读入第一行数据作为column
        If Wsheet.Rows.Count > 1 Then
            lvExcel.Columns.Clear()
            maxColumn = Wsheet.UsedRange.Columns.Count
            maxRow = Wsheet.UsedRange.Rows.Count

            For i As Integer = 1 To maxColumn
                If IsNothing(Wsheet.Cells(1, i).Value) Then
                    '无数据
                Else
                    lvExcel.Columns.Add(Wsheet.Cells(1, i).Value)
                End If
            Next

            For j As Integer = 2 To maxRow
                Dim Lv As New ListViewItem()
                Dim LvText As String

                If IsNothing(Wsheet.Cells(j, 1).Value) Then
                    LvText = ""
                Else
                    LvText = Wsheet.Cells(j, 1).Value
                End If
                Lv.Text = LvText

                Dim subLvText As String
                For k As Integer = 2 To maxColumn
                    If IsNothing(Wsheet.Cells(j, k).Value) Then
                        subLvText = ""
                    Else
                        subLvText = Wsheet.Cells(j, k).Value
                    End If
                    Lv.SubItems.Add(subLvText)
                Next

                lvExcel.Items.Add(Lv)
            Next
        End If

        Call showInfo("载入数据完毕")
    End Sub

    '另存为
    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
        Wbook.Save()
        isOperate = False

        Call showInfo("保存数据完毕")
    End Sub

    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
        If isOperate = True Then
            If MessageBox.Show("数据已经变更但是没有保存,是否继续退出?",
                               "尚未保存数据表",
                               MessageBoxButtons.OKCancel,
                               MessageBoxIcon.Warning) =
                               DialogResult.Cancel Then
                Exit Sub
            End If
        End If
        xls.Quit()
        Application.Exit()
    End Sub

    Private Sub Form4_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        xls.Quit()
    End Sub

    '修改数据
    Private Sub btnEdit_Click(sender As Object, e As EventArgs) Handles btnEdit.Click


        If lvExcel.SelectedItems.Count < 1 Then
            MessageBox.Show("尚未选择要修改的数据")
            Exit Sub
        End If
        currentState = 2

        Dim lvItem As ListViewItem = lvExcel.SelectedItems(0)
        txtIndex.Text = lvItem.Text
        txtCompany.Text = lvItem.SubItems(1).Text
        txtType.Text = lvItem.SubItems(2).Text
        txtPrice.Text = lvItem.SubItems(3).Text
        txtCount.Text = lvItem.SubItems(4).Text

        '记录正在编辑的行号
        lvCurrentRow = lvExcel.SelectedItems(0).Index

        Me.Width = 750
    End Sub

    '增加数据
    Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
        currentState = 1

        txtIndex.Text = ""
        txtCompany.Text = ""
        txtType.Text = ""
        txtPrice.Text = ""
        txtCount.Text = ""

        Me.Width = 750
    End Sub

    '删除一行数据
    Private Sub btnDel_Click(sender As Object, e As EventArgs) Handles btnDel.Click
        If lvExcel.SelectedItems.Count < 1 Then
            MessageBox.Show("尚未选择要删除的数据")
            Exit Sub
        End If
        currentState = 0

        '记录需要删除的行号
        lvCurrentRow = lvExcel.SelectedItems(0).Index

        Call delToLv(lvCurrentRow)
        Call delToExcel(lvCurrentRow)

        isOperate = True
    End Sub

    Private Sub btnOk_Click(sender As Object, e As EventArgs) Handles btnOk.Click
        Dim id As String = txtIndex.Text.Trim
        Dim computerCompany As String = txtCompany.Text.Trim
        Dim computerType As String = txtType.Text.Trim
        Dim computerPrice As String = txtPrice.Text.Trim
        Dim computerCount As String = txtCount.Text.Trim

        If id = "" OrElse computerCompany = "" OrElse computerType = "" _
            OrElse computerPrice = "" OrElse computerCount = "" Then
            MessageBox.Show("没有填写完整")
        End If

        Select Case currentState
            Case 1      '新增
                For Each lvId As ListViewItem In lvExcel.Items
                    If lvId.Text = id Then
                        If MessageBox.Show("已经存在这个序号了,是否继续保存。", "重复的序号", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) = DialogResult.Cancel Then
                            Exit Sub
                        End If
                    End If
                Next
                Call addToLv(id, computerCompany, computerType, computerPrice, computerCount)
                Call addToExcel(id, computerCompany, computerType, computerPrice, computerCount)
            Case 2      '编辑
                Call editToLv(id, computerCompany, computerType, computerPrice, computerCount)
                Call editToExcel(id, computerCompany, computerType, computerPrice, computerCount)
            Case Else   '其它
                '不处理
        End Select
        isOperate = True

        Me.Width = 530

    End Sub

    '添加新的数据到Listview
    Private Sub addToLv(ByVal id As String, ByVal computerCompany As String,
                           ByVal computerType As String, ByVal computerPrice As String,
                           ByVal computerCount As String)
        Dim newLv As New ListViewItem()
        newLv.Text = id
        newLv.SubItems.Add(computerCompany)
        newLv.SubItems.Add(computerType)
        newLv.SubItems.Add(computerPrice)
        newLv.SubItems.Add(computerCount)
        lvExcel.Items.Add(newLv)
    End Sub

    '添加新的数据到Excel
    Private Sub addToExcel(ByVal id As String, ByVal computerCompany As String,
                           ByVal computerType As String, ByVal computerPrice As String,
                           ByVal computerCount As String)
        maxRow += 1
        Wsheet.Cells(maxRow, 1).Value = id
        Wsheet.Cells(maxRow, 2).Value = computerCompany
        Wsheet.Cells(maxRow, 3).Value = computerType
        Wsheet.Cells(maxRow, 4).Value = computerPrice
        Wsheet.Cells(maxRow, 5).Value = computerCount

        Call showInfo("添加数据完毕")
    End Sub

    '修改Listview中的数据
    Private Sub editToLv(ByVal id As String, ByVal computerCompany As String,
                           ByVal computerType As String, ByVal computerPrice As String,
                           ByVal computerCount As String)
        Dim editLv As ListViewItem = lvExcel.Items(lvCurrentRow)
        editLv.Text = id
        editLv.SubItems(1).Text = computerCompany
        editLv.SubItems(2).Text = computerType
        editLv.SubItems(3).Text = computerPrice
        editLv.SubItems(4).Text = computerCount

    End Sub

    '修改Excel中的数据
    Private Sub editToExcel(ByVal id As String, ByVal computerCompany As String,
                           ByVal computerType As String, ByVal computerPrice As String,
                           ByVal computerCount As String)

        Dim currentExcelRow As Integer = lvCurrentRow + 1      '对应Excel当前正在编辑的行
        Wsheet.Cells(currentExcelRow, 1).Value = id
        Wsheet.Cells(currentExcelRow, 2).Value = computerCompany
        Wsheet.Cells(currentExcelRow, 3).Value = computerType
        Wsheet.Cells(currentExcelRow, 4).Value = computerPrice
        Wsheet.Cells(currentExcelRow, 5).Value = computerCount

        Call showInfo("修改数据完毕")
    End Sub

    '修改Listview中的数据
    Private Sub delToLv(ByVal rowNumber As Integer)
        lvExcel.Items.RemoveAt(rowNumber)
    End Sub

    '删除Excel中的数据
    Private Sub delToExcel(ByVal rowNumber As Integer)
        '对应Excel当前需要删除的行
        '注意:这里是按照 Rows(行集合) 中的数据删除
        '因此,如果listview中删除第一行,即rowNumber=0,
        '但是,对应的Excel中为Rows(2)
        rowNumber = rowNumber + 2
        Wsheet.Rows(rowNumber).Delete
        maxRow -= 1

        Call showInfo("删除数据完毕")
    End Sub

    '在状态栏显示操作信息
    Private Sub showInfo(ByVal info As String)
        tsslInfo.Text = info
        tInfo.Enabled = True
    End Sub
    Private Sub tInfo_Tick(sender As Object, e As EventArgs) Handles tInfo.Tick
        tsslInfo.Text = ""
        tInfo.Enabled = False
    End Sub

    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
        Me.Width = 530
    End Sub
End Class

运行时如下图:

载入数据:

添加数据:

修改数据:

删除数据:

由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。

学习更多vb.net知识,请参看vb.net 教程 目录

 

开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于vb.net 教程 10-2 Excel操作4 比较完整的工作表操作的主要内容,如果未能解决你的问题,请参考以下文章

vb.net怎么访问excel表格

用vb.net如何读取excel单元格内容?

VB.NET输出到Excel的问题

vb.net怎么从DataSet中读取一行的数据

从Excel到Access再到VB.NET学习过程小结

使用 VB.Net 在 Excel 中使用 WHERE SQL 命令