В этой статье описывается метод экспорта Excel с помощью JavaScript. Поделитесь этим для вашей ссылки. Конкретный метод реализации следующим образом:
Кода -копия выглядит следующим образом: <html xmlns = "http://www.w3.org/1999/xhtml">
<голова>
<meta http-equiv = "content-type" content = "text/html; charset = utf-8"/>
<Title> Как экспортировать веб -страницы как документы Excel </title>
</head>
<тело>
<таблица id = "talectexcel" 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>
</table>
<input type = "button" onclick = "javascript: method1 ('tableexcel');" value = "Первый метод импортируется в Excel">
<input type = "button" onclick = "javascript: method2 ('tableexcel');" value = "Второй метод импортируется в Excel">
<input type = "button" onclick = "javascript: getXlsfromtbl ('tablexcel', null);" value = "Третий метод импортируется в Excel">
<Script language = "javascript">
Метод функции 1 (tableId) {// скопировать всю таблицу, чтобы Excel
var curtbl = document.getElementbyIdx_x_x (tableId);
var oxl = new ActivexObject ("Excel.application");
// Создать объект AX Excel
var owb = oxl.workbooks.add ();
// Получить объект рабочей книги
var oshet = owb.activesheet;
// активировать текущий лист
var sel = document.body.createtextrange ();
sel.movetoelementText (curtbl);
// переместить содержимое в таблице в Textrange
sel.select ();
// Выберите все содержимое в Textrange
sel.execcommand ("copy");
// скопировать контент в Textrange
osheet.paste ();
// вставьте в активный Excel
oxl.visible = true;
// Установите excel Видимый атрибут
}
Метод функции 2 (таблица) // Прочитайте каждую ячейку в таблице в Excel
{
var curtbl = document.getElementbyIdx_x_x (tableId);
var oxl = new ActivexObject ("Excel.application");
// Создать объект AX Excel
var owb = oxl.workbooks.add ();
// Получить объект рабочей книги
var oshet = owb.activesheet;
// активировать текущий лист
var lenr = curtbl.rows.length;
// Получить количество рядов в таблице
для (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 (имя файла, Allstr);
}
поймать (e) {
Alert ("Исключение произошло в экспорте:" + e.name + "->" + e.description + "!");
}
}
Функция getTblData (intbl, inwindow) {
var Rows = 0;
// alert ("getTbldata is" + inwindow);
var tbldocument = документ;
if (!! Inwindow && Inwindow! = "") {
if (! document.all (inwindow)) {
вернуть ноль;
}
еще {
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 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 (row == 0 && curtbl.rows [j] .cells [i] .rowspan> 1) {
rows = curtbl.rows [j] .cells [i] .rowspan - 1;
}
}
}
outstr += "";
}
}
еще {
outstr = null;
предупреждение (intbl + "не существует!");
}
вернуть OUTSTR;
}
function 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";
// предупреждение (имя файла);
вернуть имя файла;
}
Функция 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 - ширина / 2)
+ ", top =" + (window.screen.height / 2 - высота / 2)
+ ", scrollbars = no, width =" + width + ", height =" + height;
xlswin = window.open ("", "_blank", openpara);
}
xlswin.document.write (instry);
xlswin.document.close ();
xlswin.document.execcommand ('saveas', true, inname);
xlswin.close ();
}
</Script>
</body>
</html>
Ниже приведена проблема с закрытием процесса Excel
Скопируйте код следующим образом: // Проблемы разрушения в 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);
var sheet = wk.worksheets (1);
sheet.cells (1, 1) .value = 'test String';
Wk.saveas (Strsavelocation);
wk.saved = true;
Excel.quit ();
}
</script>
<тело>
<button onclick = "createxls ()"> create </button>
<button onclick = "writexls ()"> переписать </button>
</body>
В этом примере при эксплуатации локального файла никакого исключения не происходит. -В большинстве случаев есть только немного мусора для памяти. Однако, если Strsavelocation является удаленным URL, будет сохранен учетные данные о доступе к файлу, и можно использовать только один (удаленный) экземпляр для включения документа Excel и его хранения. Поэтому, если вы нажимаете кнопку «Переписать» неоднократно, появится исключение.
- Обратите внимание, что это упрощенный код для экземпляра общего файла при работе в SPS. Следовательно, это не «академическая» скучная дискуссия, и это практическая проблема в инженерии.
Решение этой проблемы сложно. Это включает в себя две проблемы:
① Выпуск местных ваучеров
② Выпуск экземпляра объекта ActiveX
Давайте начнем с проблемы «неудачи» объектов в JavaScript. Проще говоря:
① Объект будет недействительным вне контекста, в котором он живет.
② Глобальный объект будет недействительным, если он не будет выполнен (ссылка).
Например:
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» конструирует _obj1 в функции TestObject (), но когда функция выходит, она оставила контекст функции, поэтому _Obj1 является недействительным;
- В «Примере 2» объект _OBJ2 также построен в TestObject2 () и передается, поэтому объект имеет контекстную среду (и время жизни) «вне функции», но поскольку возвратное значение функции не «удерживается» другими переменными, _OBJ22 сразу же недопустимо;
- В «Примере 3» _OBJ2, построенный с помощью TestObject2 (), удерживается внешней переменной oBJ3. В настоящее время, пока строка кода «obj3 = null» вступит в силу, _obj2 не будет недействительной, поскольку эталонные отношения исчезают.
- По той же причине, что и в примере 3, _OBJ2 в «Примере 4» не будет недействительным после строки кода «arr = []».
Тем не менее, «сбой» объекта не ждет, чтобы его выпустили ». Внутри времени выполнения JavaScript невозможно сказать пользователю точно «когда будет выпущен объект». Это зависит от механизма восстановления памяти JavaScript. «Эта стратегия похожа на механизм переработки в .NET.
В предыдущем примере примера операции Excel владелец объекта, то есть «Excel.exe», будет происходить только после «выпуска экземпляра объекта ActiveX». Файл блокирует и учетные данные операционной системы связаны с процессом. Таким образом, если объект находится только «неудачным», а не «выпуск», то другие процессы будут иметь проблемы при обработке файлов и ссылке на учетные данные разрешения операционной системы.
- Некоторые люди говорят, что это ошибка в JavaScript или COM механизм. На самом деле, это не так. Это вызвано сложной отношением между ОС, IE и JavaScript, а не независимой проблемой.
Microsoft выявила стратегию для решения этой проблемы: активно вызовать процесс утилизации памяти.
Процесс Collegarbage () (обычно называемый процессом GC) представлен в (Microsoft) JScript. Процесс GC используется для очистки «неудачного смещения объекта» в текущем т.е.
В приведенном выше примере код, который вызывает процедуру GC:
Copy the code as follows: //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Стандартный метод вызова процедур GC при обработке объекта ActiveX
// ---------------------------------------------------------
функция writexls () {
//(немного...)
Excel.quit ();
Excel = null;
SetTimeout (Collegarbage, 1);
}
Первая строка кода вызывает метод Excel.quit (), чтобы процесс Excel прервался и выходил. В настоящее время, поскольку среда JavaScript имеет экземпляр объекта Excel, процесс Excel фактически не прерывает.
Вторая строка кода делает Excel Null для очистки ссылок на объект, таким образом, «недействительным» объекта. Однако, поскольку объект все еще находится в контексте функции, если процедура GC называется непосредственно, объект все равно не будет очищен.
Третья строка кода использует settimeout () для вызова функции Collegarbage, а интервал времени устанавливается на «1», что делает процесс GC только после выполнения функции writexls (). Таким образом, объект Excel соответствует двум условиям «может быть очищена GC»: нет ссылки и оставить контекст.
Использование процедур GC очень эффективно в средах JS с использованием объекта ActiveX. Некоторые потенциальные объекты ActiveX включают XML, VML, OWC (Office Web Componet), Flash и даже Vbarray в JS.
С этой точки зрения, поскольку архитектура AJAX принимает XMLHTTP, а также необходимо выполнить функцию «без переключения страниц», активно вызывая процесс GC в подходящее время, даст вам лучший опыт эффективности с использованием пользовательского интерфейса.
Фактически, даже с процессом GC, вышеупомянутая проблема Excel не будет полностью решена. Потому что т.е. также кэширует разрешения. Единственный способ обновить учетные данные о разрешении страницы - это «переключиться на новую страницу», поэтому на самом деле, в проекте SPS, упомянутом ранее, метод, который я использовал, был не GC, а следующим кодом:
Copy the code as follows: //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// код переключения страниц, используемый при обработке объекта ActiveX
// ---------------------------------------------------------
функция writexls () {
//(немного...)
Excel.quit ();
Excel = null;
// Следующий код используется для решения ошибки в IE CALL Excel, метод, предоставленный в MSDN:
// setTimeout (colleggarbage, 1);
// Поскольку доверенное состояние веб -страницы не может быть очищено (или синхронизировано) привести к тому, что Saveas () и другие методы будут
// недействителен в следующий раз, когда вы это позвоните.
location.reload ();
}
Наконец, дополнительная примечание о GC: когда форма IE будет сведена к минимуму, т.е. активно назовет ее один раз.
Функция CollegAgrabress (). Это делает использование памяти значительно улучшить после того, как окно IE сведет к минимуму.
Я надеюсь, что описание в этой статье будет полезно для каждого веб -программирования на основе JavaScript.