无法直接读取未打开的Excel 2003 XLS文件,求技术解决方案
解决Excel 2003 XLS文件无需手动打开即可读取的问题
我明白你遇到的麻烦了——从网页下载的XLS文件被Office标记为不安全,必须手动确认警告后才能读取,直接用OleDb连接又失败。下面给你几个可行的解决办法,按推荐程度排序:
方法1:改用NPOI库(最推荐,无Office依赖)
OleDb读取旧版XLS容易受Office安全设置影响,而NPOI是纯.NET库,完全独立于Office,能直接解析XLS二进制格式,不会触发任何安全警告。
步骤:
- 打开你的项目,通过NuGet安装
NPOI和NPOI.OLE2两个包(搜索NPOI即可找到)。 - 替换原有的读取代码为以下代码:
Imports NPOI.HSSF.UserModel Imports NPOI.SS.UserModel Imports System.IO Try Dim path As String = "C:\holding\list_demands.xls" ' 以只读方式打开文件流 Using fs As New FileStream(path, FileMode.Open, FileAccess.Read) ' 加载Excel 2003工作簿 Dim workbook As IWorkbook = New HSSFWorkbook(fs) ' 获取指定工作表(这里是List_demands) Dim sheet As ISheet = workbook.GetSheet("List_demands") If sheet Is Nothing Then MsgBox("未找到指定工作表") Return End If Dim dataTable As New DataTable() ' 读取表头行 Dim headerRow As IRow = sheet.GetRow(0) For Each cell As ICell In headerRow.Cells dataTable.Columns.Add(cell.StringCellValue) Next ' 遍历读取数据行 For i As Integer = 1 To sheet.LastRowNum Dim row As IRow = sheet.GetRow(i) If row Is Nothing Then Continue For ' 跳过空行 Dim dataRow As DataRow = dataTable.NewRow() For j As Integer = 0 To headerRow.Cells.Count - 1 Dim cell As ICell = row.GetCell(j) If cell IsNot Nothing Then ' 根据单元格类型处理数据 Select Case cell.CellType Case CellType.String dataRow(j) = cell.StringCellValue Case CellType.Numeric dataRow(j) = cell.NumericCellValue Case CellType.Boolean dataRow(j) = cell.BooleanCellValue Case Else dataRow(j) = cell.ToString() End Select End If Next dataTable.Rows.Add(dataRow) Next ' 绑定到DataGridView DataGridView1.DataSource = dataTable End Using Catch ex As Exception MsgBox(ex.Message.ToString) End Try
这个方法完全绕开了Office的安全机制,不管文件是否被标记为“来自互联网”都能直接读取。
方法2:修正OleDb连接字符串+解除文件锁定
如果你坚持用OleDb,需要两个调整:
2.1 修正连接字符串
你原来的连接字符串里有错误的参数,Excel 2003是二进制格式,不是XML,正确的写法应该是:
MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;ReadOnly=True""")
- 去掉了
Excel 8.0 XML和Format=xls,换成Excel 8.0(对应Excel 2003) - 添加
IMEX=1:强制将混合数据类型的列视为文本,避免读取数据时丢失内容 - 添加
ReadOnly=True:避免文件锁定问题
2.2 解除文件的“互联网标记”
从网页下载的文件会被Windows添加一个隐藏的Zone.Identifier数据流,Office正是通过这个标记触发安全警告。可以用代码自动移除这个标记:
Imports System.IO Private Sub UnblockDownloadedFile(filePath As String) ' 隐藏的数据流路径 Dim zoneFilePath As String = $"{filePath}:Zone.Identifier" If File.Exists(zoneFilePath) Then File.Delete(zoneFilePath) End If End Sub
在读取文件前调用这个方法:
Dim path As String = "C:\holding\list_demands.xls" UnblockDownloadedFile(path) ' 然后执行你的OleDb读取代码
方法3:调整Office安全设置(不推荐)
如果只是自己测试用,可以临时关闭Office的受保护视图:
- 打开Excel → 文件 → 选项 → 信任中心 → 信任中心设置
- 选择“受保护的视图”,取消勾选“来自互联网的文件在受保护的视图中打开”
但这个方法是全局设置,会降低所有文件的安全性,不适合部署给其他用户。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

