2017-03-03 65 views
1

我想用javascript将数据发送到excel-list,将数据添加到列表中,保存并关闭列表。我知道何时使用ActiveX我只限于IE浏览器,但那没关系。保存并退出ActiveX对象

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

赫雷什的代码:

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(); 

} 

回答

0

好吧,以便对解决方案感兴趣的任何人。我做的错误是我没有完全填写表格,所以代码跳过这段代码中的部分:newRow =“B”+(LastRow + 1);

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

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

请参阅下面的代码为我工作(我没有用于测试用例的代码已被注释掉,这是之前跳过的代码,以及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:感谢链接到文档,它帮助我获得了解决方案。

0

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

虽然我知道这是一个只适用于IE的脚本,但请注意IE Edge也不会支持它,所以它根本就不是面向未来的。如果您有权访问某些服务器端工具,那么您可以使用一堆excel库与ajax调用一起使用。我个人使用的https://github.com/SheetJS/js-xlsx模块node.js

+0

谢谢你,不幸的是它没有工作。关于不是未来的证明。这只是一个解决方案,直到实施更复杂的系统。我不明白的是为什么其他方法似乎完美地工作,但“saveas()”和“quit()”不。这可能是由于一些权限问题左右? – Deviator

+0

@Deviator它可能是。运行此脚本的帐户显然必须对要保存的位置拥有写入权限。我们有一个类似的问题,我们无法写入共享驱动器,因为脚本运行在SYSTEM acount下的IIS服务中,而不是使用管理员帐户。结束使用SMB2脚本以正确的凭据访问共享驱动器。 (服务器端) – Shilly