我有两本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我可以做到这一点。
由于
答案 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)
我在这里发布了一个非常简单的方法。
这不是“直接公式”,但它可能适合您。
我将在同一工作簿中假设您的来源为Sheet1
和Sheet2
,因此很容易适应您的需求。
要遵循的步骤:
在Sheet1
中添加帮助列:
在B2中输入公式=IF(ISNA(MATCH($A2,Sheet2!$B$2:$B$5,0)),ROW(),100000)
。
向下复制。这将使用大于其余URL的数字(此处为100000)提取要复制的URL的行号。将Sheet2!$B$2:$B$5
替换为实际范围。
设置要复制的网址的索引N列表:在Sheet2
位于最后一行(您的示例中为6)的行中的单元格中找到该列在最后一个右边(在你的情况下为D)。从该单元格中输入序列1,2,...。
选择要复制的第N个网址:在B6中输入公式=OFFSET(Sheet1!$A$2,SMALL(Sheet1!$B:$B,D6)-2,0)
。复制下来。
可以产生相应的变化。
答案 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}");
}
}
}
显然这个测试在第一次不匹配时失败了。