Skip to content

Utilities

Standalone services and helpers exported from @ezygrid/core (and small dedicated packages).

Clipboard

ts
interface ClipboardCell { raw?; formula?; style?; literal? }
interface ClipboardRange { rows: number; columns: number; origin: { row; column }; cells: ClipboardCell[][] }

class ClipboardService {
  copyFrom(worksheet, top, left, bottom, right, options?: { valuesOnly?: boolean }): ClipboardRange;
  getBuffer(): ClipboardRange | null;
  loadTSV(text: string): void;
  toTSV(): string;
  static fromTSV(text: string): ClipboardRange;
  pasteTo(workbook, worksheet, anchorRow, anchorColumn): void;
}

function translateFormula(formula: string, dRow: number, dCol: number): string;

See Clipboard.

Fill

ts
type FillDirection = 'down' | 'up' | 'right' | 'left';

class FillService {
  fillRange(worksheet, source: Rect, target: Rect): void;
  fill(worksheet, direction: FillDirection, rect: Rect, targetEnd: ...): void;
}

See Fill & series.

Merges

ts
interface MergeRect extends Rect { id: string }

class MergeStore {
  merge(rect: Rect): MergeRect;        // rejects overlaps/degenerate rects
  unmergeAt(row: number, column: number): void;
  findAt(row: number, column: number): MergeRect | undefined;
  isCovered(row: number, column: number): boolean;
  get all(): MergeRect[];
  clear(): void;
  transform(mapper: ..., axis: 'row' | 'column'): void;
}

Sorting

ts
interface SortSpec { column: number; direction: 'asc' | 'desc' }

class SortService {
  sort(worksheet, rect: Rect, specs: SortSpec[]): void;
}

Search & replace

ts
interface SearchOptions { matchCase?: boolean; wholeCell?: boolean; searchFormulas?: boolean }
interface SearchResult { row: number; column: number; text: string }

class SearchService {
  find(worksheet, query: string, options?): SearchResult[];
  findNext(worksheet, query: string, from: { row; column }, options?): SearchResult | undefined;
}

function replace(worksheet, query: string, replacement: string, from: { row; column }, options?): SearchResult | undefined;
function replaceAll(worksheet, query: string, replacement: string, options?): number;

Number formats

ts
function formatValue(value: unknown, mask?: string): string;

Supported masks: #,##0, #,##0.00, 0.00%, $#,##0.00, yyyy-mm-dd, dd/mm/yyyy, mm/dd/yyyy, General.

Tables

ts
interface TableColumn { name: string; index: number }
interface TableDefinition { id: string; name: string; range: Rect; headerRow: boolean; totalRow: boolean; columns: TableColumn[] }

class TableStore {
  add(worksheet, definition: { name; range; headerRow?; totalRow? }): TableDefinition;
  get(name: string): TableDefinition | undefined;
  at(row: number, column: number): TableDefinition | undefined;
  all(): TableDefinition[];
  remove(name: string): void;
  transform(mapper: ..., axis: 'row' | 'column'): void;
}

Validation

ts
class ValidationService {
  add(rule: Omit<ValidationRule, 'id'>): ValidationRule;
  remove(id: string): void;
  all(): readonly ValidationRule[];
  forCell(worksheet, row: number, column: number): ValidationRule[];
  check(worksheet, row: number, column: number, value: unknown): { allowed: boolean; action: ValidationAction; message?: string };
}

Conditional formatting

ts
class ConditionalFormatEngine {
  add(rule: Omit<ConditionalFormatRule, 'id'>): ConditionalFormatRule;
  remove(id: string): void;
  all(): readonly ConditionalFormatRule[];   // sorted by priority
  evaluate(worksheet, row: number, column: number): CellStyle;
}

Editing

ts
type EditMode = 'idle' | 'editing';
interface EditSession { row: number; column: number; initial: string; mode: 'replace' | 'edit' }

