2017-03-03 11 views
1

JavaScriptを使用してExcelにデータを送信しようとしています。リストにデータを追加して保存して閉じます。私はActiveXを使用するときに私はIEに制限されていることを知っているが、それは大丈夫だ。ActiveXオブジェクトを保存して終了する

私が直面している問題は、終了も保存方法も機能しないことです。私が手動で保存しない限り、プロセスは開いたままで、データは保存されません。

HERESにコード:

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()の2つのメソッドとともに前にスキップされたコードです。

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はそれをサポートしていないことに注意してください。いくつかのサーバー側のツールにアクセスできる場合、そこにはajax呼び出しで使用できるExcelライブラリがたくさんあります。個人的には、node.jsのhttps://github.com/SheetJS/js-xlsxモジュールを使用します。

+0

残念ながら、それは仕事をしなかった。将来の証明ではないことについて。これは、より洗練されたシステムが実装されるまでの単なる回避策です。私が理解していないのは、他の方法が完璧に機能するように見えるが、 "saveas()"と "quit()"はそうではない理由です。これは何らかのパーミッションの問題が原因でしょうか? – Deviator

+0

@Deviatorそうかもしれない。このスクリプトを実行しているアカウントには、保存先の場所への書き込み権限が必要です。 adminアカウントを使用する代わりに、スクリプトがIIS上のサービス内でSYSTEMアカウントで実行されていたため、共有ドライブに書き込めなかった同様の問題が発生しました。 SMB2スクリプトを使用して、正しい資格情報で共有ドライブにアクセスしました。 (サーバ側) – Shilly

関連する問題