이 기사는 JavaScript별로 Excel을 내보내는 방법에 대해 설명합니다. 참조를 위해 공유하십시오. 특정 구현 방법은 다음과 같습니다.
코드 사본은 다음과 같습니다. <html xmlns = "http://www.w3.org/1999/xhtml">
<헤드>
<meta http-equiv = "content-type"content = "text/html; charset = utf-8"/>
<title> 웹 페이지를 Excel 문서로 내보내는 방법 </title>
</head>
<body>
<table id = "TableExcel"CellPacing = "0"CellPadding = "0">
<tr>
<td colspan = "5"align = "center"> 웹 페이지를 Excel 문서로 내보내는 방법 </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>
</테이블>
<input type = "button"onclick = "javaScript : method1 ( 'tableExcel');" value = "첫 번째 방법은 Excel로 가져옵니다">
<input type = "button"onclick = "javaScript : method2 ( 'tableExcel');" value = "두 번째 방법은 Excel로 가져옵니다">
<input type = "button"onclick = "javaScript : getxlsfromtbl ( 'tableExcel', null);" value = "세 번째 방법은 Excel로 가져옵니다">
<script language = "javaScript">
function method1 (tableID) {// 전체 테이블을 Excel로 복사합니다
var curtbl = document.getElementByIdx_x_x (tableID);
var oxl = new ActiveXobject ( "Excel.application");
// 도끼 객체를 만듭니다
var owb = oxl.workbooks.add ();
// 통합 문서 개체를 가져옵니다
var osheet = owb.activesheet;
// 현재 시트를 활성화합니다
var sel = document.body.creatextrange ();
sel.MovetoElementText (CURTBL);
// 테이블의 내용을 TexTrange로 이동합니다
sel.select ();
// TexTrange에서 모든 내용을 선택합니다
sel.execcommand ( "copy");
// TexTrange에서 내용을 복사합니다
OSHEET.PASTE ();
// 활성 엑셀에 붙여 넣습니다
oxl.visible = true;
// Excel 표시 속성을 설정합니다
}
Function Method2 (TableID) // 테이블의 각 셀을 Excel로 읽으십시오.
{
var curtbl = document.getElementByIdx_x_x (tableID);
var oxl = new ActiveXobject ( "Excel.application");
// 도끼 객체를 만듭니다
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;
}
또 다른 {
ALERT ( "내보낼 테이블은 존재하지 않습니다!");
반품;
}
var filename = getexcelfilename ();
DofileExport (filename, allstr);
}
캐치 (e) {
ALERT ( "수출에서 예외 :" + e.name + "->" + e.description + "!");
}
}
함수 gettbldata (intbl, inwindow) {
var 줄 = 0;
// ALERT ( "getTblData는" + inwindow);
var tbldocument = 문서;
if (!! inwindow && inwindow! = "") {
if (! document.all (inwindow)) {
널 리턴;
}
또 다른 {
tbldocument = eval_r (Inwindow). 문서;
}
}
var curtbl = tbldocument.getElementByIdx_x_x (intbl);
var outstr = "";
if (curtbl! = null) {
for (var j = 0; j <curtbl.rows.length; j ++) {
// alert ( "j는" + j);
for (var i = 0; i <curtbl.rows [j] .cells.length; i ++) {
// Alert ( "i is" + 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) {
행 = curtbl.rows [j] .Cells [i] .rowspan -1;
}
}
}
outstr += "";
}
}
또 다른 {
outstr = null;
경고 (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) {
커데이트 = "0" + 커다;
}
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);
리턴 파일 이름;
}
함수 dofileExport (Inname, Instr) {
var xlswin = null;
if (!! document.all ( "glbhidefrm")) {
xlswin = glbhidefrm;
}
또 다른 {
var 너비 = 6;
var 높이 = 4;
var OpenPara = "left =" + (Window.Screen.width / 2- 너비 / 2)
+ ", top =" + (Window.screen.height / 2- 높이 / 2)
+ ", scrollbars = no, 너비 =" + 너비 + ", 높이 =" + 높이;
xlswin = window.open ( "", "_blank", OpenPara);
}
xlswin.document.write (Instr);
xlswin.document.close ();
xlswin.document.execcommand ( 'Saveas', True, Inname);
xlswin.close ();
}
</스크립트>
</body>
</html>
다음은 Excel 프로세스 폐쇄를 다루는 문제입니다.
다음과 같이 코드를 복사하십시오.
// ------------------------------------------------------------------------
<cript>
var strsavelocation = '파일 : // 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 ();
}
</스크립트>
<body>
<버튼 onclick = "createxls ()"> create </button>
<버튼 onclick = "writexls ()"> rewrite </button>
</body>
이 예에서는 로컬 파일을 작동 할 때 예외가 발생하지 않습니다. -대부분의 경우 메모리 쓰레기가 있습니다. 그러나 Strsavelocation이 원격 URL 인 경우 로컬 파일 액세스 자격 증명이 저장되고 Excel 문서를 활성화하고 저장하는 데 하나만 사용될 수 있습니다. 따라서 "다시 작성"버튼을 반복적으로 클릭하면 예외가 나타납니다.
- SPS에서 작동 할 때 공유 파일 인스턴스에 대한 단순화 된 코드입니다. 따라서 "학문적"지루한 토론이 아니며 엔지니어링에서 실질적인 문제입니다.
이 문제에 대한 해결책은 복잡합니다. 두 가지 문제가 포함됩니다.
local 로컬 바우처 릴리스
ActiveX 객체 인스턴스 릴리스
JavaScript의 객체의 "실패"문제로 시작하겠습니다. 간단히 말하면 :
weep 객체는 사는 상황 밖에서 유효하지 않을 것입니다.
world 글로벌 객체는 실행되지 않으면 유효하지 않습니다 (참조).
예를 들어:
Copy the code as follows: //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// JavaScript 객체가 언제 실패합니까?
// ------------------------------------------------------------------------
함수 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 = [];
이 네 가지 예에서 :
- "예제 1"은 함수 testObject ()에서 _OBJ1을 구성하지만 함수가 종료되면 함수의 컨텍스트를 남기므로 _OBJ1은 유효하지 않습니다.
- "예제 2"에서 객체 _obj2는 testObject2 ()에도 구성되어 전달되므로 객체에는 컨텍스트 환경 (및 수명)이 "함수 외부"가 있지만 함수의 리턴 값은 다른 변수에 의해 "유지"되지 않기 때문에 즉시 무적입니다.
- "예 3"에서, testobject2 ()에 의해 구성된 _obj2는 외부 변수 OBJ3에 의해 유지됩니다. 현재 코드 "OBJ3 = NULL"라인이 발효 될 때까지 _OBJ2는 참조 관계가 사라지기 때문에 유효하지 않습니다.
- 예 3에서와 같은 이유로, "example 4"의 _obj2는 코드 "arr = []"라는 행에 유효하지 않습니다.
그러나 객체의 "실패"는 "릴리스"를 기다리지 않습니다. JavaScript 런타임 내부에는 사용자에게 "객체가 언제 출시 될 것인지"를 정확하게 알리는 방법이 없습니다. 이것은 JavaScript의 메모리 복구 메커니즘에 따라 다릅니다. -이 전략은 .NET의 재활용 메커니즘과 유사합니다.
이전 Excel 작동 예제 코드에서 객체의 소유자, 즉 "Excel.exe"는 "ActiveX Object Instance 릴리스"후에 만 발생합니다. 파일 잠금 및 운영 체제의 권한 자격 증명은 프로세스와 관련이 있습니다. 따라서 객체가 "릴리스"가 아닌 "실패"인 경우 파일을 처리하고 운영 체제의 권한 자격 증명을 참조 할 때 다른 프로세스가 문제가됩니다.
- 어떤 사람들은 이것이 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;
settimeout (CollectGarbage, 1);
}
첫 번째 코드 줄은 Excel.quit () 메소드를 호출하여 Excel 프로세스가 중단되고 종료되도록합니다. 현재 JavaScript 환경에는 Excel 객체 인스턴스가 있기 때문에 Excel 프로세스는 실제로 중단되지 않습니다.
두 번째 코드 줄은 Excel이 객체 참조를 지우기 위해 NULL을 만들어 객체를 "무효화"합니다. 그러나 객체가 여전히 함수 컨텍스트에 있으므로 GC 프로 시저가 직접 호출되면 객체는 여전히 정리되지 않습니다.
코드의 세 번째 줄은 settimeout ()을 사용하여 CollectGarbage 함수를 호출하고 시간 간격이 '1'으로 설정되어 writexls () 함수가 실행 된 후에 만 GC 프로세스 만 발생합니다. 이런 식으로 Excel 물체는 "GC에 의해 정리 될 수 있습니다"의 두 가지 조건을 충족합니다. 참조가없고 컨텍스트를 떠나십시오.
GC 절차의 사용은 ActiveX 객체를 사용하는 JS 환경에서 매우 효과적입니다. 일부 잠재적 인 ActiveX 객체에는 XML, VML, OWC (Office Web Componet), Flash 및 vbarray의 vbarray가 포함됩니다.
이 관점에서 Ajax 아키텍처는 XMLHTTP를 채택하고 "No Page Switching"기능을 충족해야하므로 적절한 시간에 GC 프로세스를 적극적으로 호출하면 UI를 사용하여 더 나은 효율성 경험을 제공합니다.
실제로, GC 프로세스에도 불구하고, 위에서 언급 한 Excel 문제는 완전히 해결되지 않습니다. 즉, 권한 자격 증명을 캐시하기 때문입니다. 페이지의 권한 자격 증명을 업데이트하는 유일한 방법은 "새 페이지로 전환"하는 것입니다. 실제로 앞에서 언급 한 SPS 프로젝트에서 내가 사용한 방법은 GC가 아니라 다음 코드였습니다.
Copy the code as follows: //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Page Switching Code는 ActiveX 객체를 처리 할 때 사용됩니다
// ------------------------------------------------------------------------
함수 writexls () {
//(약간...)
Excel.quit ();
Excel = null;
// 다음 코드는 MSDN에 제공된 메소드 인 IE Call Excel의 버그를 해결하는 데 사용됩니다.
// settimeout (CollectGarbage, 1);
// 웹 페이지의 신뢰할 수있는 상태를 지울 수 없거나 동기화 할 수 없으므로 Saveas () 및 기타 메소드가
// 다음에 전화 할 때 유효하지 않습니다.
location.reload ();
}
마지막으로, GC에 대한 보충 메모 : IE 양식이 최소화되면 IE는 적극적으로 한 번 호출합니다.
Collect Garbage () 함수. 이렇게하면 IE 창이 최소화 된 후 메모리 사용이 크게 향상됩니다.
이 기사의 설명이 JavaScript를 기반으로 한 모든 사람의 웹 프로그래밍에 도움이되기를 바랍니다.