保存并退出 ActiveX 对象
Save and quit ActiveX Object
我正在尝试使用 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();
}
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
好的,对于任何对此解决方案感兴趣的人。我犯的错误是我没有完整填写表格,所以代码跳过了这行代码中的部分: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:感谢文档的 link,它帮助我找到了解决方案。
我正在尝试使用 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();
}
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
好的,对于任何对此解决方案感兴趣的人。我犯的错误是我没有完整填写表格,所以代码跳过了这行代码中的部分: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:感谢文档的 link,它帮助我找到了解决方案。