将一个Excel工作簿中的值与另一个工作簿进行比较

时间:2015-01-09 09:40:33

标签: excel-formula phpexcel

我有两本excel工作簿。 Workbook1包含网址列表,其他包括Workbook2以及网址列表中的更多列。

Workbook1:

COLUMN A
url_list
url1
url2
url3
url

Workbook2:

COLUMN A                            COLUMN B         COLUMN C
Key Words                           URL              Jan 2015
Website search Engine Optimisation  url1             72614
Website search Engine Optimisation  url2             20890
Website search Engine Optimisation  url3             133968
Engine Optimisation                 url7             584625

我想将workbook1(Column A)的网址列表与workbook2(Column B)进行比较。

如果workbook1中缺少来自workbook2的任何网址,则必须在workbook2中添加该网址。

例如: 现在url在工作簿2中不存在,因此它将被添加,并且看起来像这样 Workbook2:

COLUMN A                            COLUMN B         COLUMN C
Key Words                           URL              Jan 2015
Website search Engine Optimisation  url1             72614
Website search Engine Optimisation  url2             20890
Website search Engine Optimisation  url3             133968
Engine Optimisation                 url7             584625
                                    url

我正在使用库phpexcel在Windows 7中使用php中的excel表。 还有任何直接的excel公式吗? 我知道用php我可以做到这一点。

由于

4 个答案:

答案 0 :(得分:2)

我有类似的任务,我一直在不知疲倦地编译一些代码。虽然不存在比较内置函数,但我从这里获取两个不同工作簿的数据(.xlsx文件),从两个工作表中检索特定列,从数据中去除不必要的东西,并将值存储在两个不同的关联数组中。然后我可以使用内置的php函数来比较数组。然后,您可以选择要写入新工作表的值。我仍然需要做更多与我的任务有关的工作,但我希望有一天能帮到某人。

    <?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Europe/London');

define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');

/** Include PHPExcel */
require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; 

//set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
//include_once 'Lib/PHPExcel.php';

$fileType = 'Excel2007';
$fileName = 'testBook.xlsx';
// Create new PHPExcel object
echo date('H:i:s') , " Create new PHPExcel object" , EOL;
$objPHPExcel = new PHPExcel();
$objPHPExcelXX = new PHPExcel();
$objPHPExcelW = new PHPExcel();
// Read the file
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReaderXX = PHPExcel_IOFactory::createReader($fileType);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcelW, 'Excel2007');

$objReader->setReadDataOnly(true);
$objReaderXX->setReadDataOnly(true);
try {
    $objPHPExcel = $objReader->load("Gemeinde_Bad_Rothenfelde.xlsx");
    $objPHPExcelXX = $objReaderXX->load($fileName);

    $objWorksheet = $objPHPExcel->getActiveSheet();
    $objWorksheetXX = $objPHPExcelXX->getActiveSheet();
    print($objWorksheet->getTitle());
    print($objWorksheetXX->getTitle());
//$objColumn = $objWorksheet->getHighestColumn();
//$objOtherCols = $objWorksheet->getHighestColumn();
    $highestRow = $objWorksheetXX->getHighestRow();
    $gemendeHighest = $objWorksheet->getHighestRow();
    }catch(Exception $e) {
          die($e->getMessage());
    }

print("\n");
$arrayOrtStr = array();
$arrayGemStr = array();
$count = 1;
$i = 0;
//$colOrtXX is column in primus sheet, $colOrts is column in Gemeinde sheet,the numbers are the real column numbers in the sheets
for ($row = 1, $colOrtXX=1, $colOrtsT=7, $colOrtsTeil=2,$colStrXX=3, $colOrt=6,$colStr = 10; $row <= $highestRow; $row++) {
    //$cell = $objWorksheet->getCell($objColumn.$row);
    //Getting cell values for Primus Sheet (Columns PostOrt,PostOrtsteil,PostStrasse)
    $cellOrtXX = $objWorksheetXX->getCellByColumnAndRow($colOrtXX,$row);
    $cellStrXX = $objWorksheetXX->getCellByColumnAndRow($colStrXX,$row)->setDataType(PHPExcel_Cell_DataType::TYPE_STRING);
    $cellOrtsTeil = $objWorksheetXX->getCellByColumnAndRow($colOrtsTeil,$row);
    $valOrtXX = $cellOrtXX->getValue();
    $valStrXX = $cellStrXX->getValue();
    $valOrtsTeil = $cellOrtsTeil->getValue();
    // Get cell values for Gemeinde sheet (Columns Ort and Strasse)
    $cellOrt = $objWorksheet->getCellByColumnAndRow($colOrt,$row);
    $cellStr = $objWorksheet->getCellByColumnAndRow($colStr,$row)->setDataType(PHPExcel_Cell_DataType::TYPE_STRING);
    //$cellOrtsT = $objWorksheet->getCellByColumnAndRow($colOrtsT,$row);
    $valOrt = $cellOrt->getValue();
    $valStr = $cellStr->getValue();
    // array populated for strasse column in gemeinde sheet but numbers stripped off the address
    $onlyStr = preg_replace('/[0-9]+/','',$valStr);
    $arrayGemStr[$i] = array("Strasse"=>$onlyStr);

    // Go through the Strasse column, only pick cells with Ort Bad Rothenfelde..compare and write
    if($valOrtXX == "Bad Rothenfelde"){
        // Creating associative array with Ortsteil and Strasse from Primus sheet
        $arrayOrtStr[$i] = array("OrtsTeil"=>$valOrtsTeil,"Strasse"=>$valStrXX);    
    }
    $i++;
    //print_r($array);
}

