我们都知道,交互式操作当前打开的Excel或者WPS最方便的方式,一般是通过VBA完成一些自动化操作。其实也可以通过代码方式,获取当前打开的Excel文件,并进行自动化操作,此时就无需VBA。本文跟大家分享通过国产编程语言aardio代替VBA完成一些自动化的工作。
操作步骤
aardio操作当前打开的Excel或者WPS,通常需要遵循以下步骤:
获取当前打开的Excel
根据业务诉求,查询或者修改单元格的值
设置单元格格式
保存
aardio提供了com.excel组件用于操作Excel和WPS,该组件当前封装的内容比较少,具体需要查看微软MSDN文档。但是常用的操作其实并不多,本文会涉及到一些常用操作Excel的方法。依次按照上面的步骤来讲解。
获取当前打开的Excel
使用com.excel组件新建Excel或者打开当前Excel。交互式操作Excel针对当前打开的Excel或者WPS文件,可以通过下面的方法来实现。
var excel, err = com.excel(false)
考虑到一些可能获取失败的问题,简单封装了一个方法,获取当前正在工作的Excel。
import com.excel;getActiveExcel = function{ var running = true var excel, err while(running) { excel, err = com.excel(false) assert(excel, err) var wb = excel.ActiveWorkbook if(wb == null){ excel.Quit } else { running = false } } return excel}
获取当前正在工作的工作簿和工作表
aardio中可以分别通过ActiveWorkbook和ActiveSheet获取当前活动的工作簿和工作表。
var excel = getActiveExcel var wb = excel.ActiveWorkbook var sht = wb.ActiveSheet
获取当前活动的单元格
aardio中,可以通过excel.ActiveCell获取当前活动的单元格。
var cell = excel.ActiveCell
设置值和获取值
aardio可以通过Cells或者Range来获取单元格,然后再通过Value2属性获取和设置单元格的值,通过Formula设置单元格公式信息。
var cell = excel.ActiveCell //获取当前单元格 console.log(cell.Value2) console.log(sht.Cells(1,1).Value2) console.log(sht.Range("B2").Value2)
我们添加一列D列,并D列赋值。
var totalRows = sht.UsedRange.Rows.Count sht.Range("D1").Value2 = "Added" for(i=2;totalRows;1){ sht.Range("D"+i).Formula = string.format("=C%d + 1", i) }
获取当前选区信息
交互式操作Excel的时候,通常需要获取当前用户选择的单元格或者选区。前面提到的ActiveSheet可以获取到当前选择的一个单元格。可以通过excel.Selection操作用户选定的区域。
import string.builder;// 获取当前选区信息 var sel = excel.Selection console.log(string.format("选区地址,%s", sel.Address(false, false))) for(i=0;sel.Rows.Count-1;1){ var sb = string.builder for(j=0;sel.Columns.Count-1;1){ sb.append(sht.Cells(sel.Row+i,sel.Column+j).Value2 + " ") } console.log(string.format("%2d,%s", i+1, tostring(sb.trim))) }
设置单元格颜色和边框
通常情况下,处理完Excel数据之后,还需要整理一下Excel的格式。通过Interior属性设置单元格颜色,Borders属性设置单元格边框。
// 设置颜色 sht.Range("D1:D"+totalRows).Interior.ColorIndex = 15 // Excel内置颜色,取值范围1-255 // 设置边框 var borders = sht.Range(sht.Cells(1,1), sht.Cells(totalRows,4)).Borders borders.Weight = excel.xlHairline borders(excel.xlInsideVertical).Weight = excel.xlContinuous // 内部边框
保存
保存Excel可以通过Save保存在原来的位置,或者SaveAs保存在一个新的位置。
excel.Save// 或者另存为excel.SaveAs(path)
退出Excel
交互式场景下,通常不需要在代码中主动退出Excel进程。如果实在需要,可以通过Quit方法退出Excel进程。
excel.Quit
完整代码
下面是案例的完整代码。
import console;import com.excel;import string.builder;getActiveExcel = function{ var running = true var excel, err while(running) { excel, err = com.excel(false) assert(excel, err) var wb = excel.ActiveWorkbook if(wb == null){ excel.Quit } else { running = false } } return excel}testExcel2 = function{ var excel = getActiveExcel var wb = excel.ActiveWorkbook var sht = wb.ActiveSheet var cell = excel.ActiveCell var totalRows = sht.UsedRange.Rows.Count // 获取值 console.log(cell.Value2) console.log(sht.Cells(1,1).Value2) console.log(sht.Range("B2").Value2) // 设置值 sht.Range("D1").Value2 = "Added" for(i=2;totalRows;1){ sht.Range("D"+i).Formula = string.format("=C%d + 1", i) } // 获取当前选区信息 var sel = excel.Selection console.log(string.format("选区地址,%s", sel.Address(false, false))) for(i=0;sel.Rows.Count-1;1){ var sb = string.builder for(j=0;sel.Columns.Count-1;1){ sb.append(sht.Cells(sel.Row+i,sel.Column+j).Value2 + " ") } console.log(string.format("%2d,%s", i+1, tostring(sb.trim))) } // 设置颜色 sht.Range("D1:D"+totalRows).Interior.ColorIndex = 15 // 设置边框 var borders = sht.Range(sht.Cells(1,1), sht.Cells(totalRows,4)).Borders borders.Weight = excel.xlHairline borders(excel.xlInsideVertical).Weight = excel.xlContinuous // 保存 excel.Save}testExcel2;console.pause;