注册 登录
编程论坛 VB6论坛

请问如何突破各种限制或错误直接读取EXCEL文件里的内容?

ictest 发布于 2023-11-01 01:49, 996 次点击
我手头上经常接收到各部门、各客户发送来的EXCEL文件,完全没有一个标准格式以及版本,有的还是OFFICE2007、有的是OFFICE2010、有的是OFFICE2016或者更高;有的客户发来的是只读性质的,有的可能是用什么工具从PDF转的,有的文件名带有空格的,有的文件名带有符号的,杂七杂八,乱七八糟。导致我有时在OFFICE2010环境下打开文件,直接飘红,提示“OFFICE已检测到此文件存在问题,编辑此文件可能会损害您的计算机,请单击查看详细信息”。这种情况经常发生,人都快发疯了。

通过类似于如下的程序打开该类文件,经常报错:
程序代码:
Dim xlApp As Excel.Application
Dim xlBook As Excel.WorkBook
Dim xlSheet As Excel.Worksheet
Set xlApp = CreateObject("Excel.Application") '创建EXCEL对象
Set xlBook = xlApp.Workbooks.Open("文件名") '打开已经存在的EXCEL工件簿文件
xlApp.Visible = True '设置EXCEL对象可见(或不可见)
Set xlSheet = xlBook.Worksheets("表名") '设置活动工作表


想请教一下各位高手,是否有类似于如下的方法,直接读取EXCEL文件的内容,而不打开文件(防止什么类似文件名不规范等问题导致报错):
程序代码:
        Open Text1.Text For Binary As #1
        ReDim aryContent(LOF(1) - 1)
        Get #1, , aryContent
        Close #1
        
        strWj = StrConv(aryContent, vbUnicode)
        strJ = Split(strWj, vbCrLf)
        
        For ii = 0 To UBound(strJ)
            b() = Split(strJ(ii), ",")
            If ii > 33 And IsNumeric(Left(strJ(ii), 1)) = True Then
                PIC(b(3), b(4)) = b(2)
            End If
        Next ii


是否可用ADO方式?从来没有用过,能否给出直接读取EXCEL文件内容,并把每一行都写入一维数组?

我也想过能否把EXCEL文件转换成CSV文件,但是那也是要先打开,又要触发各种各样的问题:

想请各位高手给出一个解决方案,方便的话希望能够给出相应的程序,谢谢各位!
7 回复
#2
约定的童话2023-11-01 07:40
没有真正意义的不打开,都是打开不可见那种操作模式,建议你把office升级到2021版本或者365版本试下
#3
厨师王德榜2023-11-01 09:07
一点粗浅的经验,2007以上的xlsx版本,其实都是一个个zip压缩包,你可以用程序打开压缩包,读取其中的xml文件,看你的意思,你只关心数据本身,他用的什么颜色什么字体...不是你关注的对象? 那么直接读取xml就对了.
以下是具体结构:
xl路径下 workbook.xml 是所有sheet的总览.
         sharedStrings.xml 含有表头
         comments1.xml 含有标注.
         tables /worksheets 路径下的所有xml,含有具体数据
如果你对xml结构比较熟悉,这个方式是最直接的.
#4
ictest2023-11-01 15:14
在网上找到一个方法,使用第三方库(Jet.OLEDB)读取Excel数据(.xls格式),如下,但是读取信息不全,大部分都能读到,少量当中位置读取不到,请麻烦各位高手帮忙看一下哪里有问题,谢谢!

程序代码:
Private Sub Command1_Click()
   
