VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 895|回复: 5

问个VB.NET的简单问题

[复制链接]

3

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-10-16 09:00:01 | 显示全部楼层 |阅读模式
我想用EXCEL对DATAGRIDVIEW1进行数据导出,写了以下代码:
Public Sub ExportToExcel()
        If DataGridView1.RowCount > 0 Then
            Try
                Dim ds As New DataSet
                ds = DataGridView1.DataSource
                Dim i, j As Integer
                Dim rows As Integer = ds.Tables(0).Rows.Count
                Dim cols As Integer = ds.Tables(0).Columns.Count
                Dim DataArray(rows - 1, cols - 1) As String
                For i = 0 To rows - 1
                    For j = 0 To cols - 1
                        If ds.Tables(0).Rows(i).Item(j) Is System.DBNull.Value Then
                        Else
                            DataArray(i, j) = ds.Tables(0).Rows(i).Item(j)
                        End If
                    Next
                Next
                Dim myExcel As Excel.Application = New Excel.Application
                myExcel.Application.Workbooks.Add(True)
                myExcel.Visible = True
                For j = 0 To cols - 1
                    myExcel.Cells(1, j + 1) = ds.Tables(0).Columns(j).ColumnName
                Next
                myExcel.Range("A2").Resize(rows, cols).Value = DataArray
            Catch exp As Exception
                MessageBox.Show("数据导出失败!请查看是否已经安装了Excel", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning)
            End Try
        Else
            MessageBox.Show("没有数据!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub

但是Dim myExcel As Excel.Application = New Excel.Application这一句会出现错误,错误提示是:未定义类型EXCEL.application.改怎样改呢?
回复

使用道具 举报

0

主题

7

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-10-16 10:00:02 | 显示全部楼层
Excel.Appplication是抽象类
要用获得的方法 不能使用构造方法
请再详细参考一下Office开发手册
回复

使用道具 举报

0

主题

48

帖子

30.00

积分

新手上路

Rank: 1

积分
30.00
发表于 2020-10-16 16:15:01 | 显示全部楼层
没有引用excel
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-10-16 16:45:01 | 显示全部楼层
这个问题我也碰到过
把Dim myExcel As Excel.Application = New Excel.Application改成
  Dim myExcel As Interop.Excel.Application = New Interop.Excel.ApplicationClass
就可以了
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-10-16 17:00:01 | 显示全部楼层
以下是我从DataTable到Excel的程序段,看看有什么帮助
Public Sub DStoXls(ByVal Table As DataTable, ByVal DefFileName As String)
  
        Dim MyOleDbCn As New System.Data.OleDb.OleDbConnection
        Dim MyOleDbCmd As New System.Data.OleDb.OleDbCommand
        Dim MyTable As New DataTable
        Dim intRowsCnt, intColsCnt As Integer
        Dim strSql As String, strFlName As String
        Dim Fso As New System.Object
        If Table Is Nothing Then
            MessageBox.Show("未取得數據,無法導出", "導出錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End If
        MyTable = Table
        If MyTable.Rows.Count = 0 Then
            MessageBox.Show("未取得數據,無法導出", "導出錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End If
        Dim FileName As String
        Dim SaveFileDialog As New SaveFileDialog
        SaveFileDialog.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
        SaveFileDialog.Title = "保存為"
        SaveFileDialog.Filter = ".xls|*.xls"
        SaveFileDialog.FileName = DefFileName
        If (SaveFileDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK) Then
            FileName = SaveFileDialog.FileName
            ' TODO: 在此加入開啟檔案的程式碼。
        End If
        If FileName = "" Then Exit Sub
        strFlName = FileName
        If Dir(FileName) <> "" Then
            Kill(FileName)
        End If
        Try
            Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor

            MyOleDbCn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0;" & _
            "Data Source=" & strFlName & ";" & _
            "Extended ProPerties=""Excel 8.0;HDR=Yes;"""
            MyOleDbCn.Open()
            MyOleDbCmd.Connection = MyOleDbCn
            MyOleDbCmd.CommandType = CommandType.Text

            '第一行插入列标题
            strSql = "CREATE TABLE " & DefFileName & "("
            For intColsCnt = 0 To MyTable.Columns.Count - 1
                If intColsCnt <> MyTable.Columns.Count - 1 Then
                    strSql = strSql & ChangeChar(MyTable.Columns(intColsCnt).Caption) & " text,"
                Else
                    strSql = strSql & ChangeChar(MyTable.Columns(intColsCnt).Caption) & " text)"
                End If
            Next
            MyOleDbCmd.CommandText = Replace(strSql, ".", "_") '創建表的時候,不允許有“.”的字段名,所以要用“&#717;”來替換
            MyOleDbCmd.ExecuteNonQuery()

            '插入各行
            For intRowsCnt = 0 To MyTable.Rows.Count - 1
                strSql = "INSERT INTO " & DefFileName & " VALUES('"
                For intColsCnt = 0 To MyTable.Columns.Count - 1
                    If intColsCnt <> MyTable.Columns.Count - 1 Then
                        strSql = strSql & ChangeChar(MyTable.Rows(intRowsCnt).Item(intColsCnt)) & "','"
                    Else
                        strSql = strSql & ChangeChar(MyTable.Rows(intRowsCnt).Item(intColsCnt)) & "')"
                    End If
                Next
                MyOleDbCmd.CommandText = strSql
                MyOleDbCmd.ExecuteNonQuery()
            Next
            MessageBox.Show("数据已经成功导入EXCEL文件" & strFlName, "数据导出", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Catch ErrCode As Exception
            MsgBox("错误信息:" & ErrCode.Message & vbCrLf & vbCrLf & _
            "引发事件:" & ErrCode.TargetSite.ToString, MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "错误来源:" & ErrCode.Source)
            Exit Sub
            'Finally
            MyOleDbCmd.Dispose()
            MyOleDbCn.Close()
            MyOleDbCn.Dispose()
        End Try

    End Sub
回复

使用道具 举报

0

主题

10

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-10-16 17:15:01 | 显示全部楼层
我曾经遇到过类似问题。。

是没有在开发环境中添加引用后就可以了。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表