POST/excel

Compare Excel Spreadsheets

Compute a diff between two spreadsheets. Supports both multipart/form-data file uploads and JSON with base64-encoded data URLs. Accepts .xlsx, .xls, and .csv files.

Parameters

emailquerystring

Your email address. Required if not using an API key.

input_typequerystringrequired

Specifies the request content-type. - `form`: multipart/form-data - `json`: application/json

Values: json, form

diff_levelquerystring

Specifies whether you want to diff values by their formulas or standard values. Default is `standard`.

Values: standard, formulas

Default: standard

ignore_whitespacequerystring

Whether to ignore leading and trailing whitespace in the diff. Default is `false`.

Values: true, false

Default: false

ignore_case_changesquerystring

Whether to ignore case changes in the diff. Default is `false`.

Values: true, false

Default: false

hide_unchanged_rowsquerystring

Whether to hide unchanged rows in the diff. Default is `false`.

Values: true, false

Default: false

hide_unchanged_columnsquerystring

Whether to hide unchanged columns in the diff. Default is `false`.

Values: true, false

Default: false

Request Bodyrequired

left_spreadsheetstring (binary)required

Left spreadsheet file. File extension must be .xlsx, .xls, or .csv.

right_spreadsheetstring (binary)required

Right spreadsheet file. File extension must be .xlsx, .xls, or .csv.

left_sheet_namestring

The sheet name from the left spreadsheet to diff. If not provided, the first sheet will be used.

right_sheet_namestring

The sheet name from the right spreadsheet to diff. If not provided, the first sheet will be used.

left_header_rowinteger

The row number to use as the header from the left spreadsheet. If not provided, the first row will be used.

right_header_rowinteger

The row number to use as the header from the right spreadsheet. If not provided, the first row will be used.

Responses

Diff computed successfully.

application/json

tableobject[][][]

The diff results for each cell. Cells are organized by rows, with each row containing cells in column order (left to right). Each cell is represented by an array of one or two objects. If the cell value changed, there will be two objects (one removed, one inserted). Each object contains the `type` of change and the `value`.

rowsobject[]

Row-level diff metadata. Each entry contains the original row number, the new row number, and the type of change.

typestring

Enum: equal, removed, inserted, modified

originalinteger | null
newinteger | null
columnsobject[]

Column-level diff metadata. Each entry contains the original column number, the new column number, and the type of change.

typestring

Enum: equal, removed, inserted, modified

originalinteger | null
newinteger | null
statsobject

Summary statistics for the diff.

movedinteger
insertedinteger
removedinteger
rowsinteger

Total rows in the output.

columnsinteger

Total columns in the output.

Example
{
  "table": [
    [
      [
        {
          "value": "Bird",
          "type": "equal"
        }
      ],
      [
        {
          "value": "Population",
          "type": "equal"
        }
      ]
    ],
    [
      [
        {
          "value": "Kagu",
          "type": "equal"
        }
      ],
      [
        {
          "value": "1,000",
          "type": "equal"
        }
      ]
    ],
    [
      [
        {
          "value": "Dodo",
          "type": "removed"
        }
      ],
      [
        {
          "value": "0",
          "type": "removed"
        }
      ]
    ],
    [
      [
        {
          "value": "Kiwi",
          "type": "equal"
        }
      ],
      [
        {
          "value": "120,000",
          "type": "removed"
        },
        {
          "value": "70,000",
          "type": "inserted"
        }
      ]
    ]
  ],
  "rows": [
    {
      "type": "equal",
      "original": 1,
      "new": 1
    },
    {
      "type": "equal",
      "original": 2,
      "new": 2
    },
    {
      "type": "removed",
      "original": 3,
      "new": null
    },
    {
      "type": "modified",
      "original": 4,
      "new": 3
    }
  ],
  "columns": [
    {
      "type": "equal",
      "original": 1,
      "new": 1
    },
    {
      "type": "modified",
      "original": 2,
      "new": 2
    }
  ],
  "stats": {
    "moved": 0,
    "inserted": 1,
    "removed": 2,
    "rows": 4,
    "columns": 2
  }
}

