技术交流

JS导出Excel

JS导出Excel有如下方法:
方法一:
function method1(tableid) {//整个表格拷贝到EXCEL中
var curTbl = document.getElementById(tableid);
var oXL = new ActiveXObject("Excel.Application");
//创建AX对象excel
var oWB = oXL.Workbooks.Add();
//获取workbook对象
var oSheet = oWB.ActiveSheet;
//激活当前sheet
var sel = document.body.createTextRange();
sel.moveToElementText(curTbl);
//把表格中的内容移到TextRange中
sel.select();
//全选TextRange中内容
sel.execCommand("Copy");
//复制TextRange中内容
oSheet.Paste();
//粘贴到活动的EXCEL中
oXL.Visible = true;
//设置excel可见属性
}
方法一,在IE6,7,8中都可以用,前提是得安装上excel。因为用到了Excel.Application 控件,还得将电脑IE的安全级别设置降低。
方法二:
function 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=" + width + ",height=" + height;
xlsWin = window.open("", "_blank", openPara);
}
xlsWin.document.write(inStr);
xlsWin.document.close();
xlsWin.document.execCommand('Saveas', true, inName);
xlsWin.close();
}

方法二是通过将网上也Table的内容组装成然后通过弹出窗口供用户选择路径保存。在IE6中完全可以。但是在IE7,IE8中不行,IE8自带了脚本调试,调试都通过,但是 
这条语句xlsWin.document.execCommand('Saveas', true, inName); 对于IE8来说没有作用,是不是IE7,IE8将document.execCommand()此方法禁用掉了,在我一同事的机子(IE8)上可以,他打了很多补丁,但是其他电脑都不行,我一直试了很长时间,不知需要打哪个补丁,IE8的兼容视图补丁已经打上,但是还是没有作用.

