npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

xlsx-diff-typescript

v1.0.0

Published

TypeScript library for comparing differences between two XLSX files using Myers diff algorithm

Downloads

12

Readme

xlsx-diff-typescript

A TypeScript library for comparing differences between two XLSX files. This is a TypeScript port of the Rust xlsx-diff library, implementing the Myers diff algorithm for Excel file comparison.

Installation

# NPM
npm install xlsx-diff-typescript

# Yarn  
yarn add xlsx-diff-typescript

# PNPM
pnpm add xlsx-diff-typescript

Features

  • Compare XLSX files from file paths or buffers
  • Myers diff algorithm for accurate change detection
  • Identifies added, removed, and modified sheets
  • Row-level diff with operation tracking (Insert, Delete)
  • Optional raw data inclusion in results
  • Full TypeScript support with type definitions

Usage

Basic Usage

import { diffXlsx } from 'xlsx-diff-typescript';

async function compareFiles() {
  const result = await diffXlsx('old.xlsx', 'new.xlsx');
  console.log(JSON.stringify(result, null, 2));
}

With Raw Data

import { diffXlsx } from 'xlsx-diff-typescript';

async function compareWithData() {
  const result = await diffXlsx('old.xlsx', 'new.xlsx', true);
  // result.data will contain the raw sheet data
}

From Buffers

import { diffXlsxFromBuffer } from 'xlsx-diff-typescript';
import * as fs from 'fs';

async function compareFromBuffers() {
  const oldBuffer = fs.readFileSync('old.xlsx');
  const newBuffer = fs.readFileSync('new.xlsx');
  
  const result = await diffXlsxFromBuffer(oldBuffer, newBuffer);
  console.log(result);
}

API

diffXlsx(oldFilePath, newFilePath, rawData?)

Compare two XLSX files by file path.

  • oldFilePath: string - Path to the old XLSX file
  • newFilePath: string - Path to the new XLSX file
  • rawData: boolean (optional) - Whether to include raw sheet data (default: false)
  • Returns: Promise<DiffResult>

diffXlsxFromBuffer(oldFile, newFile, rawData?)

Compare two XLSX files from buffers.

  • oldFile: Buffer - Buffer containing the old XLSX file
  • newFile: Buffer - Buffer containing the new XLSX file
  • rawData: boolean (optional) - Whether to include raw sheet data (default: false)
  • Returns: Promise<DiffResult>

Result Format

The library returns a DiffResult object with the following structure:

interface DiffResult {
  added_sheets: string[];           // Sheets only in new file
  removed_sheets: string[];         // Sheets only in old file
  no_change_sheets: string[];       // Unchanged sheets
  modified_sheets: ModifiedSheet[]; // Changed sheets with diff details
  data: OriginData;                // Raw data (if requested)
}

interface ModifiedSheet {
  sheet_name: string;
  diff: DiffItem<SerializableData[]>[];
}

interface DiffItem<T> {
  op: 'Insert' | 'Delete' | 'Equal';
  old_index: number | null;
  new_index: number | null;
  value: T;
}

Example Output

{
  "added_sheets": [],
  "removed_sheets": [],
  "no_change_sheets": ["Sheet2"],
  "modified_sheets": [
    {
      "sheet_name": "Sheet1",
      "diff": [
        {
          "op": "Delete",
          "old_index": 0,
          "new_index": null,
          "value": ["old", "row", "data"]
        },
        {
          "op": "Insert",
          "old_index": null,
          "new_index": 0,
          "value": ["new", "row", "data"]
        }
      ]
    }
  ],
  "data": {
    "old": {
      "sheet_names": ["Sheet1", "Sheet2"],
      "data": null
    },
    "new": {
      "sheet_names": ["Sheet1", "Sheet2"],
      "data": null
    }
  }
}

Development

# Install dependencies
npm install

# Build the library
npm run build

# Run tests
npm test

# Run examples
npm run example:simple      # Basic usage example
npm run example:multi       # Multi-sheet comparison  
npm run example:original    # Original data files test

License

MIT - Same as the original Rust implementation