MySql查询获取存储在数据库表中的excel单元格位置


MySql query to fetch excel cell positions stored in db table in order

我有一个数据库表,其中包含单元格数据和相应的位置。我想使用PHP显示一个html表,其中数据库中的"单元格数据"列中的数据位于同一记录的"单元格位置"列中。我该怎么做呢。是否有可能在mysql中单独获取数据?如果没有任何关于实现这一目标的意见,我将非常欢迎。

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

                 Cell Data     Cell Position
                  Hello             A1
                  Bello             C2

编辑
我欢迎编程解决方案,如果不是单独使用mysql。但我不想要任何库,我知道我可以用PHPExcel。

如果只是列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'等时,它会变得有点困难…不仅仅是提取列/行;还要处理列排序…我还在想办法解决。在不实际将其全部写出来的情况下,我将对数值的cellposition测试的第2、第3、第4个字符进行CASE测试,并相应地调整SUBSTR偏移量和长度以分割行和列组件,然后使用LPAD()将带有空格的列填充为3个字符长度。

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

实际上在PHP中更简单,你可以简单地以任何顺序检索记录,然后在PHP中使用ussort()处理分割,使用如下代码:

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

拆分row/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');

我建议使用这个库,它真的很好,快速和易于使用:

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数据库,你可以使用http://sourceforge.net/projects/phpexcelreader/将你的excel文件导入MySQL数据库,如下所示:

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

那么你可以像往常一样处理它!