这好像是微软为了安全性考虑,不能用execcommand函数导出除了txt,htm,html,以外的格式,如果你在上面把xls改成txt,就可以了,导出以后再在系统中改文件后缀名。对了,你上面的代码也有点小问题,实际上你的文件还没导出,就弹了提示成功的对话框,有点问题,呵呵!建议改成:   
function outExcel(atblData){
var w = window.open("about:blank","Excel", "widht=0,height=0");
w.document.write(atblData.outerHTML);
if(w.document.execCommand('Saveas',true, 'D:\\会员信息.txt))
alert("导出成功");
else
alert("导出失败!");
window.close();
}



Jquery让IE6支持PNG透明背景图片插件

Jquery让IE6支持PNG透明背景图片插件用法超简单:
1、引入Jquery核心库js文件
2、引入支持PNG透明背景图片插件js文件
以上两个步骤就可以了

» 阅读全文

jquery操作input值

获取选中的值
获取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();

 

获取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();

 

select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;

 

radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;

 

获取值:
文本框,文本区域:
$("#txt").attr("value");

$("#txt").val();

 

多选框checkbox:
$("#checkbox_id").attr("value");

 

单选组radio:
$("input[@type=radio][@checked]").val();

 

下拉框select:
$('#sel').val();

 

控制表单元素:
文本框,文本区域:
$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');//填充内容

 

多选框checkbox:
$("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾

 

单选组radio:
$("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项

 

下拉框select:
$("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<optionvalue='1'>1111</option><optionvalue='2'>2222</option>").appendTo("#sel")//添加下拉框的option
$("#sel").empty();//清空下拉框

 

=====================

在Jquery中,用$("#id")来获得页面的input元素,其相当于document.getElementById("element")但是,该获取的是一个Jquery对象,而不是一个dom element对象.value是dom element对象的属性.所以,使用$("#id").value不能取到值取值的方法如下:

取值:

val = $("#id")[0].value;

$("#id")[0].value = "new value";

 

赋值:

$("#id")[0].value = "new value";
或者$("#id").val("new value");

val = $("#id").attr("value");

 

jquery input text radio check select 操作

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<mce:script src="jquery-starterkit/lib/jquery-1.3.2.min.js" mce_src="jquery-starterkit/lib/jquery-1.3.2.min.js" type="text/javascript"></mce:script>
</head>
<body>
<input type="text" id="dd" name="dd" value="dds"/>dd
<input name="rr" id="rr" type="radio" value="34" />ff
<input name="rr" id="rr2" type="radio" value="4" />55
<input name="ff" type="checkbox" value="aa" />jgdg
<input name="ff" type="checkbox" value="gd" />jgdg
<select name="ss" id="ss" size="1">
<option value=""></option>
<option value="8">d</option>
<option value="2">g</option>
</select>
<br/>
<input type="button" id="button" value="按钮一" />
<input type="button" id="jj" value="按钮二" />
<br/>
<div id="ssd">fgfooHello</div>
</body>
<mce:script language="javascript" type="text/javascript"><!--
$(function(){
$("#button").click(function(){


//获取值
//alert( $('#dd').val());//type=text
// alert($('input[name=rr][checked]').val());//type=radio
// alert($('input[name=ff][checked]').val());//type=checkbox
// alert($("select[name=ss] option[selected]").val());//select 相等于alert($("#ss option[selected]").val());

//获取文本
//alert($("select[name=ss] option[selected]").text());//select

//控制
/*// Disable #dd 禁用
$("#dd").attr("disabled","disabled");
// Enable #dd 解禁
$("#jj").removeAttr("disabled");*/

// $('input[name=rr]').get(0).checked = true;//第一个radio被选中
//alert($("input[type=radio][value=34]").attr("checked",'checked'));//value=34的radio被选中

//alert($("input[type=checkbox][value=gd]").attr("checked",'checked'));//value=gd的checkbox被选中
//$('input[name=ff]').get(1).checked = true;//第一个check被选中



/*//根据option的text选中option
count=$("#ss").find("option").length;
for(var i=0;i<count;i++)
{
if($("#ss").get(0).options[i].text == 'd')
{
$("#ss").get(0).options[i].selected = true;

break;
}
} */

//$("<option value='1'>1111</option><option value='25'>22s22</option>").appendTo("#ss");//增加option
//$("#ss option[value=8]").remove("");//除去 <option value='8'>d</option>

//$("#ss").attr("value",'2');//选中option
//$('#ss')[0].selectedIndex = 1;//选中option

//$("#ss").empty();//清空全部option

/*//替换文本
var $thirdLink = $("#ssd");
var linkText = $thirdLink.text().replace('foo','bar');
$thirdLink.text(linkText); */
});
});
// --></mce:script>
</html>



用JS进行Excel 三种导出方式

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<title>WEB页面导出为EXCEL文档的方法</title>
</head>
<body>
<table id="tableExcel" width="100%" border="1" cellspacing="0" cellpadding="0">


</br>

<tr>
<td colspan="7" align="center">WEB页面导出为EXCEL文档的方法</td>
</tr>
<tr>
<td colspan="2">列标题1</td>
<td colspan="2">列标题2</td>
<td>列标题3</td>
<td>列标题4</td>
<td>列标题5</td>
</tr>
<tr>
<td rowspan="2">dfsd</td>
<td>aaa</td>
<td>fsd</td>
<td>bbb</td>
<td>ccc</td>
<td>ddd</td>
<td>eee</td>
</tr>
<tr>

<td>AAA</td>
<td>fdsf</td>
<td>BBB</td>
<td>CCC</td>
<td>DDD</td>
<td>EEE</td>
</tr>
<tr>
<td>fdsf</td>
<td>FFF</td>
<td>fdfs</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('tableExcel',null);" value="第三种方法导入到EXCEL">
<SCRIPT LANGUAGE="javascript">
function method1(tableid) {//整个表格拷贝到EXCEL中
var curTbl = document.getElementById(tableid);
var oXL = new ActiveXObject("Excel.Application");
//创建AX对象excel
var oWB = oXL.Workbooks.Add();
//获取workbook对象
var oSheet = oWB.ActiveSheet;
oSheet.Cells(1,1).Value="heelo";
alert('--');
//激活当前sheet
var sel = document.body.createTextRange();
sel.moveToElementText(curTbl);
//把表格中的内容移到TextRange中
sel.select();
//全选TextRange中内容
sel.execCommand("Copy");
//复制TextRange中内容
oSheet.Paste();
//粘贴到活动的EXCEL中
oXL.Visible = true;
//设置excel可见属性
}
function method2(tableid) //读取表格中每个单元到EXCEL中
{
var curTbl = document.getElementById(tableid);
var oXL = new ActiveXObject("Excel.Application");
//创建AX对象excel
var oWB = oXL.Workbooks.Add();
//获取workbook对象
var oSheet = oWB.ActiveSheet;
//激活当前sheet
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可见属性
}
function getXlsFromTbl(inTblId, inWindow) {
try {
var allStr = "";
var curStr = "";
//alert("getXlsFromTbl");
if (inTblId != null && inTblId != "" && inTblId != "null") {
curStr = getTblData(inTblId, inWindow);
}
if (curStr != null) {
allStr += curStr;
}
else {
alert("你要导出的表不存在!");
return;
}
var fileName = getExcelFileName();
doFileExport(fileName, allStr);
}
catch(e) {
alert("导出发生异常:" + e.name + "->" + e.description + "!");
}
}
function getTblData(inTbl, inWindow) {
var rows = 0;
//alert("getTblData is " + inWindow);
var tblDocument = document;
if (!!inWindow && inWindow != "") {
if (!document.all(inWindow)) {
return null;
}
else {
tblDocument = eval(inWindow).document;
}
}
var curTbl = tblDocument.getElementById(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 += " \t";
rows -= 1;
}
outStr += curTbl.rows[j].cells[i].innerText + "\t";
if (curTbl.rows[j].cells[i].colSpan > 1) {
for (var k = 0; k < curTbl.rows[j].cells[i].colSpan - 1; k++) {
outStr += " \t";
}
}
if (i == 0) {
if (rows == 0 && curTbl.rows[j].cells[i].rowSpan > 1) {
rows = curTbl.rows[j].cells[i].rowSpan - 1;
}
}
}
outStr += "\r\n";
}
}
else {
outStr = null;
alert(inTbl + "不存在!");
}
return 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";
//alert(fileName);
return fileName;
}
function 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=" + width + ",height=" + height;
xlsWin = window.open("", "_blank", openPara);
}
xlsWin.document.write(inStr);
xlsWin.document.close();
xlsWin.document.execCommand('Saveas', true, inName);
xlsWin.close();
}
</SCRIPT>
</body>
</html>


 

