```javascript

$.fn.jqgridToExcel = function(fileName, fdate) {

var jqgrid = this;

var title = jqgrid.getGridParam('colNames');

var param = jqgrid.getGridParam('postData');

var excel = new ActiveXObject("Excel.Application");

//控制execl是否打开 true 打开,false 不打开

excel.Visible = false;

var workBook = excel.Workbooks.Add();

// workBook.ActiveSheet 等同 workBook.Worksheets(1)

var sheet = workBook.Worksheets(1);

sheet.name = "第【" + (1 + jqgridExcelListPublic(workBook, jqgrid, fileName, fdate, sheet, param)) + "】层";

//调用公共方法

var rowNum = 0;

jqgridExcelListPublic(workBook, jqgrid, fileName, fdate, sheet, param, rowNum);

/*内容设置结束*/

excel.UserControl = true;

fileName = excel.Application.GetSaveAsFilename(fileName + ".xls", "Excel Spreadshsheets (*.xls),*.xls,(*.xlsx),*.xlsx");

if (fileName !== false) sheet.SaveAs(fileName);

excel.Quit();

return jqgrid;

};

```

以下是重构后的代码:

```javascript

// 根据提供的文件名、日期、url数组、显示类型数组和查询参数数组,将jqGrid导出为Excel文件

// @author wxy

function jqgridToExcelList(fileName, fdate, urlArr, showTypeArr, paramArr) {

var idTmr = null;

$.fn.jqgridToExcelList = function (fileName, fdate, urlArr, showTypeArr, paramArr) {

// 获取jqGrid的参数

var jqgrid = this;

var param = jqgrid.getGridParam('postData');

// 创建一个新的Excel工作簿

var excel = new ActiveXObject("Excel.Application");

excel.Visible = false;

var workBook = excel.Workbooks.Add();

var sheet = null;

var sheetNames = ["sheet4", "sheet1", "sheet2", "sheet3"]; // 需要生成的sheet顺序

for (var i = 0; i < sheetNames.length; i++) {

if (showTypeArr[i] === "新建表格") {

sheet = workBook.CreateSheet(sheetNames[i]); // 创建新的sheet

} else if (showTypeArr[i] === "追加数据") {

sheet = workBook.Worksheets(sheetNames[i]); // 追加数据的sheet

} else {

sheet = workBook.Worksheets(sheetNames[i]); // 不作任何处理,直接跳过

}

}

// 填充数据到相应的sheet中(此处省略具体实现)

// ...

// 保存Excel文件并关闭

workBook.SaveAs(fileName + "_" + fdate + ".xls");

workBook.Close();

excel.Quit();

}

}

```

以下是重构后的代码:

```javascript

var rowNum = 0; // 数据显示行

var count = 0; // 当前sheet显示第几次url返回的数据,用于计算当前是第几个sheet在生成数据

// 获取到当前new出excel的sheet数量,经测试win7默认3个sheet,xp默认1个sheet

var len = workBook.Sheets.count;

// 计算生成当前导出excel所需的sheet,如果当前new的excel中sheet不够用就需要生成

for (var j = 0; j < urlArr.length; j++) {

if (j >= len && showTypeArr[j]) {

workBook.Sheets.add();

}

}

// 给excel绑定数据

for (var i = 0; i < urlArr.length; i++) {

var sheetNum = i + 1;

if (i != 0) {

param = paramArr[i];

}

// showTypeArr值为true:表示新的sheet,false表示使用上一个sheet并且要记录count

if (showTypeArr[i]) {

sheetNum = sheetNum - count;

sheet = workBook.Worksheets(sheetNum);

sheet.name = "第【" + sheetNum + "】层";

rowNum = 0;

} else {

count++;

}

jqgrid = urlArr[i];

rowNum = jqgridExcelListPublic(workBook, jqgrid, fileName, fdate, sheet, param, rowNum);

}

```

/*内容设置结束*/

excel.UserControl = true;

fileName = excel.Application.GetSaveAsFilename(fileName + '.xls');

if (fileName !== false) {

sheet.SaveAs(fileName);

}

excel.Quit();

workBook = null;

excel = null;

activeSheet = null;

idTmr = window.setInterval('Cleanup()', 1);

return jqgrid;




}





function Cleanup() {

window.clearInterval(idTmr);

CollectGarbage();

}






/**

* @desc 一个sheet中显示多个列表的公共方法

*/

var jqgridExcelListPublic = function(workBook, jqgrid, fileName, fdate, sheet, param, rowNum) {


var rowNums = 0;

var url = jqgrid.getGridParam('url');

param.page = 1;

param.rows = 1000000000; //设置所有数据一次返回

$.ajax({

type: "POST",

url: url,

data: param,

async: false,

success: function (back) {

// ...处理返回的数据并将其添加到表格中...

}

});

}

