vb.net dataGridView导出EXCEL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb.net dataGridView导出EXCEL相关的知识,希望对你有一定的参考价值。
按您的方法写一个不需要引用的导出例子,但总不成功,请您指点
Try
Dim APP_Excel As Object
Dim Excel As Object
APP_Excel = CreateObject("Excel.Application") '创建Excel应用程序
Excel = APP_Excel.workbooks.add(True) '生成新工作簿
Excel.visible = True
Dim n, i, j, row, col As Integer
' Dim excel As Excel.Application = New Excel.Application()
'excel.Application.Workbooks.Add(True)
' excel.Cells.NumberFormatLocal = "@ "
col = 1
'//记录列名
For n = 0 To DataGridView1.ColumnCount - 1
If DataGridView1.Columns(n).Visible Then
Excel.Cells(1, col) = DataGridView1.Columns(n).HeaderText
col = col + 1
End If
Next
'//记录内容
row = 2
' col = 1
For i = 0 To DataGridView1.RowCount - 1
col = 1
For j = 0 To DataGridView1.ColumnCount - 1
'
If DataGridView1.Columns(j).Visible Then
Excel.Cells(i + 2, col) = DataGridView1.Rows(i).Cells(j).Value
col = col + 1
End If
Next
Next
Excel.Visible = True
Catch ex As Exception
Throw ex
End Try
Public Function daochu(ByVal x As DataGridView) As Boolean '导出到Excel函数
Try
If x.Rows.Count <= 0 Then '判断记录数,如果没有记录就退出
MessageBox.Show("没有记录可以导出", "没有可以导出的项目", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return False
Else '如果有记录就导出到Excel
Dim xx As Object : Dim yy As Object
xx = CreateObject("Excel.Application") '创建Excel对象
yy = xx.workbooks.add()
Dim i As Integer, u As Integer = 0, v As Integer = 0 '定义循环变量,行列变量
For i = 1 To x.Columns.Count '把表头写入Excel
yy.worksheets(1).cells(1, i) = x.Columns(i - 1).HeaderCell.Value
Next
Dim str(x.Rows.Count - 1, x.Columns.Count - 1) '定义一个二维数组
For u = 1 To x.Rows.Count '行循环
For v = 1 To x.Columns.Count '列循环
If x.Item(v - 1, u - 1).Value.GetType.ToString <> "System.Guid" Then
str(u - 1, v - 1) = x.Item(v - 1, u - 1).Value
Else
str(u - 1, v - 1) = x.Item(v - 1, u - 1).Value.ToString
End If
Next
Next
yy.worksheets(1).range("A2").Resize(x.Rows.Count, x.Columns.Count).Value = str '把数组一起写入Excel
yy.worksheets(1).Cells.EntireColumn.AutoFit() '自动调整Excel列
' yy.worksheets(1).name = x.TopLeftHeaderCell.Value.ToString '表标题写入作为Excel工作表名称
xx.visible = True '设置Excel可见
yy = Nothing '销毁组建释放资源
xx = Nothing '销毁组建释放资源
End If
Return True
Catch ex As Exception '错误处理
MessageBox.Show(Err.Description.ToString, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error) '出错提示
Return False
End Try
End Function来自:求助得到的回答 参考技术A 你的参数没用对,row 没加1,修改后的代码如下(我已成功导出,注意datagridview1的参数。):
'//记录内容
row = 2
' col = 1
For i = 0 To DataGridView1.RowCount - 1
col = 1
For j = 0 To DataGridView1.ColumnCount - 1
If DataGridView1.Columns(j).Visible Then
'xlSheet.Cells(i + 2, col) = DataGridView1.Rows(i).Cells(j).Value
xlSheet.Cells(row, col) = DataGridView1(j, i).Value.ToString
col = col + 1
End If
Next
row = row + 1
Next
xlSheet.Visible = True
VB.NET:清除 DataGridView
【中文标题】VB.NET:清除 DataGridView【英文标题】:VB.NET: Clear DataGridView 【发布时间】:2011-01-14 02:26:40 【问题描述】:我试过了-
DataGridView1.DataSource=Nothing
和
DataGridView1.DataSource=Nothing
DataGridView1.Refresh()
和
DataGridView1.RefreshEdit()
它们都不起作用..
我编写了一个方法,在执行时设置 DataGridView 的 DataSource。但是每次我执行它时,它都会使用新值复制数据并将其附加到 DGV 的先前内容中。我想清除内容然后添加值。这可能吗?
【问题讨论】:
【参考方案1】:如果 DataGridView 绑定到任何数据源,则必须将 DataGridView 的 DataSource
属性设置为 Nothing
。
如果 DataGridView 未绑定到任何数据源,则此代码可以解决问题:
DataGridView.Rows.Clear()
【讨论】:
如果此代码抛出类似“无法清除此列表”的错误,我建议采用这种方法:DataGridView.DataSource = Nothing
...然后刷新它...DataGridView.Refresh()
【参考方案2】:
对于未绑定的情况,请注意:
DataGridView.Rows.Clear()
保留 Columns 集合。
DataGridView.Columns.Clear()
..将删除所有列和行。如果您使用的是未绑定的 DGV,并且在下次使用时更改了列,则清除行可能还不够。对于库代码,在添加列之前清除所有列。
【讨论】:
【参考方案3】:我可能会用这个...
DataGridView1.Rows.Clear()
清除行然后重新绑定。
【讨论】:
它说无法清除此列表。是因为我使用数据库表作为数据源吗?【参考方案4】:按照这样的简单方法进行
假设ta
是DataTable
ta.clear()
DataGridView1.DataSource = ta
DataGridView1.DataSource = Nothing
【讨论】:
【参考方案5】:你能不能将datagridview绑定到一个空集合(而不是null)。这样就行了?
【讨论】:
【参考方案6】:要在搜索新结果时删除datagridview中的旧记录,使用button_click事件编写以下代码,
me.DataGridview1.DataSource.clear()
此代码将有助于删除 datagridview 中的旧记录。
【讨论】:
【参考方案7】:我发现将数据源设置为 null 会删除列。这对我有用:
c#:
((DataTable)myDataGrid.DataSource).Rows.Clear();
VB:
Call CType(myDataGrid.DataSource, DataTable).Rows.Clear()
【讨论】:
点赞以提及一个常见问题,其他答案不尊重或解决。【参考方案8】:我的 DataGridView 也绑定到 DataSource 并且 myDataGridView.Columns.Clear()
工作正常,但 myDataGridView.Rows.Clear()
没有。仅供那些尝试过.Rows
的人参考。
【讨论】:
【参考方案9】:不要对DataGridView
做任何事情,只是清除数据源。我尝试清除myDataset.clear()
方法,然后它起作用了。
【讨论】:
最好解释原因,而不仅仅是做什么。【参考方案10】:我已经让这段代码在 Windows 窗体中运行,
Public Class Form1
Private dataStuff As List(Of String)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
DataGridView1.DataSource = Nothing
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
dataStuff = New List(Of String)
dataStuff.Add("qwerty")
dataStuff.Add("another")
dataStuff.Add("...and another")
DataGridView1.DataSource = dataStuff
End Sub
End Class
【讨论】:
【参考方案11】:如果数据网格绑定到某个数据表,您应该从数据集中删除该表。您的 Gridview 将被自动清除。没有别的办法。
[YourDatasetName].Tables.Clear()
【讨论】:
您的答案对已经接受的答案有何新意?【参考方案12】:我在清除 gridview 内容时遇到了同样的问题。我使用的数据源是一个没有列的数据表,我以编程方式将列和行添加到数据表中。然后绑定到datagridview。我尝试了与gridview相关的代码,例如gridView.Rows.Clear()
,gridView.DataSource = Nothing
但这对我不起作用。然后在每次将其绑定到datagridview之前尝试以下与datatable相关的代码。
dtStore.Rows.Clear()
dtStore.Columns.Clear()
gridView.DataSource = dtStore
并且工作正常,DataGridView 中没有复制
【讨论】:
【参考方案13】:1) 创建按钮,命名为 Clear.Inside 插入以下代码 datagridviewer.DataSource=nothing
2) 在您的搜索按钮中,通过以下语句开始您的代码
datagridviewer.DataSource = DataSet.table
注意:用你的表的真实名称代替表 例如:datagridviewer.DataSource = DataSet.client
【讨论】:
【参考方案14】:当将来自 SQL 查询的信息输入到 datagridview 时,您可以在重新加载之前先清除 datagridview。
我将 dbDataSet 定义为 New DataTable 的地方我可以清楚。 dbDataSet 必须位于公共类表单中的表单开头
Dim dbDataset AS New DataTable
在您的 Private Sub 的代码中,放置
dbDataSet.Clear()
【讨论】:
【参考方案15】:您可能有这样一个用户场景,您希望保留数据绑定并且只是暂时清除 DataGridView。例如,您让用户单击地图上的设施以显示其属性以进行编辑。他是第一次单击,或者他已经单击了一个并对其进行了编辑。当用户单击“选择设施”按钮时,您希望清除上一个设施中数据的 DataGridView(如果这是他的第一次选择,则不会抛出错误)。在这种情况下,您可以通过调整填充 DataGridView 的生成代码来实现干净的 DataGridView。假设生成的代码如下所示:
Try
Me.Fh_maintTableAdapter.FillByHydrantNumber(Me.Fh2010DataSet.fh_maint, hydrantNum)
Catch ex As System.Exception
System.Windows.Forms.MessageBox.Show(ex.Message)
End Try
我们正在根据消火栓编号填充 DataGridView。将此代码复制到您要清除 DataGridView 并用您知道不会检索到数据的“hydrantNum”的值替换的位置。网格将被清除。当用户实际选择了一个设施(在本例中为消火栓)时,绑定就可以适当地填充 DataGridView。
【讨论】:
【参考方案16】:如果 DataGridView 绑定到任何数据源,
DataGridView1.DataSource = Nothing
DataGridView1.DataBind()
【讨论】:
【参考方案17】:Dim DS As New DataSet
DS.Clear()
- DATASET clear 对我来说比 DataGridView.Rows.Clear()
效果更好:
Public Sub doQuery(sql As String)
Try
DS.Clear() '<-- here
' - CONNECT -
DBCon.Open()
' Cmd gets SQL Query
Cmd = New OleDbCommand(sql, DBCon)
DA = New OleDbDataAdapter(Cmd)
DA.Fill(DS)
' - DISCONNECT -
DBCon.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
【讨论】:
【参考方案18】:如果GridView
(假设名称是gvArchive
)绑定到任何DataSource
,以下将清除它:
gvArchive.DataSource = Nothing
gvArchive.DataBind()
【讨论】:
【参考方案19】:就这样写吧
DataGridView1.DataSource = ""
【讨论】:
虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 how 和 why 的 greatly improved if it included an explanation 这解决了问题。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。【参考方案20】:我遇到了同样的问题:我正在以编程方式将我的 GridView1 绑定到一个 SQL 表 [ditonary] 或另一个 [meny] 但是当我从 RadioButtonList1 中选择第二个表时,我收到一个错误 (System.Web.HttpException:在所选数据源中未找到标题为 [先前选择的表中第一列的标题] 的字段或属性。)即表示无法找到我的第一个选择表中的列。我需要做的就是插入:
GridView1.Columns.Clear()
在添加表格列之前。完整代码如下:
Dim connectionString As String = "your-string-details"
Dim connection As New SqlConnection(connectionString)
然后是你的第一个子:
Private Sub BindOrders()
connection.Open()
Dim sqlCommand As String = "SELECT * FROM [dictionary]"
Dim dataAdapter As New SqlDataAdapter(sqlCommand, connection)
Dim dt As New DataTable()
dataAdapter.Fill(dt)
GridView1.Columns.Clear() ' clear columns before adding new ones
If GridView1.Columns.Count <= 0 Then
Dim Field As New BoundField()
Field.DataField = "id"
Field.HeaderText = "id"
GridView1.Columns.Add(Field)
Field = New BoundField()
Field.DataField = "strArHundreds"
Field.HeaderText = "strArHundreds"
GridView1.Columns.Add(Field)
Field = New BoundField()
Field.DataField = "strArTens"
Field.HeaderText = "strArTens"
GridView1.Columns.Add(Field)
Field = New BoundField()
Field.DataField = "strArSingles"
Field.HeaderText = "strArSingles"
GridView1.Columns.Add(Field)
End If
GridView1.DataSource = dt
GridView1.DataBind()
connection.Close()
End Sub
然后是你的第二个子:
Private Sub BindDocuments()
connection.Open()
Dim sqlCommand As String = "SELECT * FROM [meny]"
Dim dataAdapter As New SqlDataAdapter(sqlCommand, connection)
Dim dt As New DataTable()
dataAdapter.Fill(dt)
GridView1.Columns.Clear() ' clear columns before adding new ones
If GridView1.Columns.Count <= 0 Then
Dim Field As New BoundField
Field = New BoundField
Field.DataField = "id"
Field.HeaderText = "id"
GridView1.Columns.Add(Field)
Field = New BoundField
Field.DataField = "nazev"
Field.HeaderText = "nazev"
GridView1.Columns.Add(Field)
End If
GridView1.DataSource = dt
GridView1.DataBind()
connection.Close()
End Sub
你的 RadioButton 终于来了:
Protected Sub RadioButtonList1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles RadioButtonList1.SelectedIndexChanged
Dim index As Integer
index = RadioButtonList1.SelectedIndex
Select Case index
Case 0
BindOrders()
Exit Select
Case 1
BindDocuments()
Exit Select
End Select
End Sub
为了完成,这里是关联 aspx.file 中 GridView1 和 RadioButtonList1 的代码:
<asp:RadioButtonList ID="RadioButtonList1"
runat="server"
AutoPostBack="True"
OnSelectedIndexChanged="RadioButtonList1_SelectedIndexChanged">
<asp:ListItem>Obraty</asp:ListItem>
<asp:ListItem>Dokumenty</asp:ListItem>
</asp:RadioButtonList>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
</asp:GridView>
现在一切正常。
【讨论】:
【参考方案21】:您所犯的错误是您似乎在使用数据集对象来存储数据。每次使用以下代码将数据放入数据集中时,都会将数据添加到数据集中已有的数据中。
myDataAdapter.Fill(myDataSet)
如果您通过以下代码将数据集中的表分配给程序中的 DataGridView 对象,您将获得重复的结果,因为您尚未清除已存在于数据集和数据集表中的数据。
myDataGridView.DataSource = myDataSet.Tables(0)
为避免复制数据,您必须在数据集对象上调用 clear 方法。
myDataSet.clear()
然后将数据集中的表分配给 DataGridView 对象。 代码是这样的。
myDataSet.clear()
myDataAdapter.Fill(myDataSet)
myDataGridView.DataSource = myDataSet.Tables(0)
你可以试试这个代码:
' clear previous data
DataGridView2.DataSource = Nothing
DataGridView2.DataMember = Nothing
DataGridView2.Refresh()
Try
connection.Open()
adapter1 = New SqlDataAdapter(sql, connection)
' clear data already in the dataset
ds1.Clear()
adapter1.Fill(ds1)
DataGridView2.DataSource = ds1.Tables(0)
connection.Close()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
【讨论】:
【参考方案22】:在任何你想实现 clear datagridview 命令的地方使用这段代码
datagridview1.datasource= nothing
datagridview1.datasource= ds
dt.clear() 'Dt as new DATATABLE
ds.clear() 'Ds as new Dataset
此代码将在从数据库中填充数据时清除 datagridview 并停止数据复制。
【讨论】:
【参考方案23】:你可以这样做:
DataGridView1.Enable = false
DataGridView1.DataSource = Nothing
DataGridView1.Enable = true
【讨论】:
【参考方案24】:要清除网格视图数据,您必须清除数据集或数据表
我使用此代码我清除了网格视图数据,即使一次又一次重新提交它也会起作用 例子 Dim con 作为新的 OleDbConnection 将 cmd 调暗为新的 OleDbCommand Dim da 作为新的 OleDbDataAdapter Dim dar 作为 OleDbDataReader 将 dt 调暗为新数据表 如果 (con.State 1) 那么 con.Open() 万一 dt.Clear() '每次清除数据到新数据 cmd.Connection = con cmd.CommandText = "从用户中选择 *" da.SelectCommand = cmd da.填充(dt) DataGridView1.DataSource = dt DataGridView1.Visible = True
cmd.Dispose()
con.Close()
【讨论】:
感谢您对 *** 的贡献 :)。您正在回答的问题已经过时并且已经回答了 - 如果您也可以为更紧迫的问题付出努力,我们将很高兴。另外,请尽量让您的答案与问题中的示例相关(例如,它不涉及任何用户表)。【参考方案25】:您只能通过以下两行来做到这一点:
DataGridView1.DataSource=Nothing
DataGridView1.DataBind()
【讨论】:
【参考方案26】:如果您想清除 DataGridView 中的所有数据,也可以尝试此代码
DataGridView1.DataSource.Clear()
【讨论】:
【参考方案27】:对特定单元格试试这个:
Datagrid.Rows(RowIndex).Cells(ColIndex).Value = DBNull.Value
【讨论】:
非常简短的答案往往会被自动标记为低质量,因此请避免这样的单行答案。除此之外,添加一点为什么您建议的更改应该可以解决问题的解释总是有帮助的。【参考方案28】:DgRemolques 是我在 WPF 上的数据网格的名称
dgRemolques.ItemsSource = 无 但我也需要清理数据表 dtRemolques.Clear()
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于vb.net dataGridView导出EXCEL的主要内容,如果未能解决你的问题,请参考以下文章
VB.net 中datagridview 怎么从数据库里取出数据