この記事では、JavaScriptによるExcelをエクスポートする方法について説明します。参照のためにそれを共有してください。特定の実装方法は次のとおりです。
コードコピーは次のとおりです。<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<Meta http-equiv = "content-type" content = "text/html; charset = utf-8"/>
<Title> Excel文書としてWebページをエクスポートする方法</title>
</head>
<body>
<表ID = "TableExcel" cellpacing = "0" cellpadding = "0">
<tr>
<td colspan = "5" align = "center"> excelドキュメントとしてWebページをエクスポートする方法</td>
</tr>
<tr>
<td>列タイトル1 </td>
<td>列タイトル2 </td>
<td>列タイトル3 </td>
<td>列タイトル4 </td>
<td>列タイトル5 </td>
</tr>
<tr>
<td> aaa </td>
<td> bbb </td>
<td> ccc </td>
<td> ddd </td>
<td> ee </td>
</tr>
<tr>
<td> aaa </td>
<td> bbb </td>
<td> ccc </td>
<td> ddd </td>
<td> eee </td>
</tr>
<tr>
<td> fff </td>
<td> ggg </td>
<td> hhh </td>
<td> iii </td>
<td> jjj </td>
</tr>
</table>
<入力型= "ボタン" onclick = "javascript:method1( 'tableExcel');" value = "最初のメソッドはexcel">にインポートされます
<入力型= "ボタン" onclick = "javascript:method2( 'tableExcel');" value = "2番目のメソッドはExcel">にインポートされます
<入力型= "button" onclick = "javascript:getxlsfromtbl( 'tableexcel'、null);" value = "3番目のメソッドは、excel">にインポートされます
<スクリプト言語= "javascript">
関数method1(tableid){//テーブル全体をコピーしてExcelにします
var curtbl = document.getElementByIDX_X_X(TableID);
var oxl = new ActiveXObject( "Excel.Application");
// axオブジェクトExcelを作成します
var owb = oxl.workbooks.add();
//ワークブックオブジェクトを取得します
var osheet = owb.activesheet;
//現在のシートをアクティブにします
var sel = document.body.createTextrange();
SEL.MOVETOELEMENTTEXT(CURTBL);
//テーブル内の内容物をTextrangeに移動します
SEL.SELECT();
// Textrangeのすべての内容を選択します
sel.execcommand( "コピー");
// Textrangeでコンテンツをコピーします
osheet.paste();
//アクティブなExcelに貼り付けます
oxl.visible = true;
// Excel可視属性を設定します
}
関数Method2(TableID)//テーブル内の各セルを読み取り、Excelに
{
var curtbl = document.getElementByIDX_X_X(TableID);
var oxl = new ActiveXObject( "Excel.Application");
// axオブジェクトExcelを作成します
var owb = oxl.workbooks.add();
//ワークブックオブジェクトを取得します
var osheet = owb.activesheet;
//現在のシートをアクティブにします
var lenr = curtbl.rows.length;
//テーブル内の行数を取得します
for(i = 0; i <lenr; i ++)
{
var lenc = curtbl.rows(i).cells.length;
//行ごとの列数を取得します
for(j = 0; j <lenc; j ++)
{
osheet.cells(i + 1、j + 1).value = curtbl.rows(i).cells(j).innertext;
//割り当て
}
}
oxl.visible = true;
// Excel可視属性を設定します
}
関数getXlsfromtbl(intblid、inwindow){
試す {
var allstr = "";
var curstr = "";
// alert( "getxlsfromtbl");
if(intblid!= null && intblid!= "" && intblid!= "null"){
curstr = gettbldata(intblid、inwindow);
}
if(curstr!= null){
allstr += curstr;
}
それ以外 {
アラート(「エクスポートするテーブルは存在しません!」);
戻る;
}
var filename = getExcelfileName();
dofileexport(filename、allstr);
}
catch(e){
alert( "exportで例外が発生しました:" + e.name + " - >" + e.description + "!");
}
}
関数gettbldata(intbl、inwindow){
var rows = 0;
// alert( "gettbldata is" + inwindow);
var tbldocument = document;
if(!! inwindow && inwindow!= ""){
if(!document.all(inwindow)){
nullを返します。
}
それ以外 {
tbldocument = eval_r(inwindow).document;
}
}
var curtbl = tbldocument.getElementByIdx_x_x(intbl);
var outstr = "";
if(curtbl!= null){
for(var j = 0; j <curtbl.rows.length; j ++){
// alert( "j is" + j);
for(var i = 0; i <curtbl.rows [j] .cells.length; i ++){
// alert( "i as" + i);
if(i == 0 && rows> 0){
outstr += "";
行 - = 1;
}
outstr + = curtbl.rows [j] .cells [i] .innertext + "";
if(curtbl.rows [j] .cells [i] .colspan> 1){
for(var k = 0; k <curtbl.rows [j] .cells [i] .colspan -1; k ++){
outstr += "";
}
}
if(i == 0){
if(rows == 0 && curtbl.rows [j] .cells [i] .rowspan> 1){
rows = curtbl.rows [j] .cells [i] .rowspan -1;
}
}
}
outstr += "";
}
}
それ以外 {
outstr = null;
アラート(intbl + "存在しない!");
}
Return Outstr;
}
関数getExcelfileName(){
var d = new date();
var curyear = d.getyear();
var curmonth = "" +(d.getmonth() + 1);
var curdate = "" + d.getdate();
var curhour = "" + d.gethours();
var curminute = "" + d.getminutes();
var cursecond = "" + d.getSeconds();
if(curmonth.length == 1){
curmonth = "0" + curmonth;
}
if(curdate.length == 1){
curdate = "0" + curdate;
}
if(curhour.length == 1){
curhour = "0" + curhour;
}
if(curminute.length == 1){
curminute = "0" + curminute;
}
if(cursecond.length == 1){
cursecond = "0" + cursecond;
}
var filename = "leo_zhang" + "_" + curyear + curmonth + curdate + "_"
+ curhour + curminute + cursecond + ".csv";
// alert(filename);
ファイル名を返します。
}
function dofileexport(inname、instr){
var xlswin = null;
if(!! document.all( "glbhidefrm")){
xlswin = glbhidefrm;
}
それ以外 {
var width = 6;
var height = 4;
var openpara = "left =" +(window.screen.width / 2- width / 2)
+ "、top =" +(window.screen.height / 2 -height / 2)
+ "、scrollbars = no、width =" + width + "、height =" + height;
xlswin = window.open( ""、 "_blank"、openpara);
}
xlswin.document.write(strute);
xlswin.document.close();
xlswin.document.execcommand( 'saveas'、true、inname);
xlswin.close();
}
</script>
</body>
</html>
以下は、Excelプロセスの閉鎖に対処する問題です
コードを次のようにコピーします。
// --------------------------------------------------------------------
<スクリプト>
var strsavelocation = 'file:/// e:/1.xls'
関数createxls(){
var excel = new ActiveXObject( "Excel.Application");
var wk = excel.workbooks.add();
wk.saveas(strsavelocation);
wk.saved = true;
excel.quit();
}
関数writexls(){
var excel = new ActiveXObject( "Excel.Application");
var wk = excel.workbooks.open(strsavelocation);
var sheet = wk.worksheets(1);
Sheet.cells(1、1).value = 'test string';
wk.saveas(strsavelocation);
wk.saved = true;
excel.quit();
}
</script>
<body>
<button onclick = "createxls()"> create </button>
<button onclick = "writexls()">書き換え</button>
</body>
この例では、ローカルファイルを操作するときに例外は発生しません。 - ほとんどの場合、メモリゴミだけがあります。ただし、StrsavelocationがリモートURLである場合、ローカルファイルアクセス資格情報が保存され、Excelドキュメントを有効にして保存するために1つの(リモート)インスタンスのみを使用できます。したがって、[書き換え]ボタンを繰り返しクリックすると、例外が表示されます。
- これは、SPSで動作するときに共有ファイルのインスタンスの単純化されたコードであることに注意してください。したがって、それは「アカデミックな」退屈な議論ではなく、エンジニアリングの実際的な問題です。
この問題の解決策は複雑です。それには2つの問題が含まれます。
rocalローカルバウチャーのリリース
ActiveXオブジェクトインスタンスのリリース
JavaScriptのオブジェクトの「障害」問題から始めましょう。簡単に言えば:
objectオブジェクトは、住んでいるコンテキストの外で無効になります。
globalグローバルオブジェクトが実行されない場合(参照)、グローバルオブジェクトが無効になります。
例えば:
Copy the code as follows: //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// JavaScriptオブジェクトはいつ失敗しますか
// --------------------------------------------------------------------
function testobject(){
var _obj1 = new object();
}
関数testObject2(){
var _obj2 = new object();
_obj2を返します。
}
//例1
testObject();
//例2
testObject2()
//例3
var obj3 = testObject2();
obj3 = null;
//例4
var obj4 = testObject2();
var arr = [obj4];
obj3 = null;
arr = [];
これらの4つの例では:
- 「例1」は関数testObject()で_OBJ1を構築しますが、関数が終了すると、関数のコンテキストが残っているため、_OBJ1は無効です。
- 「例2」では、オブジェクト_OBJ2もtestObject2()で構築され、渡されるため、オブジェクトにはコンテキスト環境(および寿命)が「関数の外側」になりますが、関数の返品値は他の変数によって「保持されていない」ため、_OBJ2はすぐに無効になります。
- 「例3」では、TestObject2()によって構築された_OBJ2は、外部変数OBJ3によって保持されます。この時点で、コード「OBJ3 = null」が有効になるまで、_obj2は参照関係が消えるため無効になりません。
- 例3と同じ理由で、「例4」の_OBJ2は、コード「arr = []」の行の後に無効になりません。
ただし、オブジェクトの「障害」は「リリース」になるのを待つことはありません。 JavaScriptランタイムの内部では、ユーザーに「オブジェクトがいつリリースされるか」を正確に伝える方法はありません。これは、JavaScriptのメモリ回復メカニズムに依存します。 - この戦略は、.NETのリサイクルメカニズムに似ています。
以前のExcel操作の例コードでは、オブジェクトの所有者、つまり「Excel.exe」は、「ActiveXオブジェクトインスタンスのリリース」後にのみ発生します。ファイルロックとオペレーティングシステムの許可資格情報は、プロセスに関連しています。したがって、オブジェクトが「失敗」していて「リリース」ではなく「失敗」している場合、他のプロセスにファイルを処理し、オペレーティングシステムの許可資格情報を参照する際に問題が発生します。
- これはJavaScriptまたはcomメカニズムのバグだと言う人もいます。実際、そうではありません。これは、独立した問題ではなく、OS、IE、およびJavaScriptの複雑な関係によって引き起こされます。
Microsoftは、この問題を解決するための戦略を公開しました。これは、メモリリサイクルプロセスを積極的に呼びます。
CollectgarBage()プロセス(通常はGCプロセスと呼ばれます)が(Microsoft)JScriptで提供されます。 GCプロセスは、現在のIE、つまりオブジェクトを呼び出すデストラクタプロセスの「失敗したオブジェクトの不整合」をクリーンアップするために使用されます。
上記の例では、GCプロシージャを呼び出すコードは次のとおりです。
Copy the code as follows: //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// ActiveXオブジェクトを処理するときのGC手順の標準呼び出し方法
// --------------------------------------------------------------------
関数writexls(){
//(わずかに...)
excel.quit();
Excel = null;
setimeout(collectgarbage、1);
}
コードの最初の行は、excel.quit()メソッドを呼び出して、Excelプロセスを中止して終了します。この時点で、JavaScript環境にはExcelオブジェクトインスタンスがあるため、Excelプロセスは実際には中止されません。
コードの2行目により、Excel Nullがオブジェクト参照をクリアするため、オブジェクトを「無効」します。ただし、オブジェクトはまだ関数コンテキストにあるため、GCプロシージャが直接呼び出された場合、オブジェクトはまだクリーニングされません。
コードの3行目はsettimeout()を使用してcollectgarbage関数を呼び出し、時間間隔は '1'に設定されます。これは、writexls()関数が実行された後にのみGCプロセスを実現させます。このようにして、Excelオブジェクトは「GCによってクリーンアップできる」という2つの条件を満たしています。参照なしでコンテキストを離れることです。
GC手順の使用は、ActiveXオブジェクトを使用したJS環境で非常に効果的です。潜在的なActiveXオブジェクトには、XML、VML、OWC(Office Web Componet)、Flash、さらにはJSのVbarrayが含まれます。
この観点から、AjaxアーキテクチャはXmlhttpを採用しており、「ページの切り替えなし」機能を満たす必要があるため、適切な時期にGCプロセスを積極的に呼び出すと、UIを使用した効率エクスペリエンスが向上します。
実際、GCプロセスがあっても、前述のExcel問題は完全には解決されません。 IEは許可資格情報もキャッシュするからです。ページの許可資格情報を更新する唯一の方法は、「新しいページに切り替える」ことです。実際、前述のSPSプロジェクトでは、使用した方法はGCではなく、次のコードでした。
Copy the code as follows: //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// ActiveXオブジェクトを処理するときに使用されるページの切り替えコード
// --------------------------------------------------------------------
関数writexls(){
//(わずかに...)
excel.quit();
Excel = null;
//次のコードは、IEコールExcelのバグを解くために使用されます。これは、MSDNで提供される方法です。
// setimeout(collectgarbage、1);
//信頼されたWebページをクリアできない(または同期)するため、SaveAS()および他の方法は
//次回電話するときに無効です。
location.reload();
}
最後に、GCに関する補足的なメモ:IEフォームが最小化されると、IEは積極的に1回呼び出します。
collectgarbage()関数。これにより、IEウィンドウが最小化された後、メモリ使用量が大幅に改善されます。
この記事の説明が、JavaScriptに基づいたすべての人のWebプログラミングに役立つことを願っています。