DC娱乐网

aardio无需VBA,同样可以交互式操作当前打开的Excel WPS

引言

我们都知道,交互式操作当前打开的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();