JavaScriptのExcelエクスポート例_JavaScriptスキルを詳しく解説

WBOY
リリース: 2016-05-16 16:30:18
オリジナル
1755 人が閲覧しました

この記事の例では、JavaScript を使用して Excel をエクスポートする方法について説明します。皆さんの参考に共有してください。具体的な実装方法は以下の通りです。

コードをコピー コードは次のとおりです:

<頭>

WEB ページを EXCEL ドキュメントにエクスポートする方法




WEB ページを EXCEL ドキュメントにエクスポートする方法

































<スクリプト言語="javascript">
function 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 の表示属性を設定します
}
function 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 {
var Lenc = curTbl.rows(i).cells.length;
//各行の列数を取得します
for (j = 0; j {
oSheet.Cells(i 1, j 1).value = curTbl.rows(i).cells(j).innerText;
//値を代入
}
}
oXL.Visible = true;
// Excel の表示属性を設定します
}
function getXlsFromTbl(inTblId, inWindow) {
{
を試してください var allStr = "";
var curStr = "";
//alert("getXlsFromTbl");
if (inTblId != null && inTblId != "" && inTblId != "null") {
curStr = getTblData(inTblId, inWindow);
}
if (curStr != null) {
allStr = curStr;
}
他 {
alert("エクスポートしたいテーブルは存在しません!");
戻る;
}
var fileName = getExcelFileName();
doFileExport(fileName, allStr);
}
catch(e) {
alert("エクスポート例外が発生しました:" e.name "->" e.description "!");
}
}
function getTblData(inTbl, inWindow) {
var 行 = 0;
//alert("getTblData は " inWindow);
var tblDocument = ドキュメント;
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 //alert("j は " j);
for (var i = 0; i //alert("i は " 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 outStr = " ";
}
}

if (i == 0) {
if (rows == 0 && curTbl.rows[j].cells[i].rowSpan > 1) {
行 = curTbl.rows[j].cells[i].rowSpan - 1;
}
}
}
outStr = " ";
}
}
他 {
outStr = null;
alert(inTbl "存在しません!");
}
outStr;
を返します }

関数 getExcelFileName() {
var d = 新しい日付();
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(ファイル名);
ファイル名を返します;
}

関数 doFileExport(inName, inStr) {
var xlsWin = null;
if (!!document.all("glbHideFrm")) {
xlsWin = glbHideFrm;
}

else {
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=" 幅 ",height=" 高さ;
xlsWin = window.open("", "_blank", openPara);

}
xlsWin.document.write(inStr);
xlsWin.document.close();
xlsWin.document.execCommand('Saveas', true, inName);
xlsWin.close();
}


次は处理エクセル进程关闭问题です

复制代 代码如下:
// JavaScript 中の解析构问题(ActiveX オブジェクトの例)
//------------------------------------------------ --------
<スクリプト>
var strSaveLocation = 'file:///E:/​​1.xls'
function 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);
  varsheet = wk.Worksheets(1);
  sheet.Cells(1, 1).Value = '测试字符串';
  wk.SaveAs(strSaveLocation);
  wk.Saved = true;

excel.Quit();
}


 
 

この例では、ファイルがローカルに操作されている場合には、特別な問題は発生しません。ただし、strSaveLocation が 1 つのプロセスの URL である場合、その時点では、ファイルの保存制限が保持されます。

は、この Excel ファイルを実行して保存できる唯一の (手順の) 例です。その後、反転ポイントが「上書き」されると、問題が発生します。

- これは、SPS で共有ファイルを操作するときの例示的なコードであることに注意してください。

この問題を解決する方法は非常に複雑です。

① 本地凭证的释放
② ActiveX オブジェクトの例の释放

以下では、JavaScript 内のオブジェクトの「失効」の問題を最初に開始します。 単純な説明:

① 1 つのオブジェクトがその生存の上位テキスト環境の外にある、つまり失効します。 ② 1 つのフルローカルのオブジェクトが使用(参照)されていない場合、つまり効果が失われます。
例:


复制代码代码如下:
//------------------------------------------ ------------
//JavaScript オブジェクトの有効期限が切れるとき
//------------------------------------------------ ----------
関数 testObject() {
var _obj1 = 新しいオブジェクト();
}