$ortTeil = array();
$contentFound = array();
$withStr = array();
foreach($arrayOrtStr as $arr) {
    $contentFound[] = $arr['Strasse'];
}
foreach($arrayOrtStr as $arr) {
    if(in_array($arr['Strasse'], $contentFound)){
            $ortTeil[] = $arr["OrtsTeil"];
            $withStr[] = $arr["Strasse"];
        }
    }

echo '<br/>========================================================<br/>';  
print_r($ortTeil);
print_r($withStr);




// Write the Excel file to filename some_excel_file.xlsx in the current directory
//$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcelW);
//$objWriter->save('Gemeinde_Bad_.xlsx');

答案 1 :(得分:0)

从Workbook1复制ColumnA(不包括header / s)并附加到Workbook2的ColumnB,然后将Excel的Remove Duplicates应用到Workbook2的ColumnB。删除重复项应删除示例中的所有条目,但您可能会先从Workbook2中删除B2(或B1),以避免这种情况。

答案 2 :(得分:0)

我在这里发布了一个非常简单的方法。

这不是“直接公式”,但它可能适合您。 我将在同一工作簿中假设您的来源为Sheet1Sheet2,因此很容易适应您的需求。 要遵循的步骤:

  1. Sheet1 中添加帮助列: 在B2中输入公式=IF(ISNA(MATCH($A2,Sheet2!$B$2:$B$5,0)),ROW(),100000)。 向下复制。这将使用大于其余URL的数字(此处为100000)提取要复制的URL的行号。将Sheet2!$B$2:$B$5替换为实际范围。

  2. 设置要复制的网址的索引N列表:在Sheet2位于最后一行(您的示例中为6)的行中的单元格中找到该列在最后一个右边(在你的情况下为D)。从该单元格中输入序列1,2,...。

  3. 选择要复制的第N个网址:在B6中输入公式=OFFSET(Sheet1!$A$2,SMALL(Sheet1!$B:$B,D6)-2,0)。复制下来。

  4. 可以产生相应的变化。

答案 3 :(得分:0)

我们正在从PHPExcel迁移到PhpSpreadsheet。以下是我在phpunit测试中用于使用PhpSpreadsheet比较2个excel文件的片段:

    // compare files
    $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
    // no need to read styles, we just care about data
    $reader->setReadDataOnly(true);
    // load expected file (stored somewhere in the tests directory)
    $spreadsheetExpected = $reader->load($expectedFilePath);
    // load the generated file
    $spreadsheetActual = $reader->load($actualFilePath);
    // loop through 3 pages, indices 0, 1, and 2
    foreach (range(0, 2) as $sheet) {
        // loop through 2 rows
        foreach (range(1, 20) as $row) {
            // loop through first 6 columns
            foreach (['A', 'B', 'C', 'D', 'E', 'F'] as $column) {
                // find coordination
                $cell = $column . $row;
                // get expected cell value
                $expected = $spreadsheetExpected->getSheet($sheet)->getCell($cell)->getValue();
                // get actual cell value
                $actual = $spreadsheetActual->getSheet($sheet)->getCell($cell)->getValue();
                // compare values, show the sheet and coordination in case of failure 
                $this->assertEquals($expected, $actual, "Mismatch in sheet {$sheet}, cell {$cell}");
            }
        }
    }

显然这个测试在第一次不匹配时失败了。