不使用连接字符串将Excel转换为DataTable并绑定GridView的问题咨询
问题解答
是否存在无需连接字符串的实现方案
存在,你当前选用的第三方Excel操作类库(如Infragistics Excel、EPPlus、NPOI等)都属于无需OLEDB/ODBC连接字符串的方案,直接读取Excel文件二进制内容解析即可,无需依赖数据库连接逻辑。
代码抛出System.NullReferenceException的原因及修复方案
核心错误点
- 静态方法
Workbook.Load(stream)会返回Workbook实例,你仅调用了方法但没有赋值给声明的workbook变量,导致后续访问workbook.Worksheets(0)时变量为空 - 你错误使用
GetManifestResourceStream读取用户本地选择的文件:该方法仅用于读取编译时嵌入到程序集内部的资源文件,无法读取用户在磁盘上选中的普通文件,导致stream为null,Load方法直接抛出空异常,且你用空Catch块吞掉了异常无法定位问题 - 单元格值可能为空,直接调用
.ToString()会触发空引用 - 你尝试将自定义类
ISAACServiceExcel的实例直接赋值给DataTable变量,类型不匹配,且循环中没有往DataTable中添加行的逻辑,就算前面运行正常也无法完成绑定
修正后代码
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then Dim filePath = OpenFileDialog1.FileName If File.Exists(filePath) AndAlso Path.GetExtension(filePath).Equals(".xlsx", StringComparison.OrdinalIgnoreCase) Then ' 直接从磁盘文件加载Workbook,不需要读取资源流 Dim workbook As Workbook = Workbook.Load(filePath) Dim sheet As Worksheet = workbook.Worksheets(0) ' 先构建DataTable的列 Dim dataTable As New DataTable() dataTable.Columns.AddRange({ New DataColumn("AufPos"), New DataColumn("UANR"), New DataColumn("K_Art"), New DataColumn("Ueberbegriff"), New DataColumn("Benennung"), New DataColumn("Einheit"), New DataColumn("Einzelkosten"), New DataColumn("Anzahl"), New DataColumn("Komponente"), New DataColumn("Projektbeteiligter"), New DataColumn("Chefblattposition"), New DataColumn("Total") }) ' 循环行往DataTable加数据,如需跳过表头可自行调整起始索引 For Each row As WorksheetRow In sheet.Rows Dim newRow = dataTable.NewRow() ' 加空值判断避免空引用 newRow("AufPos") = If(row.Cells(0).Value?.ToString(), "") newRow("UANR") = If(row.Cells(1).Value?.ToString(), "") newRow("K_Art") = If(row.Cells(2).Value?.ToString(), "") newRow("Ueberbegriff") = If(row.Cells(3).Value?.ToString(), "") newRow("Benennung") = If(row.Cells(5).Value?.ToString(), "") newRow("Einheit") = If(row.Cells(6).Value?.ToString(), "") newRow("Einzelkosten") = If(row.Cells(7).Value?.ToString(), "") newRow("Anzahl") = If(row.Cells(8).Value?.ToString(), "") newRow("Komponente") = If(row.Cells(9).Value?.ToString(), "") newRow("Projektbeteiligter") = If(row.Cells(11).Value?.ToString(), "") newRow("Chefblattposition") = If(row.Cells(13).Value?.ToString(), "") newRow("Total") = If(row.Cells(15).Value?.ToString(), "") dataTable.Rows.Add(newRow) Next dgv1.DataSource = dataTable End If End If
内容的提问来源于stack exchange,提问作者user17151986
相关产品推荐
相关产品推荐