On Error Resume Next
'说明:使用第三方库(Jet.OLEDB)读取Excel数据(.xls格式)
    'Excel文件的路径
    Dim sXLPath As String
   
    sXLPath = "c:\委托单-AABBCC20221212004.xls"

    ' NO1:前期绑定(静态绑定)
    ' 需要添加对Microsoft ActiveX Data Objects xx.x Library的引用(版本号根据ADO版本变化)             '我2.8、6.1都已经试过。
    Dim CN As New ADODB.Connection
    Dim RS As New ADODB.Recordset
   
    Dim CNStr As String
    Dim sqlQuery As String
   
    ' 连接到Excel文件
   
    CNStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={path};Extended Properties=""Excel 8.0;HDR=Yes;"";"
   
    CNStr = Replace(CNStr, "{path}", sXLPath)
    CN.Open CNStr
   
    ' 构造SQL查询语句
    sqlQuery = "SELECT * FROM [Sheet1$];"
   
    ' 执行查询并将结果保存到记录集(Recordset)
    RS.Open sqlQuery, CN
   
    ' 将数据读取到数组中
    Dim aryData() As Variant
    aryData = RS.GetRows
   
    RS.Close
    CN.Close
   
    '输出,获取二维数组的行数和列数
    Dim rows As Long, cols As Long
    rows = UBound(aryData, 1) + 1  ' 行数
    cols = UBound(aryData, 2) + 1 ' 列数
   
    ' 遍历二维数组
    Open "C:\25.txt" For Append As #5
    Dim i As Long, j As Long
    For i = 0 To rows - 1
        For j = 0 To cols - 1
            ' 访问二维数组中的元素
            Print #5, "aryData(" & j & ", " & i & ") = " & aryData(j, i)
        Next j
    Next i
    Close #5

MsgBox "ok"
   
End Sub


下图中绿框内就是可以读到的信息,红框内信息获取不到
只有本站会员才能查看附件,请 登录


附EXCEL文件
只有本站会员才能查看附件,请 登录
#5
厨师王德榜2023-11-01 17:45
1、旧版本的excel ,驱动程序为
"Provider=Microsoft.Jet.OLEDB.4.0;"
如果是新版本的,可能需要改为
"Provider=Microsoft.ACE.OLEDB.12.0;"
具体要看你电脑上装没装这个驱动.装了的话推荐用高版本的驱动。
2、ADO方式访问excel,理论上可行,但是对数据比较“规范”的纯数据页更有可行性。
什么叫“比较规范”?
一、单表头
二、每列必有列名
三、列名相互不重复。
如果你的excel满足上述规则,那么用ADO方式是比较好的。
但是看了你的样表。。。
事实上,很多人把excel不是当成存储数据的“数据库”来用,而是用作一个report,
此时数据自然满足不了上述“规范性”规则,所以此时用ADO方式方式,可能并不是最好的选择。
#6
牛掰2023-11-02 12:50
回复 4楼 ictest
On Error Resume Next    '忽略错误值
   
    Dim excelApp As Excel.Application
    Dim workbook As Excel.workbook
    Dim worksheet As Excel.worksheet
    Dim err
   
    ' 创建Excel应用程序对象
    Set excelApp = New Excel.Application
   
    ' 打开文件对话框选择Excel文件
    With CommonDialog1
        .Filter = "Excel文件(*.xls;*.xlsx)|*.xls;*.xlsx"
        .DialogTitle = "请选择Excel文件"
        .ShowOpen
    End With
   
    ' 判断用户是否选择了文件
    If CommonDialog1.FileName = "" Then
        MsgBox "未选择Excel文件", , "提示!!"
        Exit Sub
    End If
   
    ' 打开Excel文件
    Set workbook = excelApp.Workbooks.Open(CommonDialog1.FileName)
   
    ' 获取第一个表格
    Set worksheet = workbook.Worksheets(1)
   
    err = worksheet.Range(worksheet.Cells(2, 1), worksheet.Cells(worksheet.UsedRange.Rows.Count, 1))    '获取库存文件第2行1列--最后行
   
    ' 关闭Excel文件和应用程序
    workbook.Close False
    excelApp.Quit
   
    ' 释放对象资源
    Set worksheet = Nothing
    Set workbook = Nothing
    Set excelApp = Nothing
   
    CommonDialog1.FileName = ""
   
    ' 显示数据
'    MsgBox "第一个表格的所有数据:" & vbCrLf & vbCrLf & err
#7
yuma2023-11-03 11:58
读写个EXCEL,你用驱动干嘛?
#8
wube2023-12-26 18:06
以下是引用ictest在2023-11-1 01:49:39的发言:
Set xlSheet = xlBook.Worksheets("表名") '设置活动工作表


个人经验,最好不要用这个语法设置活动工作表,
EXCEL2016和其他之前版本的(默认)"表名"不通用,

改用Set xlSheet = wb.Sheets(j)
比较保险,不会有EXCEL版本的问题
1