使用 while 循环使用 PhpExcel 获取行
Using a while loop to get rows using PhpExcel
我希望使用 PHPExcel 创建 javascript 数组,其中的行取自 xlsx 传播 sheet。
这是我的代码
$document.ready({
var rows = new Array();
var vals = new Array();
var i = 0;
while(){
rows[i] = getRow(i);
vals[i] = getVal(i);
i++;
}
});
function getRow(i){
if(window.XMLHttpRequest){
xmlhttp= new XMLHttpRequest();
}else{
xmlhttp= new ActiveXObject('Microsoft.XMLHTTP');
}
xmlhttp.onreadystatechange = function (){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
return xmlhttp.responseText;
}
}
xmlhttp.open('GET', 'data.inc.php?x='+i, true);
xmlhttp.send();
}
function getVal(i){
if(window.XMLHttpRequest){
xmlhttp= new XMLHttpRequest();
}else{
xmlhttp= new ActiveXObject('Microsoft.XMLHTTP');
}
xmlhttp.onreadystatechange = function (){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
return xmlhttp.responseText;
}
}
xmlhttp.open('GET', 'include.inc.php?x='+i, true);
xmlhttp.send();
}
我不确定在 while 循环的参数中检查什么(我假设我们不知道传播中有多少行sheet)
这是我唯一的问题还是解决方法不对?
还有函数 getRow return 整行和 getVal returns 一列,这在页面的其他地方很重要。
您可以使用不同的方法:
1) 同步您的请求:
function getRow(i, rows){
...
xmlhttp.onreadystatechange = function (){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
if xmlhttp.responseText != '' {
rows[i] = xmlhttp.responseText;
getRow(i+1, rows)
} else {
// call function that works with rows.
}
}
}
...
}
此函数仅通过 getRows(0, rows)
调用(无循环!)。
这绝对是最慢的方法,因为每个请求都会在前一个请求完成后立即启动。
2)先发送行数:
您可以在第一个请求或每个请求中发送行数,因此 javascript 知道有多少行。然后您可以像现在一样遍历行并创建异步调用。
3) 一次发送所有行:
我不知道你的用例,但单独调用每一行看起来很浪费时间。为什么不使用换行符作为分隔符(或其他适合您的数据的东西)一次调用 return 所有数据。如果您的数据真的很大,您仍然可以将数据分解成大块并将其与选项 1 或选项 2 结合使用。
4) 在页面加载时发送数据:
不确定这是否是一个选项,因为您在 document.ready
上执行了您的函数,所以看起来确实如此。您可以考虑将您的数据写入一个特殊的隐藏 div 并从那里(使用 javascript)读取数据到您的变量中。这样你就可以避免所有 ajax 调用。如果您想加载所有数据,这可能是最快的。
注意:您可以考虑使用 jQuery,这样可以更轻松地使用 ajax。例如检查 jQuery get。
我希望使用 PHPExcel 创建 javascript 数组,其中的行取自 xlsx 传播 sheet。
这是我的代码
$document.ready({
var rows = new Array();
var vals = new Array();
var i = 0;
while(){
rows[i] = getRow(i);
vals[i] = getVal(i);
i++;
}
});
function getRow(i){
if(window.XMLHttpRequest){
xmlhttp= new XMLHttpRequest();
}else{
xmlhttp= new ActiveXObject('Microsoft.XMLHTTP');
}
xmlhttp.onreadystatechange = function (){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
return xmlhttp.responseText;
}
}
xmlhttp.open('GET', 'data.inc.php?x='+i, true);
xmlhttp.send();
}
function getVal(i){
if(window.XMLHttpRequest){
xmlhttp= new XMLHttpRequest();
}else{
xmlhttp= new ActiveXObject('Microsoft.XMLHTTP');
}
xmlhttp.onreadystatechange = function (){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
return xmlhttp.responseText;
}
}
xmlhttp.open('GET', 'include.inc.php?x='+i, true);
xmlhttp.send();
}
我不确定在 while 循环的参数中检查什么(我假设我们不知道传播中有多少行sheet)
这是我唯一的问题还是解决方法不对?
还有函数 getRow return 整行和 getVal returns 一列,这在页面的其他地方很重要。
您可以使用不同的方法:
1) 同步您的请求:
function getRow(i, rows){
...
xmlhttp.onreadystatechange = function (){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
if xmlhttp.responseText != '' {
rows[i] = xmlhttp.responseText;
getRow(i+1, rows)
} else {
// call function that works with rows.
}
}
}
...
}
此函数仅通过 getRows(0, rows)
调用(无循环!)。
这绝对是最慢的方法,因为每个请求都会在前一个请求完成后立即启动。
2)先发送行数:
您可以在第一个请求或每个请求中发送行数,因此 javascript 知道有多少行。然后您可以像现在一样遍历行并创建异步调用。
3) 一次发送所有行:
我不知道你的用例,但单独调用每一行看起来很浪费时间。为什么不使用换行符作为分隔符(或其他适合您的数据的东西)一次调用 return 所有数据。如果您的数据真的很大,您仍然可以将数据分解成大块并将其与选项 1 或选项 2 结合使用。
4) 在页面加载时发送数据:
不确定这是否是一个选项,因为您在 document.ready
上执行了您的函数,所以看起来确实如此。您可以考虑将您的数据写入一个特殊的隐藏 div 并从那里(使用 javascript)读取数据到您的变量中。这样你就可以避免所有 ajax 调用。如果您想加载所有数据,这可能是最快的。
注意:您可以考虑使用 jQuery,这样可以更轻松地使用 ajax。例如检查 jQuery get。