| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2124 人关注过本帖
标题:请问如何突破各种限制或错误直接读取EXCEL文件里的内容?
只看楼主 加入收藏
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
结帖率:70%
收藏
已结贴  问题点数:20 回复次数:7 
请问如何突破各种限制或错误直接读取EXCEL文件里的内容?
我手头上经常接收到各部门、各客户发送来的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文件,但是那也是要先打开,又要触发各种各样的问题:

想请各位高手给出一个解决方案,方便的话希望能够给出相应的程序,谢谢各位!
搜索更多相关主题的帖子: 内容 EXCEL 读取 打开 文件 
2023-11-01 01:49
约定的童话
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:56
帖 子:246
专家分:1442
注 册:2021-8-1
收藏
得分:5 
没有真正意义的不打开,都是打开不可见那种操作模式,建议你把office升级到2021版本或者365版本试下
2023-11-01 07:40
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
收藏
得分:5 
一点粗浅的经验,2007以上的xlsx版本,其实都是一个个zip压缩包,你可以用程序打开压缩包,读取其中的xml文件,看你的意思,你只关心数据本身,他用的什么颜色什么字体...不是你关注的对象? 那么直接读取xml就对了.
以下是具体结构:
xl路径下 workbook.xml 是所有sheet的总览.
         sharedStrings.xml 含有表头
         comments1.xml 含有标注.
         tables /worksheets 路径下的所有xml,含有具体数据
如果你对xml结构比较熟悉,这个方式是最直接的.
2023-11-01 09:07
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
在网上找到一个方法,使用第三方库(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文件
委托单-AABBCC20221212004.rar (8.71 KB)
2023-11-01 15:14
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
收藏
得分:0 
1、旧版本的excel ,驱动程序为
"Provider=Microsoft.Jet.OLEDB.4.0;"
如果是新版本的,可能需要改为
"Provider=Microsoft.ACE.OLEDB.12.0;"
具体要看你电脑上装没装这个驱动.装了的话推荐用高版本的驱动。
2、ADO方式访问excel,理论上可行,但是对数据比较“规范”的纯数据页更有可行性。
什么叫“比较规范”?
一、单表头
二、每列必有列名
三、列名相互不重复。
如果你的excel满足上述规则,那么用ADO方式是比较好的。
但是看了你的样表。。。
事实上,很多人把excel不是当成存储数据的“数据库”来用,而是用作一个report,
此时数据自然满足不了上述“规范性”规则,所以此时用ADO方式方式,可能并不是最好的选择。
2023-11-01 17:45
牛掰
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:38
专家分:100
注 册:2020-4-17
收藏
得分:5 
回复 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
2023-11-02 12:50
yuma
Rank: 12Rank: 12Rank: 12
来 自:银河系
等 级:贵宾
威 望:37
帖 子:1934
专家分:3012
注 册:2009-12-22
收藏
得分:5 
读写个EXCEL,你用驱动干嘛?

心生万象,万象皆程序!
本人计算机知识网:http://bbs.为防伸手党,本站已停止会员注册。
2023-11-03 11:58
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用ictest在2023-11-1 01:49:39的发言:
Set xlSheet = xlBook.Worksheets("表名") '设置活动工作表


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

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

不要選我當版主
2023-12-26 18:06
快速回复:请问如何突破各种限制或错误直接读取EXCEL文件里的内容?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020757 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved