VB.NET读取Excel多工作表指定列数据并加载到ListView控件
解决方案
核心调整逻辑
- 保留原有单工作表读取函数的基础上,新增循环遍历1~10名称工作表的逻辑,逐个读取后合并所有数据
- 调整查询语句直接筛选A列(对应字段名F1)和C列(对应字段名F3),无需读取无关列
- 新增DataTable合并逻辑,最后统一绑定到ListView控件
完整实现代码
Imports System.Data.OleDb Public Class Frm_ImportarLibro ' 原有单工作表读取函数,调整为直接读取A、C列 Public Function Obtenerdatos(ByVal ruta As String, ByVal hoja As String, ByVal rango As String) As DataTable ' 兼容xlsx格式可更换为以下连接字符串: ' Dim cadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0 Xml;HDR=NO';" & "Data Source=" & ruta Dim cadenaConexion As String = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=NO';" & _ "Data Source=" & ruta Using cnn As New OleDbConnection(cadenaConexion) Dim cmd As OleDbCommand = cnn.CreateCommand() ' 仅查询A列(F1)和C列(F3),提升读取效率 cmd.CommandText = String.Format("SELECT F1,F3 FROM [{0}${1}]", hoja, rango) Dim da As New OleDbDataAdapter(cmd) Dim dtTemp As New DataTable("Prueba") da.Fill(dtTemp) Dim dt As DataTable = dtTemp.Clone() Dim rows As DataRow() = dtTemp.Select() For index As Integer = 0 To rows.Count - 1 Dim row As DataRow = rows(index) If (row.Item(0) Is DBNull.Value) Then Exit For End If dt.ImportRow(row) Next Return dt End Using End Function ' 新增批量读取1~10工作表的函数 Public Function ObtenerDatosTodasHojas(ByVal ruta As String, ByVal rango As String) As DataTable ' 初始化最终返回的合并数据表,结构和单表读取结果一致 Dim dtFinal As New DataTable() dtFinal.Columns.Add("F1", GetType(String)) dtFinal.Columns.Add("F3", GetType(String)) ' 循环读取1~10共10个工作表 For i As Integer = 1 To 10 Dim dtHoja = Obtenerdatos(ruta, i.ToString(), rango) ' 合并当前工作表数据到总表 For Each dr As DataRow In dtHoja.Rows dtFinal.ImportRow(dr) Next Next Return dtFinal End Function ' 绑定数据到ListView的方法,调用示例 Public Sub BindDataToListView(rutaArchivo As String) ' 读取所有表的A1:A20、C1:C20范围数据 Dim dtDatos = ObtenerDatosTodasHojas(rutaArchivo, "A1:C20") ' 先清空ListView原有内容 ListView1.Items.Clear() ListView1.Columns.Clear() ' 设置ListView为详细视图 ListView1.View = View.Details ' 添加列头,可根据需求修改名称 ListView1.Columns.Add("A列数据", 150) ListView1.Columns.Add("C列数据", 150) ' 遍历DataTable填充ListView For Each dr As DataRow In dtDatos.Rows Dim item As New ListViewItem(dr("F1").ToString()) item.SubItems.Add(dr("F3").ToString()) ListView1.Items.Add(item) Next End Sub End Class
使用说明
- 只需调用
BindDataToListView方法,传入Excel文件的完整路径即可自动完成所有工作表数据读取和ListView绑定 - 如果工作表名称不是纯数字1~10,可自行修改
ObtenerDatosTodasHojas里的循环逻辑,替换为实际的工作表名称列表 - 若使用的是.xlsx格式的Excel文件,替换函数里注释给出的ACE引擎连接字符串即可兼容更高版本Office
内容的提问来源于stack exchange,提问作者Joe R.
相关产品推荐
相关产品推荐