程序猿太苦了

Nginx 限制单个IP的并发连接数及对每个连接限速

使用Nginx限制单个IP的并发连接数能够减少一些采集程序或者DDOS的攻击。
lnmp的nginx配置中已经添加了部分代码,但是是注释掉的,可以编辑/usr/local/nginx/conf/nginx.conf 文件
查找:
复制内容到剪贴板
代码:
#limit_zone  oneip  $binary_remote_addr  10m;
将前面的#去掉,没这一行的,话加上
复制内容到剪贴板
代码:
limit_zone  oneip  $binary_remote_addr  10m;
,再在虚拟主机配置的server段里添加
复制内容到剪贴板
代码:
limit_conn oneip 20;
limit_conn 语句最后面的数字为单个IP的最大并发连接数。

当然,limit_conn oneip 20; 语句也是可以添加到server 段里只针对某个虚拟主机做此限制。

限制直接在server段里限制并发数这一行下面加上limit_rate 100k;
限制每个连接速度为100K,此限制是针对单个线程,比如,我用IE下载是100K,当用迅雷时它会占用2个线程,所以迅雷下载速度为200K,如果单个IP的并发数设置为20,则多线程下载的话速度可以达到100K×20。

最后重启nginx即可。

MagickWand For PHP安装

# tar zxvf MagickWandForPHP-1.0.8.tar.gz
# cd MagickWandForPHP-1.0.8
# ./configure --prefix=/usr/local/magickwand --enable-shared --with-php-config=/usr/local/php/bin/php-config --with-magickwand=/usr/local/ImageMagick/
# make
# make install

