保存并退出ActiveX对象

我正在尝试使用JavaScript将数据发送到Excel列表,将数据添加到列表,保存并closures列表。 我知道什么时候使用ActiveX我只限于IE浏览器,但那没关系。

我面临的问题是既不退出也不保存方法。 该进程保持打开状态,数据不会保存,除非我手动保存。

这里是代码:

function getNumber() { var Excel = new ActiveXObject("Excel.Application"); var test = Excel.Workbooks.Open("pathToFile"); var LastRow = test.ActiveSheet.Range("A1").CurrentRegion.Rows.Count; alert(LastRow); var combine = "A" + (LastRow); alert(combine); var getCell = test.ActiveSheet.Range(combine).Value; var delimiter = '_'; var start = 3; var tokens = getCell.split(delimiter).slice(start); var result = parseInt(tokens.join(delimiter)); var newNumber = result + 1; whichCompany(); var newRow = "A" + (LastRow + 1); var id = "D_" + selectedName + "_2017_"+ newNumber.toString(); test.ActiveSheet.Range(newRow).Value = id; alert(id); newRow = "B" + (LastRow + 1); var m_names = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); var d = new Date(); var curr_date = d.getDate(); var curr_month = d.getMonth(); var curr_year = d.getFullYear(); var dateNow = curr_date + m_names[curr_month] + curr_year; test.ActiveSheet.Range(newRow).value = dateNow; newRow = "C" + (LastRow + 1); test.ActiveSheet.Range(newRow).Value = document.getElementById("fName").value + " " + document.getElementById("lName").value; newRow = "D" + (LastRow + 1); internalOrExternal(); test.ActiveSheet.Range(newRow).Value = intOrExt; newRow = "E" + (LastRow + 1); test.ActiveSheet.Range(newRow).Value = document.getElementById("case").value; newRow = "F" + (LastRow + 1); test.ActiveSheet.Range(newRow).Value = document.getElementById("produkt").value; Excel.Quit(); } 

MSDN文档https://msdn.microsoft.com/en-us/library/6958xykx(v=vs.100).aspx表示该方法是Application命名空间的一部分,因此请尝试使用Excel.Application.Quit(); 代替。 它也有Excel.saveAs语法。

虽然我知道这只是一个IE浏览器的脚本,但请注意,IE Edge也不会支持它,所以它根本不是未来的certificate。 如果你可以访问一些服务器端工具,那么你可以使用一堆excel库来使用ajax调用。 就个人而言,我们使用https://github.com/SheetJS/js-xlsx模块为node.js

好的,对于那些对解决scheme感兴趣的人。 我做的错误是我没有完全填写表格,所以代码跳过下面这行代码的部分:newRow =“B”+(LastRow + 1);

这将导致quit()方法永远不会被调用。 在对所有在testing时没有使用的代码进行注释时,代码的工作没有任何问题。

作为额外的信息,如果有人遇到类似的问题,使用saveAs()方法时,可以将文件保存为相同的文件名,以便saveas()可以作为一个简单的保存。

请参阅下面的代码(我没有使用testing用例的代码被注释掉了,这是之前跳过的代码,以及save()和quit()两个方法):

 function getNumber() { var Excel = new ActiveXObject("Excel.Application"); var test = Excel.Workbooks.Open("pathToFile"); var LastRow = test.ActiveSheet.Range("A1").CurrentRegion.Rows.Count; alert(LastRow); var combine = "A" + (LastRow); alert(combine); var getCell = test.ActiveSheet.Range(combine).Value; var delimiter = '_'; var start = 3; var tokens = getCell.split(delimiter).slice(start); var result = parseInt(tokens.join(delimiter)); var newNumber = result + 1; whichCompany(); var newRow = "A" + (LastRow + 1); var id = "D_" + selectedName + "_2017_"+ newNumber.toString(); test.ActiveSheet.Range(newRow).Value = id; alert(id); <!-- newRow = "B" + (LastRow + 1); --> <!-- var m_names = new Array("Jan", "Feb", "Mar", --> <!-- "Apr", "May", "Jun", "Jul", "Aug", "Sep", --> <!-- "Oct", "Nov", "Dec"); --> <!-- var d = new Date(); --> <!-- var curr_date = d.getDate(); --> <!-- var curr_month = d.getMonth(); --> <!-- var curr_year = d.getFullYear(); --> <!-- var dateNow = curr_date + m_names[curr_month] + curr_year; --> <!-- test.ActiveSheet.Range(newRow).value = dateNow; --> <!-- newRow = "C" + (LastRow + 1); --> <!-- test.ActiveSheet.Range(newRow).Value = document.getElementById("fName").value + " " + document.getElementById("lName").value; --> <!-- newRow = "D" + (LastRow + 1); --> <!-- internalOrExternal(); --> <!-- test.ActiveSheet.Range(newRow).Value = intOrExt; --> <!-- newRow = "E" + (LastRow + 1); --> <!-- test.ActiveSheet.Range(newRow).Value = document.getElementById("case").value; --> <!-- newRow = "F" + (LastRow + 1); --> <!-- test.ActiveSheet.Range(newRow).Value = document.getElementById("produkt").value; --> test.SaveAs("pathToFile"); Excel.Application.Quit(); } 

@Shilly:感谢文档链接,它帮助我find了解决scheme。