class EditService {
  constructor(events?: { onEditStart?; onEditCancel?; onCommit?(session, value: string) });
  get editing(): boolean;
  get session(): EditSession | null;
  beginEdit(sheet, row, column, initial?): EditSession;
  commit(sheet, text?): boolean;
  cancel(): boolean;
}

function parseEditorValue(text: string): unknown;

CSV (@ezygrid/csv)

ts
detectDelimiter(text: string): string;
parseCsv(input: string, options?: { delimiter?; headers?; bom?; numbers? }): { headers?; rows: unknown[][] };
stringifyCsv(rows: unknown[][], options?: { delimiter?; escapeFormulas? }): string;

Charts

ts
type ChartType = 'column' | 'bar' | 'line' | 'pie' | 'doughnut';

interface ChartSpec {
  id: string; type: ChartType; source: string; firstRowIsHeader?: boolean;
  title?: string; colors?: string[]; anchor: { row; column };
  offsetX?: number; offsetY?: number; width?: number; height?: number;
}

class ChartEngine {
  add(spec: ChartSpec): ChartSpec;
  remove(id: string): void;
  all(): ChartSpec[];
}

function readChartData(worksheet, spec: ChartSpec): {
  categories: string[];
  series: { name: string; values: (number | null)[] }[];
};
function renderChartSVG(spec: ChartSpec, data: ChartData): string;

Pivot

ts
type PivotAggregation = 'SUM' | 'COUNT' | 'COUNTA' | 'AVG' | 'MIN' | 'MAX';
interface PivotValueField { column: number; agg: PivotAggregation; label?: string }
interface PivotSpec { id: string; source: string; anchor: string; rows: number[]; values: PivotValueField[] }

class PivotEngine {
  compute(worksheet, spec: PivotSpec): { header: string[]; rows: ...; grandTotals: ... };
  refresh(worksheet, spec: PivotSpec): void;
}

Media

ts
interface ImageMedia { kind: 'image'; src: string; alt?: string; id: string; zIndex?: number; anchor: { row; column }; offsetX?: number; offsetY?: number; width?: number; height?: number }
interface ShapeMedia { kind: 'shape'; shape: 'rect' | 'ellipse' | 'textbox'; text?: string; fill?: string; stroke?: string; textColor?: string; id: string; anchor: { row; column }; ... }

class MediaStore {
  addImage(image: ImageMediaInput): ImageMedia;
  addShape(shape: ShapeMediaInput): ShapeMedia;
  remove(id: string): void;
  all(): (ImageMedia | ShapeMedia)[];
}

Print

ts
type PaperSize = 'A4' | 'Letter';

interface PrintOptions {
  orientation?: 'portrait' | 'landscape';
  paperSize?: PaperSize;
  marginMm?: number;
  repeatHeaderRows?: number;
  gridlines?: boolean;
  includeHeaders?: boolean;
}

function buildPrintHtml(workbook: Workbook, sheetName: string, options?: PrintOptions): string;

Plugins

ts
interface PluginContext { workbook: Workbook; worksheet: Worksheet; commands?: CommandRegistry; renderer?: GridRenderer }
interface EzygridPlugin { name: string; version: string; setup(ctx: PluginContext): void | (() => void) }

function definePlugin(plugin: EzygridPlugin): EzygridPlugin;

class PluginManager {
  constructor(plugins: EzygridPlugin[]);
  get names(): string[];
  run(context: PluginContext): () => void;
  attach(context: PluginContext): () => void;
  destroy(): void;
}

Theme

ts
interface ThemeTokens {
  fontFamily: string; fontSize: string; bg: string; text: string; gridline: string;
  selection: string; selectionSoft: string; headerBg: string; headerText: string; tableBand: string;
}

const defaultThemeTokens: ThemeTokens;
const darkThemeTokens: Partial<ThemeTokens>;
const highContrastThemeTokens: Partial<ThemeTokens>;
function buildThemeCss(overrides?: Partial<ThemeTokens>): string;

Released under the MIT License.