3.将编译成功的magickwand.so加入到php.ini中,extension="magickwand.so"
重启apache服务器。

方法是没问题但今天安装的时候发现ImageMagick是小写的,linux系统对大小写是区分的,难怪一直不成功,忽略这个了

MySQL的insert、replace和update语句执行效率

测试程序

#include <stdio.h>

#include <stdlib.h>

#include <string>

#include <iostream>

#include <time.h>

#include "/usr/local/include/mysql/mysql.h"

using namespace std;

MYSQL mysql;

void exiterr(int exitcode)

{

         printf("%s\n", mysql_error(&mysql));

         exit( exitcode );

}

// create ip, from 10.0.0.0~10.0.255.255

void init_ip()

{

         string insert_sql;

       

         string ip;

         char vbuf1[5];

         char vbuf2[5];

         for(int i=0; i<=255; i++){

                   for(int j=0; j<=255; j++){

                            ip = "10.0.";

                            memset(vbuf1,0,sizeof(vbuf1));

                            sprintf(vbuf1,"%d.",i);

                            ip.append(vbuf1);

                            memset(vbuf2,0,sizeof(vbuf2));

                            sprintf(vbuf2,"%d",j);

                            ip.append(vbuf2);

                          

                            // 以下是测试语句

                            //insert_sql = "replace into test_data(ip,mobilenum) values('";

                            //insert_sql += ip + "','13200000001')" ;

                            insert_sql = "update test_data set mobilenum='13200000002' where ip='" + ip + "'";

                            if (mysql_query(&mysql,insert_sql.c_str())) exiterr(3);

                   }

         }

}

int main()

{

         int i = 0;

         time_t  timeVal;

         printf("************* begin mysql operation *****************\n");

         mysql_init(&mysql);

       

         if(!mysql_real_connect(&mysql,"192.168.0.100","user","pass","testDB",0,NULL,0)){

                   printf("connect to db error,%s\n", mysql_error(&mysql));

                   return 1;

         }

         time(&timeVal);

         cout << "begin time: " << timeVal << endl;

         init_ip();

         time(&timeVal);

         cout << "end time: " << timeVal << endl;

         mysql_close(&mysql);

         printf("************* end mysql operation *****************\n");

         return 0;

}

表结构:

CREATE TABLE gtpDB.test_data(

  ip varchar(15) NOT NULL,

  mobilenum varchar(11) NOT NULL,

  gtptime int(10) UNSIGNED NOT NULL,

  PRIMARY KEY (Ip),

  INDEX (Ip)

) TYPE=MyISAM;

操作数据表数据条数:65536

1、insert测试

         insert_sql = "insert into test_data(ip,mobilenum) values('";

         insert_sql += ip + "','13200000001')" ;

         执行时间:10s

2、replace测试

使用REPLACE插入一条记录时,如果不重复,REPLACE就和INSERT的功能一样,如果有重复记录,REPLACE就使用新记录的值来替换原来的记录值。使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE和INSERT时添加事务等复杂操作了。在使用REPLACE时,表中必须有唯一有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。

2.1、表空时的测试

         清除表中数据,此时相当于insert操作

         insert_sql = "replace into test_data(ip,mobilenum) values('";

         insert_sql += ip + "','13200000001')" ;

         执行时间10s

2.2、表不空时的操作,即此时有65536条数据

         紧接着2.1测试

         insert_sql = "replace into test_data(ip,mobilenum) values('";

         insert_sql += ip + "','13200000002')" ;

         此时相当于要修改原有的mobilenum数据

         执行时间:10S

3、update测试

         紧接着2.2,表不空时,更新数据

insert_sql = "update test_data set mobilenum='13200000003' where ip='" + ip + "'";

执行时间:15s


【结论】:replace效率不错,且概括了insert和delte/insert功能。