MySql查询按顺序获取存储在db表中的excel单元格位置

时间:2013-06-02 11:33:28

标签: php mysql

我有一个数据库表,其中包含单元格数据和相应的位置。我想使用PHP显示一个html表,其中数据库中“单元数据”列中的数据位于同一记录的“单元格位置”列中。我怎么会这样做是否可以单独在mysql中获取数据?如果没有任何关于实现这一目标的要点将是最受欢迎的。

excel格式用于存储单元格位置。

                 Cell Data     Cell Position
                  Hello             A1
                  Bello             C2

修改
   我欢迎编程解决方案,如果不是单独使用mysql。但是我不想要任何我知道的库我可以用PHPExcel做到这一点...

2 个答案:

答案 0 :(得分:1)

如果它只是A-Z列,那么这是一个简单的答案

SELECT celldata,
       SUBSTR(cellposition,1,2) AS column,
       SUBSTR(cellposition,2) AS row,
       cellposition
  FROM mytable
 ORDER BY 3,2

当你可能有更多的列,如'AA','AZ','BA'等等时,它会变得有点困难......不仅仅是提取列/行;而且还要处理列的排序......我还在为此寻找解决方案。 在没有实际写出来的情况下,我会对单元格测试的第2,第3,第4个字符进行CASE测试以获得数值,并相应地调整SUBSTR偏移和长度以分割行和列组件,然后使用LPAD ()用空格填充列到3个字符的长度。

如果你可以扩展你的MySQL,那么LIB_MYSQLUDF_PREG在MySQL中提供额外的PREG_CAPTURE和PREG_POSITION函数,这将使这更容易;但是您需要从源代码重新编译MySQL才能执行此操作。 MySQL开发人员真的应该考虑将其作为标准实现。

在PHP中实际上要轻松得多,因为您可以按任意顺序检索记录,然后在PHP中使用usort()并使用以下内容处理拆分:

list($c,$r) = sscanf($coord,'%[A-Z]%d');
$c = str_pad($c, 3, ' ', STR_PAD_LEFT);

分割行/ col并通过填充将col调整为可比较的字符串;但是,如果您处理大量数据,那可能会耗费大量内存。

我使用了一个键入单元格地址的数组,并将值作为单元格值,所以:

function cellAddressCompare($a, $b)
{
    sscanf($a,'%[A-Z]%d', $ac, $ar);
    sscanf($b,'%[A-Z]%d', $bc, $br);

    if ($ar == $br) {
        return strcasecmp(strlen($ac) . $ac, strlen($bc) . $bc);
    }
    return ($ar < $br) ? -1 : 1;
}

uksort ($testArray, 'cellAddressCompare');

答案 1 :(得分:0)

我建议使用这个库,它非常好用,快速且易于使用:

http://faisalman.github.io/simple-excel-php/

将其置于循环中,从数据库中获取单元格位置:

 use SimpleExcel\SimpleExcel;

 $excel = new SimpleExcel('CSV');
 $excel->loadFile('/home/faisalman/Downloads/test.csv', 'CSV')

 echo print_r($excel->getWorksheet(1)->getCell($mysql_Cpos, $mysql_Rpos));

如果你想使用MySQL soley,你可以使用http://sourceforge.net/projects/phpexcelreader/将excel文件导入mysql数据库,如下所述:

http://major.io/2008/11/07/importing-excel-files-into-mysql-with-php/

然后你可以照常处理它!