javascript - 如何使用 JavaScript 和 ExcelJS 检查不同工作表中的单元格值?

标签 javascript excel exceljs

我有一个包含两张纸的电子表格。 Sheet 1 包含 3 列,其中包含 100 行数据(字符串)。 Sheet 2 将用作 Sheet 1 正确组合的母版,以检查以确保单元格中的值正确。 Sheet 2 也有 3 列。

我想做的是逐行遍历 Sheet 1,并检查行中每个单元格的值是否与 Sheet 2 中的 anywhere 匹配,一行一行。

如果检查失败,则应停止对该行的进一步检查,并开始检查下一行。 Sheet 1 中无法匹配的单元格应标记为红色。

我下面的代码接近于我的需要,但标记错误的单元格比要求的多。

// Import the library
var Excel = require('exceljs');
var moment = require('moment');
// Define Excel filename
var ExcelFile = 'so.xlsx';

// Read from the file
var workbook = new Excel.Workbook();
workbook.xlsx.readFile(ExcelFile)
    .then(function() {
        // Use workbook
        var dataSheet = workbook.getWorksheet('Sheet 1');
        var masterSheet = workbook.getWorksheet('Sheet 2');

        dataSheet.eachRow({ includeEmpty: false }, function(row, rowNumber) {

            var dataSheetCell1 = row.getCell('A').value;
            var dataSheetCell2 = row.getCell('B').value;
            var dataSheetCell3 = row.getCell('C').value;

            masterSheet.eachRow({ includeEmpty: false }, function(row, rowNumber) {

                var masterSheetCell1 = row.getCell('A').value;
                var masterSheetCell2 = row.getCell('B').value;
                var masterSheetCell3 = row.getCell('C').value;

                // Iterate over all cells in a row (including empty cells)
                row.eachCell({ includeEmpty: false }, function(cell, colNumber) {
                    if(dataSheetCell1 == masterSheetCell1) {
                        console.log(true)
                    } else {
                        // Stop all further checks for this sheet(n) row and move onto next row
                        // Mark this failed cell as color red
                    }
                });
            });
        });

        return workbook.xlsx.writeFile('new.xlsx');
    });

示例数据如下所示:

工作表 1:

| COL A | COL B  | COL C  |
|-------|--------|--------|
| bob   | eleven | blue   |
| bob   | eleven | blue   |
| bob   | eleven | red    |
| bob   | eleven | red    |
| bob   | one    | red    |
| bob   | eight  | red    |
| bob   | eight  | red    |
| bob   | eight  | red    |
| terry | seven  | yellow |
| terry | seven  | yellow |
| terry | seven  | gold   |

工作表 2:

| COL A | COL B  | COL C  |
|-------|--------|--------|
| bob   | eleven | blue   |
| bob   | eleven | red    |
| bob   | eight  | red    |
| terry | seven  | yellow |
| terry | seven  | orange |

根据示例数据,Sheet 1中应该有两个错误(B5C11)被标记为红色>new.xlsx。例如

enter image description here

这是一个 example PDF应该如何进行检查:

enter image description here

最佳答案

您可以将每个失败的单元格标记为红色,如下所示:

// Import the library
var Excel = require('exceljs'),
    moment = require('moment'),
    // Define Excel filename
    ExcelFile = 'so.xlsx',
    // Read from the file
    workbook = new Excel.Workbook();

workbook.xlsx.readFile(ExcelFile)
    .then(function()
    {
        // Use workbook
        var dataSheet = workbook.getWorksheet('Sheet 1'),
            masterSheet = workbook.getWorksheet('Sheet 2');

        dataSheet.eachRow({ includeEmpty: false }, function(dataRow, dataRowNumber)
        {
            var dataRowCells =
                {
                    dataCell1: dataRow.getCell('A'),
                    dataCell2: dataRow.getCell('B'),
                    dataCell3: dataRow.getCell('C')
                },
                isdataRowOK = false,
                oneOfBestMasterRowNumber,
                cellNames = ['A','B','C'];

            masterSheet.eachRow({ includeEmpty: false }, function(masterRow, masterRowNumber)
            {
                if(!isdataRowOK)
                {
                    var numberOfGoodCellsInRow = 0;

                    for(var i = 1; i < 4; i++)
                        if(dataRowCells['dataCell' + i].value === masterRow.getCell(cellNames[i-1]).value)
                            numberOfGoodCellsInRow++;

                    if(numberOfGoodCellsInRow == 2)
                        oneOfBestMasterRowNumber = masterRowNumber;

                    if(numberOfGoodCellsInRow == 3)
                        isdataRowOK = true
                }
            });


            if(!isdataRowOK)
            {
                var masterRowForCheck = masterSheet.getRow(oneOfBestMasterRowNumber);

                for(var i = 1; i < 4; i++)
                {
                    var dataCell = dataRowCells['dataCell' + i];
                    if(dataCell.value !== masterRowForCheck.getCell(cellNames[i-1]).value)
                    {
                        // Mark this failed cell as color red
                        dataCell.style = Object.create(dataCell.style); // Shallow-clone the style, break references
                        dataCell.fill = {type: 'pattern', pattern:'solid', fgColor:{argb:'FA8072'}}; // Set background
                    }
                }

            }
        });

        return workbook.xlsx.writeFile('new.xlsx');
    });

关于javascript - 如何使用 JavaScript 和 ExcelJS 检查不同工作表中的单元格值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53544082/

相关文章:

excel - 在使用 TODAY() 的条件格式化函数中排除 header

PHPExcel freezePane() 如果列不适合窗口,则无法水平滚动

exceljs - 货币格式为excelJS

javascript - 如何根据鼠标悬停在图像上的位置突出显示 gridview 行?

javascript - for 循环中出现意外值

windows - 使用批处理文件在单独的实例中打开多个 Excel 文件

angular - 无法使用 angular 8 使用带有 xlsx 的 json 数据导出到 excel

javascript - 如何在excel js中下载带有图像的excel表

javascript - 当选中一个复选框时,使用 javascript 取消选中其他复选框

javascript - 如何在 Node/Angular 应用程序中存储或检索嵌入代码?