Foxtable(狐表)用户栏目专家坐堂 → 如何判断EXCEL单元格中是否有内容?


  共有4911人关注过本帖树形打印复制链接

主题:如何判断EXCEL单元格中是否有内容?

帅哥哟,离线,有人找我吗?
wh420
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望:0 精华:0 注册:2014/2/19 16:32:00
如何判断EXCEL单元格中是否有内容?  发帖心情 Post By:2016/5/23 12:11:00 [显示全部帖子]

如何判断EXCEL单元格中是否有内容?有的单元格明明是空的,但有可能被设置了格式,所以此类单元格不被认为是空,如何实现准确判断?看得见的为非空,看不见的就为空

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2016/5/23 14:09:00 [显示全部帖子]

SORRY,我没有表述清楚,见如下代码:

Dim Book As New XLS.Book("d:\temp\2.xlsx")

For k As Integer = 0 To Book.Sheets.Count-1 '//多个sheet的处理
         Dim Sheet = Book.Sheets(k)
                For i As Integer = 0 To Sheet.Rows.Count-1
                    For j As Integer = 0 To Sheet.Cols.Count -1
                        If sheet(i,j).text > "" Then
                                Dim dr As DataRow = DataTables("排重表").AddNew
                                dr("第一列") = sheet(i,j).Text
                        End If
                    Next
                Next
Next

见附件EXCEL,
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:2.xlsx


如上代码输出:output.show(Sheet.Rows.Count)值为3行,output.show(Sheet.Cols.Count)值为:16384列(EXCEL在操作时选择了整个表设置了字体,所以默认16384列都被记数了)
而实际上EXCEL表格就3行,1列。如何让循环的终止值只处理有内容的列数,没有内容的列不处理,可以减少循环次数提高效率。

实际应用上表格有内容的行和列不固定,随机的。我只想处理有内容的行和列,空白的列不去处理,如何实现?
[此贴子已经被作者于2016/5/23 14:13:23编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2016/5/23 14:14:00 [显示全部帖子]

我想减少循环次数,有多少列实际有内容的就循环到这些列。

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2016/5/23 15:23:00 [显示全部帖子]

好吧,我试试。谢谢

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2016/5/23 15:33:00 [显示全部帖子]

 If sheet(i,j).text > "" Then
                Dim dr As DataRow = DataTables("排重表").AddNew
                dr("第一列") = sheet(i,j).Text
End If

此段代码如果换成数组统一加到表中是不是会快一些?如何加

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2016/5/23 16:48:00 [显示全部帖子]

执行以下代码执行一半报错,老师帮看看哪里有问题。

图片点击可在新窗口打开查看此主题相关图片如下:qq截图20160523164706.jpg
图片点击可在新窗口打开查看


For Each file In FileSys.GetFiles(path)
    'try
    Dim App As New MSExcel.Application
    Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(file)
    
    'Dim Book As New XLS.Book(file)
    For k As Integer = 1 To wb.workSheets.Count '//多个sheet的处理
        Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(k)
        Dim Rg As MSExcel.Range = Ws.UsedRange
        'Dim Sheet = Book.Sheets(k)
        'If rg.Columns.Count < 500 Then
        For i As Integer = 1 To rg.Rows.Count
            For j As Integer = 1 To rg.Columns.Count
                msgbox(1)
                If rg.Cells(i,j).value > "" Then
                    If Forms("提取工具").Controls("CBox").Checked = True  Then
                        Dim dr As DataRow = DataTables("排重表").AddNew
                        dr("第一列") = Rg.Cells(i,j).value
                    ElseIf Forms("提取工具").Controls("CBox").Checked = False  Then
                        Dim dr As DataRow = DataTables("排重表").AddNew
                        dr("第一列") = Rg.Cells(i,j).value
                    End If
                End If
            Next
        Next
        Wb.Close()
Next
    app.quit()


 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2016/5/24 10:40:00 [显示全部帖子]

改了,但我测试EXCEL中有一个sheet的时候不报错,两个或多个就报如下错误:


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20160524103749.jpg
图片点击可在新窗口打开查看


 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2016/5/24 10:58:00 [显示全部帖子]

知道了,Wb.Close()放的位置不对。谢谢

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2016/5/24 15:38:00 [显示全部帖子]

以上代码调试成功但处理多个EXCEL的时候效率很低,可否把EXCEL中的内容先提到数组或词典中,再由组织或词典一次性加入到FOXTABLE表中?

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2016/5/24 23:31:00 [显示全部帖子]

TO 大红袍,以下代码您看一下我改的对吗?感觉效率没怎么提升啊,帮我看看还有优化的空间吗?
Dim dlg As New OpenFileDialog
Dim l1 As WinForm.Label = e.Form.Controls("Label1")
dlg.Filter= "所有文件|*.*|Excel2003文件|*.xls|Excel2007文件|*.xlsx" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    Dim t1 As Date = Date.Now
    
    
    DataTables("表A").StopRedraw
    
    Dim App As New MSExcel.Application
    try
        Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(dlg.FileName)
        Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
        Dim Rg As MSExcel.Range = Ws.UsedRange
        Dim ary = rg.value
        For i As Integer = 1 To rg.Rows.Count
            For j As Integer = 1 To rg.Columns.Count
                If rg.Cells(i,j).Text > "" Then
                    Dim dr As DataRow = DataTables("表A").AddNew
'dr("第一列") = Rg.Cells(i,j).value
                    dr("第一列") = ary(i,j)
                End If
            Next
        Next
    catch ex As exception
        msgbox(ex.message)
    finally
        DataTables("表A").ResumeRedraw
        app.quit
    End try
    
    l1.text="计算结束, 耗时: " & (Date.Now - t1).TotalSeconds & "秒"
    
Else
    Return
End If

 回到顶部
总数 15 1 2 下一页