```javascriptvar data = back;

if (typeof back == "string") {

data = $.parseJSON(back);

}

var re = / /g; // 正则表达式,匹配所有空格

var viewValue = null;

try {

var colModel = jqgrid.getGridParam('colModel');

var title = jqgrid.getGridParam('colNames');

/*列头设置开始*/

var start = 3;

if (rowNum !== 0) {

start = rowNum + 3;

}

var col = 1;

var tiCon = title.length;

for (var i = 0; i < tiCon; i++) {

//列出不隐藏的列头项

if (title[i].length !== 0 && title[i].indexOf("

var cell = sheet.getCell(start, col);

var alignment = Xlsx.Styles.Alignment["center"]; //居中显示

var fontBold = Xlsx.Styles.Font['bold']; //设置粗体

var bordersLineStyle = Xlsx.Styles.Border['thin']; //边框样式

var borderColorIndex = Xlsx.Styles.Color['gray25']; //单元格边框颜色

Xlsx.utils.aoa_to_sheet([title[i]], sheet, start, col); //写入标题到Excel表格中

cell.HorizontalAlignment = alignment;

cell.Font.Bold = fontBold;

cell.Borders.LineStyle = bordersLineStyle;

cell.Borders.ColorIndex = borderColorIndex;

} else {

col++; //跳过隐藏的列头项

}

}

} catch (error) {} finally {}

```

以下是重构后的代码:

```csharp

sheet.Cells(start, col).Interior.ColorIndex = 2; //单元格底色

col++;

}

}

/*列头设置结束*/


if (rowNum == 0) {

/*标题开始*/

sheet.Range("A1", sheet.Cells(1, col - 1)).MergeCells = true; //合并标题单元格

sheet.Cells(1, 1).HorizontalAlignment = 3; //居中显示

sheet.Cells(1, 1).Font.Bold = true; //设置粗体

sheet.Cells(1, 1).Font.Size = 15; //字体大小

sheet.Cells(1, 1).Font.ColorIndex = 10; //字体颜色

sheet.Cells(1, 1).Value = fileName; //设置标题内容

/*标题结束*/


sheet.Range("A2", sheet.Cells(2, col - 1)).MergeCells = true; //合并时间单元格

sheet.Cells(2, 1).HorizontalAlignment = 2; //居左显示

sheet.Cells(2, 1).Value = fdate; //设置时间内容

}


/*内容设置开始*/

var row = data.rows;

var count = row.length;

rowNums = start + count;

var colModellen = colModel.length;

for (var i = 0; i < count; i++) {

var cocl = 1; //定义变量cocl,但未在后续代码中使用,可以删除或注释掉此行。

```

```javascriptfor (var j = 0; j < colModel.length; j++) {

// 列出每列内容

if (!colModel[j].hidden && colModel[j].index !== undefined) {

sheet.Cells(start + 1 + i, cocl).HorizontalAlignment = 3; // 居中显示

sheet.Cells(start + 1 + i, cocl).Borders.LineStyle = 1; // 边框样式

sheet.Cells(start + 1 + i, cocl).Borders.ColorIndex = 10; // 单元格边框颜色

sheet.Cells(start + 1 + i, cocl).NumberFormat = "@"; // 将单元置为文本,避免非数字列被自动变成科学计数法和丢失前缀的0

viewValue = $(row[i]).attr(colModel[j].name);

// 如果定义了格式化方法

if (colModel[j].formatter !== undefined) {

// 有格式化,则需要格式化后显示

viewValue = colModel[j].formatter(viewValue);

// 控制有连接的列

if (viewValue.indexOf("href", 1) !== -1) {

var s = viewValue.indexOf(">", 1);

var e = viewValue.indexOf("<", 2);

var strValue = viewValue.substring(s + 1, e);

viewValue = strValue;

}

}

}

}

```

这段代码的功能是将数据填充到Excel表格中。首先判断viewValue是否为空,如果不为空,则替换掉其中的特定字符。接着判断viewValue是否为undefined,如果是,则将其赋值为空字符串。然后将处理后的viewValue前面加上空格,以便处理日期格式的数据。最后将处理后的viewValue写入到对应的单元格中,并更新列数。

重构后的代码如下:

```javascript

function fillExcelData(viewValue, start, i, cocl) {

try {

if (viewValue != null) {

viewValue = (viewValue.toString()).replace(re, "");

}

if (viewValue === undefined) {

viewValue = "";

}

// 为viewValue添加前导空格以处理日期数据格式

sheet.Cells(start + 1 + i, cocl).value = ` ${viewValue}`;

cocl++;

} catch (e) {}

}

sheet.Columns.AutoFit();

return rowNums;

```