哈哈,今天踢球进了两个,加上上次的一个,一共三个了.
接着说导出,先说页面上的东西,主要是javascript,而其中有部分重编码的功能是用VB来写的,
1 首先,是如何将页面上的数据写到EXCEL中,前提当然是要使用IE了.相当简单:
var ExcelApp = new ActiveXObject("Excel.Application");
var ExcelWB = ExcelApp.Workbooks.add();
var ExcelSheet = ExcelWB.ActiveSheet; //这样就得到了一个Excel的Sheet的对象
//然后就可以用两个FOR循环向这个sheet 中写数据了,用下面的语句,依次i行j列
ExcelSheet.Cells(i,j).value = data[i][j]; //data是什么就不用我说了吧,你要写入什么,就自己去处理.
还可以用另一种方法写入,那就是COPY.直接把页面中某<table>中的行列COPY到EXCEL中.这有个好处是保持页面表格的原貌,包括背景色,合并格等,但它只能COPY页面中的表格.
var sel = document.body.createTextRange();
sel.moveToElementText(tablename); //tablename就是要COPY的表格的ID
sel.select();
sel.execCommand("copy");
ExcelSheet.paste();
由于我是要将返回的流写入Excel,那就要用第一种.
2 下面是如何使用xmlhttp发出请求并接收响应
var http_request = false;
function send_request(url){//初始化,指定处理函数,发送请求的函数
http_request = false;
//开始初始化XMLHttpRequest对象,本来此例中不考虑其他浏览器,但还是把应该的代码写出来
if(window.XMLHttpRequest){//Mozilla浏览器
http_request = new XMLHttpRequest();
if(http_request.overrideMimeType){//设置MiME类别
http_request.overrideMimeType("text/xml");
}
}else if(window.ActiveXObject){//IE
try{
http_request = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){}
}
}
if(!http_reqeust){//异常,创建对象实例失败
window.alert("不能创建XMLHttpRequest对象实例");
return false;
}
http_request.onreadystatechange = processRequest;
//确定发送请求的方式和URL以及是否同步执行下段代码
//如果用GET方式,代码如下
http_request.open("GET",url,false);
http_request.sent(null);
//注意,返回数据中如果有中文,那就要使用response.setHeader("charset","GB2312");来避免乱码.
//如果使用POST方式,代码如下
var para = "name1="+value1+"&name2="+value2;//para是要传过去的参数
http_request.open("POST",url,false);
http_request.setRequestHeader("Content-Type","applicaton/x-www-form-urlencoded");
http_request.send(para);
}
//处理返回信息的函数
function processRequest(){
if(http_request.readyState==4){//判断对象状态
if(http_request.status == 200){//信息已经成功返回,开始处理
//在这里用http_request.responseText取得返回的数据,然后写入到EXCEL中.实际上我用的是responseBody,以解决编码问题,后面再说.
}else{
alert("请求的页面有异常");
}
}
}
3 有了上面两步,就可以完成向服务器发出请求,并将返回数据写入EXCEL的功能了,只是返回数据中有中文,而xmlhttp返回值都是用UTF-8编码的.所以还需要做一步解码
重解码代码如下:
//确认需要的VBScript函数是否存在,不存在就写一个
try{
if(typeof(rsB)=="undefined"){initVBS();};
}catch(e){initVBS();}
//**全局变量**
//glbEncode储存ascii到unicode字符的转换,这样做的好处是可以提高重复解码时的解码效率
glbEncode=new Array();
//**初始化函数**
function initVBS(){
//初始化VBscript的两个funtion:rsB 和 vbChar
strVBS="<script language=vbscript>/r/n";
strVBS+="Function rsB(vIn)/r/nrsB=MidB(vIn,1)/r/nEnd Function/r/n";
strVBS+="Function vbChar(ss)/r/nvbChar = Chr(ss)/r/nEnd Function/r/n";
strVBS+="<//script>";
document.write(strVBS);
}
//重编码
function reCode(b){
var s=rsB(b);
s=escape(s).replace(/%u/gi,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/%([A-Z].)%(.{2})/ig,"%@$1$2");
var uniS=s.match(//%@(.{4})/g);
s=s.replace(/@/g,"");
if(uniS){
var k;
for(var i=0;i<uniS.length;i++){
k=uniS[i].substring(2,6);
if(!glbEncode[k]){
glbEncode[k]=escape(vbChar(eval("0x"+k))).substring(1,6);
}
}
tempA=s.split("%");
for(var i=0;i<tempA.length;i++){
if(tempA[i].length!=2){
tempA[i]=glbEncode[tempA[i]];
}
}
s=tempA.join("%");
}
return unescape(s);
}
只要将调用reCode重编码返回值就可以得到正常的中文
var result = reCode(http_request.responseBody);
请注意,在服务器端写数据时还需要做一件事
String result = new String(result.getByte("GB2312"));
好了,页面的事情就没有了,剩下的事就是服务器怎么取数据了.