関数 testObject2() {
var _obj2 = 新しいオブジェクト();
_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() で構築されて渡されるため、オブジェクトは「関数外」のコンテキスト (およびライフサイクル) を持ちます。ただし、関数の戻り値は使用されないためです。他の変数は「Hold」なので、_obj2 もすぐに無効になります。
・「例3」では、testObject2()で構築した_obj2を外部変数obj3に保持していますが、このとき「obj3=null」の行が有効になるまでは参照関係がなくなるため_obj2は無効になります。
・ 例3と同様の理由により、「例4」の「arr=[]」以降の_obj2は無効となります。

ただし、オブジェクトの「無効化」は、オブジェクトが「解放」されるまで待機しません。 JavaScript ランタイム環境内では、オブジェクトがいつリリースされるかをユーザーに正確に伝える方法はありません。これは、JavaScript のメモリ リサイクル メカニズムに依存しています。 ——この戦略は、.NET のリサイクル メカニズムに似ています。

上記の Excel 操作サンプルコードでは、オブジェクトの所有者、つまり「EXCEL.EXE」の処理は「ActiveX オブジェクトのインスタンスの解放」後にのみ発生します。ファイル ロックとオペレーティング システムのアクセス許可資格情報はプロセスに関連しています。したがって、オブジェクトが「解放」されずに単に「無効化」された場合、ファイルを処理し、オペレーティング システムの権限資格情報を参照する他のプロセスに問題が発生します。

——これは JavaScript または COM メカニズムのバグであると言う人もいます。実際には、いいえ、これは独立した問題ではなく、OS、IE、JavaScript 間の複雑な関係によって引き起こされます。

Microsoft は、この問題を解決するための戦略を明らかにしました。それは、メモリ リサイクル プロセスを積極的に呼び出すことです。

CollectGarbage() プロセス (通常は GC プロセスと呼ばれます) は、(Microsoft) JScript で提供されており、現在の IE の「無効なオブジェクト例外」をクリーンアップするために使用されます。オブジェクトのデストラクタプロセス。

上記の例で GC プロセスを呼び出すコードは次のとおりです:


コードをコピー コードは次のとおりです:
//------------- ----------------------------------------------------
// ActiveX オブジェクトを扱う場合、GC プロセスの標準呼び出しメソッド
//------------------------------------------------ ----------
関数 writeXLS() {
//(省略…)
Excel.Quit();

Excel = null;
setTimeout(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)、フラッシュ、さらには JS の VBArray などがあります。

この観点から見ると、ajax アーキテクチャは XMLHTTP を採用しており、「ページ切り替えなし」機能を満たす必要があるため、適切なタイミングで GC プロセスを積極的に呼び出すことで、より効率的な UI エクスペリエンスが得られます。

実は、GC処理を利用したとしても、上記のExcelの問題は完全に解決されるわけではありません。 IE はアクセス許可の資格情報もキャッシュするためです。ページの権限資格情報を更新する唯一の方法は「新しいページに切り替える」ことです。そのため、実際に前述の SPS プロジェクトで使用した方法は GC ではなく、次のコードです:


コードをコピー コードは次のとおりです:
//------------------------------------------ ------------
// ActiveX オブジェクトの処理時に使用されるページ切り替えコード
//------------------------------------------------ ----------
関数 writeXLS() {
//(省略…)

Excel.Quit();
Excel = null;

// 次のコードは、MSDN で提供されているメソッドである Excel 呼び出しのバグを解決するために使用されます。 // setTimeout(CollectGarbage, 1);
// Web ページの信頼済みステータスをクリア (または同期) できないため、
では SaveAs() などのメソッドが使用されます。 // 次回呼び出し時は無効となります。
location.reload();
}

最後に、GC についての補足: IE フォームが最小化されると、IE はそれをアクティブに 1 回呼び出します

CollectGarbage() 関数。これにより、IE ウィンドウを最小化した後のメモリ使用量が大幅に改善されます。

この記事が皆さんの JavaScript ベースの Web プログラミングに役立つことを願っています。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
列ヘッダー 1 列ヘッダー 2 列ヘッダー 3 列ヘッダー 4 列ヘッダー 5
ああ bbb ccc ddd ええ
AAA BBB CCC DDD EEE
FFF GGG HHH III JJJ