Сохраните и закройте объект ActiveX

Я пытаюсь использовать javascript для отправки данных в список excel, добавления данных в список, сохранения и закрытия списка. Я знаю, что при использовании 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();

}

person Deviator    schedule 03.03.2017    source источник


Ответы (2)


Документы MSDN https://msdn.microsoft.com/en-us/library/6958xykx(v=vs.100).aspx указывает, что метод является частью пространства имен Application, поэтому попробуйте вместо него использовать Excel.Application.Quit();. Он также имеет синтаксис Excel.saveAs.

Хотя я понимаю, что это сценарий только для IE, обратите внимание, что IE Edge также не будет его поддерживать, поэтому он вообще не рассчитан на будущее. Если у вас есть доступ к некоторым инструментам на стороне сервера, есть множество библиотек Excel, которые вы можете использовать с вызовами ajax. Лично мы используем модуль https://github.com/SheetJS/js-xlsx для узла .js

person Shilly    schedule 03.03.2017
comment
спасибо за это, к сожалению, это не сработало. Относительно того, чтобы не быть доказательством будущего. Это всего лишь обходной путь, пока не будет реализована более сложная система. Чего я не понимаю, так это почему другие методы работают безупречно, а saveas() и quit() - нет. Может ли это быть из-за какой-то проблемы с разрешением или около того? - person Deviator; 03.03.2017
comment
@ Девиатор Может быть. Учетная запись, запускающая этот скрипт, очевидно, должна иметь права на запись в папку, в которую вы сохраняете. У нас были похожие проблемы, когда мы не могли записывать на общий диск, потому что сценарий выполнялся внутри службы в IIS под учетной записью SYSTEM вместо использования учетной записи администратора. В итоге использовал сценарий SMB2 для доступа к общему диску с правильными учетными данными. (на стороне сервера) - person Shilly; 03.03.2017

Итак, для всех, кто заинтересован в решении. Моя ошибка заключалась в том, что я не заполнил форму полностью, поэтому код пропускает части этой строки кода: 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: Спасибо за ссылку на документацию, она помогла мне найти решение.

person Deviator    schedule 03.03.2017