Example Request

curl
curl -X POST \
  "https://api.diffchecker.com/public/excel?email=your%40email.com&input_type=json&diff_level=standard&ignore_whitespace=false&ignore_case_changes=false&hide_unchanged_rows=false&hide_unchanged_columns=false" \
  -H "Content-Type: application/json" \
  -d '{
  "left_spreadsheet": "{left_spreadsheet}",
  "right_spreadsheet": "{right_spreadsheet}",
  "left_sheet_name": "{left_sheet_name}",
  "right_sheet_name": "{right_sheet_name}",
  "left_header_row": "{left_header_row}",
  "right_header_row": "{right_header_row}"
}'

Try It

Understanding the Output

The response contains four sections: table, rows, columns, and stats. Below is a walkthrough using an example comparing bird populations.

Example Visualization

The Kagu population remained the same, the Dodo was removed because it is extinct, and the Kiwi population declined.

11BirdPopulation
22Kagu1,000
3Dodo0
43Kiwi
120,00070,000

Rows

{
  "rows": [
    {
      "type": "equal",
      "original": 1,
      "new": 1
    },
    {
      "type": "equal",
      "original": 2,
      "new": 2
    },
    {
      "type": "removed",
      "original": 3,
      "new": null
    },
    {
      "type": "modified",
      "original": 4,
      "new": 3
    }
  ]
}

Each entry describes a row's change between the original and new spreadsheet.

originalRow number in the left (original) spreadsheet.
newRow number in the right (new) spreadsheet.
typeThe kind of change: equal, removed, inserted, or modified.

In our example, the first two rows are unchanged. Row 3 (Dodo) was removed, and row 4 (Kiwi) was modified — shifting up from position 4 to 3.

Columns

{
  "columns": [
    {
      "type": "equal",
      "original": 1,
      "new": 1
    },
    {
      "type": "modified",
      "original": 2,
      "new": 2
    }
  ]
}

Same structure as rows, but describes column-level changes.

originalColumn number in the left spreadsheet.
newColumn number in the right spreadsheet.
typeThe kind of change: equal, removed, inserted, or modified.

Column 1 (“Bird”) is unchanged. Column 2 (“Population”) is modified because the Kiwi's population value changed.

Table

{
  "table": [
    [
      [
        {
          "value": "Bird",
          "type": "equal"
        }
      ],
      [
        {
          "value": "Population",
          "type": "equal"
        }
      ]
    ],
    [
      [
        {
          "value": "Kagu",
          "type": "equal"
        }
      ],
      [
        {
          "value": "1,000",
          "type": "equal"
        }
      ]
    ],
    [
      [
        {
          "value": "Dodo",
          "type": "removed"
        }
      ],
      [
        {
          "value": "0",
          "type": "removed"
        }
      ]
    ],
    [
      [
        {
          "value": "Kiwi",
          "type": "equal"
        }
      ],
      [
        {
          "value": "120,000",
          "type": "removed"
        },
        {
          "value": "70,000",
          "type": "inserted"
        }
      ]
    ]
  ]
}

Cell-level diff results organized by rows, with each row containing cells in column order (left to right).

Each cell is an array of one or two objects. Two objects appear when a value changed — one for the removed value and one for the inserted value.

typeThe change for this value: equal, removed, or inserted.
valueThe cell content.

Every cell is equal except the Dodo's row (removed) and the Kiwi's population cell, which has both a removed value (120,000) and an inserted value (70,000).

Stats

{
  "stats": {
    "moved": 0,
    "inserted": 1,
    "removed": 2,
    "rows": 4,
    "columns": 2
  }
}

Summary statistics for the entire diff.

movedCells that moved position.
insertedCells that were added.
removedCells that were deleted.
rowsTotal rows in the output.
columnsTotal columns in the output.

One insertion (Kiwi's new population) and two removals (Dodo's row and Kiwi's old population).