保存并退出ActiveX对象

时间:2017-03-03 12:51:35

标签: javascript excel activex activexobject

我正在尝试使用javascript将数据发送到excel列表,将数据添加到列表,保存并关闭列表。我知道在使用ActiveX时我只限于IE,但没关系。

我面临的问题是quit和save方法都不起作用。除非我手动保存,否则该过程保持打开状态并且不保存数据。

下面是代码:

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

}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

这将导致永远不会调用quit()方法。在评论我在测试时没有真正使用的所有代码时,代码可以正常运行。

如果有人遇到类似问题的其他信息,当使用saveAs() - 方法时,您可以将文件保存为相同的文件名,因此saveas()可以作为简单的保存。

请看下面的代码对我有用(我没有用于测试用例的代码被注释掉。这是之前跳过的代码,以及两个方法save()和quit()):< / p>

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:感谢您提供文档链接,这有助于我找到解决方案的方法。