aardio+VBScript获取到Excel表格的数据到vlistEx控件

zhhyit 8天前 189

使用aardio+VBScript,终于艰难的获取到Excel表格的数据到vlistEx控件里了

记录过程下,并分享下

import win.ui;
import console;
import web.script.json;
import godking.vlistEx;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
vlist={cls="vlistEx";text="自定义控件";left=86;top=47;right=644;bottom=401;z=1}
)
/*}}*/

var vm = web.script("VBScript");

vm.script = /*
Function ReadExcelRange(filePath, sheetName, rangeAddress)
    ' 创建Excel应用程序对象
    Dim excelApp
    Set excelApp = CreateObject("Excel.Application")

    ' 禁用Excel界面显示(提高性能)
    excelApp.Visible = False

    ' 禁用警告提示(如文件已存在等)
    excelApp.DisplayAlerts = False

    On Error Resume Next ' 开启错误处理

    ' 打开工作簿
    Dim workbook
    Set workbook = excelApp.Workbooks.Open(filePath)

    If Err.Number <> 0 Then
        ReadExcelRange = "错误:无法打开文件 " & filePath
        Exit Function
    End If

    ' 获取工作表
    Dim worksheet
    Set worksheet = workbook.Worksheets(sheetName)

    If Err.Number <> 0 Then
        ReadExcelRange = "错误:工作表 '" & sheetName & "' 不存在"
        workbook.Close False
        Exit Function
    End If

    ' 获取指定范围
    Dim targetRange
    Set targetRange = worksheet.Range(rangeAddress)

    ' 准备返回结果的二维数组
    Dim result(), i, j
    ReDim result(targetRange.Rows.Count - 1, targetRange.Columns.Count - 1)

    ' 将数据填充到数组中
    For i = 1 To targetRange.Rows.Count
        For j = 1 To targetRange.Columns.Count
            result(i - 1, j - 1) = targetRange.Cells(i, j).Value
        Next
    Next

    ' 清理对象
    workbook.Close False
    excelApp.Quit
    Set targetRange = Nothing
    Set worksheet = Nothing
    Set workbook = Nothing
    Set excelApp = Nothing

    ' 返回结果数组
    ReadExcelRange = result

    On Error GoTo 0 ' 关闭错误处理
End Function

' 假设你想读取 "C:\Test.xlsx" 中 "Sheet1" 的 "A1:B2" 范围
' Dim data
' data = ReadExcelRange("C:\Test.xlsx", "Sheet1", "A1:B2")
' 现在 data 是一个二维数组,包含该范围的数据
*/ 

//通过 vm.script.函数名() 调用 VBScript 函数。
var ret = vm.script.ReadExcelRange("C:\test.xlsx", "Sheet1", "A1:C5");
winform.vlist.setTable(ret,,150,1);
console.dumpTable(ret);
console.log(type(ret))

winform.show();
win.loopMessage();


上传的附件:
最新回复 (5)
  • 光庆 7天前
    0 2
    winform.vlist.setTable(ret,table.remove(ret),150,1);

    这样改一下试试

  • 近我者赤 7天前
    0 3

  • zhhyit 7天前
    0 4
    光庆 winform.vlist.setTable(ret,table.remove(ret),150,1);这样改一下试试

    默认把第一行数组作为vlistEx控件的标题了,非常NICE

    光庆大佬的vlistEx考虑的场景真周到

  • zhhyit 7天前
    0 5
    光庆 winform.vlist.setTable(ret,table.remove(ret),150,1);这样改一下试试

    突然发现个问题,VBScript获取表格的数据A1:T1000左右的数据量的时候时真慢啊,大约1分钟左右能vlistEx能获取出来。


  • zhhyit 7天前
    0 6
    zhhyit 突然发现个问题,VBScript获取表格的数据A1:T1000左右的数据量的时候时真慢啊,大约1分钟左右能vlistEx能获取出来。

    增加vlistEx控件的窗体自适应,最大化窗体,vlistEx控件自动缩放

    原VBScript代码部分

        ' 准备返回结果的二维数组
        Dim result(), i, j
        ReDim result(targetRange.Rows.Count - 1, targetRange.Columns.Count - 1)
        ' 将数据填充到数组中
        For i = 1 To targetRange.Rows.Count
            For j = 1 To targetRange.Columns.Count
                result(i - 1, j - 1) = targetRange.Cells(i, j).Value
            Next
        Next

    修改VBScript代码部分

        ' 使用Value2属性一次性获取所有数据(比逐单元格读取快得多)
        Dim result
        result = targetRange.Value2

    完整代码分享(自己记录下)

    import win.ui;
    import console;
    import web.script.json;
    import godking.vlistEx;
    /*DSG{{*/
    var winform = win.form(text="aardio form";right=946;bottom=478)
    winform.add(
    button={cls="button";text="读取EXCEL数据";left=10;top=3;right=120;bottom=33;z=2};
    vlist={cls="vlistEx";text="自定义控件";left=9;top=39;right=934;bottom=468;ah=1;aw=1;db=1;dl=1;dr=1;dt=1;edge=1;frame=1;z=1}
    )
    /*}}*/
    
    var vm = web.script("VBScript");
    
    vm.script = /*
    Function ReadExcelRange(filePath, sheetName, rangeAddress)
        ' 创建Excel应用程序对象
        Dim excelApp
        Set excelApp = CreateObject("Excel.Application")
    
        ' 禁用Excel界面显示和警告提示(提高性能)
        excelApp.Visible = False
        excelApp.DisplayAlerts = False
        excelApp.ScreenUpdating = False
        excelApp.EnableEvents = False
    
        On Error Resume Next ' 开启错误处理
    
        ' 打开工作簿
        Dim workbook
        Set workbook = excelApp.Workbooks.Open(filePath)
    
        If Err.Number <> 0 Then
            ReadExcelRange = "错误:无法打开文件 " & filePath
            excelApp.Quit
            Set excelApp = Nothing
            Exit Function
        End If
    
        ' 获取工作表
        Dim worksheet
        Set worksheet = workbook.Worksheets(sheetName)
    
        If Err.Number <> 0 Then
            ReadExcelRange = "错误:工作表 '" & sheetName & "' 不存在"
            workbook.Close False
            excelApp.Quit
            Set excelApp = Nothing
            Exit Function
        End If
    
        ' 获取指定范围
        Dim targetRange
        Set targetRange = worksheet.Range(rangeAddress)
        
        ' 使用Value2属性一次性获取所有数据(比逐单元格读取快得多)
        Dim result
        result = targetRange.Value2
        
        ' 清理对象
        workbook.Close False
        excelApp.Quit
        Set targetRange = Nothing
        Set worksheet = Nothing
        Set workbook = Nothing
        Set excelApp = Nothing
    
        ' 返回结果数组
        ReadExcelRange = result
    
        On Error GoTo 0 ' 关闭错误处理
    End Function
    
    ' 假设你想读取 "C:\Test.xlsx" 中 "Sheet1" 的 "A1:B2" 范围
    ' Dim data
    ' data = ReadExcelRange("C:\Test.xlsx", "Sheet1", "A1:B2")
    ' 现在 data 是一个二维数组,包含该范围的数据
    */ 
    
    //通过 vm.script.函数名() 调用 VBScript 函数。
    winform.button.oncommand = function(id,event){
    	var ret = vm.script.ReadExcelRange("C:\test.xlsx", "Sheet1", "A1:T1000");
    	winform.vlist.setTable(ret,table.remove(ret),-1,1);	
    }
    
    winform.show();
    win.loopMessage();

    速度终于提升一点点了,还是用内存快

    上传的附件:
返回