복사·붙여넣기·우클릭
엑셀처럼 셀을 선택할 수 있습니다. 드래그하거나, Shift 클릭, Shift+방향키, Ctrl+A를 쓰세요. Ctrl+C는 선택 범위를 엑셀과 구글 시트가 이해하는 형식으로 복사합니다. 숫자는 숫자 그대로, 날짜는 YYYY-MM-DD로 들어갑니다. Ctrl+V는 엑셀에서…
실행 예제복사·붙여넣기·우클릭
엑셀처럼 셀을 드래그해 복사하고, 엑셀에서 복사한 내용을 그대로 붙여넣습니다. 우클릭 메뉴도 있습니다.
이 데모의 코드
import { createGrid, type GridApi } from '@freegridjs/core';
import { demoColumns, makeRows } from '../data';
import { button, separator, text, toggle, tr, type DemoContext } from '../ui';
export default function mount(ctx: DemoContext) {
const { lang } = ctx;
// Paste only writes to columns marked editable.
const editable = new Set(['name', 'q1', 'q2', 'q3', 'q4', 'joined', 'active', 'status']);
const columns = demoColumns(lang).map(function mark(c): typeof c {
if (c.children) return { ...c, children: c.children.map(mark) };
// email cannot be copied: it pastes as an empty cell
if (c.field === 'email') return { ...c, copyable: false, cellClass: 'demo-secret' };
return editable.has(c.field ?? '') ? { ...c, editable: true } : c;
});
const data = makeRows(500);
let grid: GridApi;
const create = (rangeSelection: boolean) => {
grid?.destroy();
grid = createGrid(ctx.host, {
columns,
data,
rowSelection: 'multiple',
locale: lang,
rangeSelection, // drag, Shift+click, Shift+arrows and Ctrl+A select cell ranges (Excel-style)
summary: { rows: [{ label: tr(lang, { en: 'Total', ko: '합계' }), columns: { q1: 'sum', q2: 'sum', q3: 'sum', q4: 'sum' } }] },
contextMenu: p => [
...p.defaultItems,
'separator',
{ label: tr(lang, { en: `Say hello to ${p.row?.name ?? ''}`, ko: `${p.row?.name ?? ''}에게 인사하기` }), action: () => ctx.log(`👋 ${p.row?.name}`) },
],
});
grid.on('rangeChange', e => e.range && ctx.log(`rangeChange → ${e.range.start.colId} ${e.range.start.rowIndex + 1} : ${e.range.end.colId} ${e.range.end.rowIndex + 1}`));
grid.on('cellValueChanged', e => ctx.log(`cellValueChanged → row ${e.rowIndex + 1} ${e.colId}: ${String(e.oldValue)} → ${String(e.newValue)}`));
grid.on('paste', e => ctx.log(`paste → changed ${e.changed}, skipped ${e.skipped}`));
};
create(true);
text(ctx, tr(lang, {
en: 'Drag across cells, press Ctrl+C and paste into Excel. Copy cells in Excel, click a Name or Q1–Q4 cell and press Ctrl+V. Right-click for the menu. Hold Ctrl to add more ranges. The Email column cannot be copied.',
ko: '셀을 드래그하고 Ctrl+C를 누른 뒤 엑셀에 붙여넣어 보세요. 엑셀에서 복사한 셀은 이름이나 1~4분기 셀을 클릭하고 Ctrl+V로 붙여넣습니다. 우클릭하면 메뉴가 열립니다. Ctrl을 누른 채 드래그하면 범위를 더 추가합니다. 이메일 컬럼은 복사되지 않습니다.',
}));
separator(ctx);
toggle(ctx, tr(lang, { en: 'Drag selects cell ranges', ko: '드래그로 셀 범위 선택' }), true, on => {
create(on);
ctx.log(`rangeSelection: ${on}`);
});
button(ctx, tr(lang, { en: 'Copy with headers', ko: '헤더 포함 복사' }), () => {
const tsv = grid.copySelection({ headers: true });
ctx.log(tr(lang, { en: `copied ${tsv.split('\r\n').length} lines`, ko: `${tsv.split('\r\n').length}줄 복사됨` }));
});
button(ctx, tr(lang, { en: 'Paste sample into Name, Q1', ko: '이름·1분기에 예시 붙여넣기' }), () => {
grid.setRange({ start: { rowIndex: 0, colId: 'name' }, end: { rowIndex: 0, colId: 'name' } });
grid.pasteText('Kim Minsu\t1,234,000\r\nLee Jiwoo\t(50)');
});
}엑셀처럼 셀을 선택할 수 있습니다. 드래그하거나, Shift 클릭, Shift+방향키, Ctrl+A를 쓰세요. Ctrl+C는 선택 범위를 엑셀과 구글 시트가 이해하는 형식으로 복사합니다. 숫자는 숫자 그대로, 날짜는 YYYY-MM-DD로 들어갑니다. Ctrl+V는 엑셀에서 복사한 셀을 선택한 셀부터 붙여넣습니다. 값 하나를 복사했다면 선택한 범위 전체를 그 값으로 채웁니다.
붙여넣기는 editable: true로 지정한 컬럼만 바꾸므로 ID나 계산 컬럼은 안전합니다. 값은 컬럼 타입에 맞게 변환됩니다. 1,234, ₩12,000, (5), 12%는 숫자로, 2026. 3. 5., 2026년 3월 5일은 날짜로 바뀝니다. 변환할 수 없는 값은 건너뛰고 paste 이벤트에 개수를 알려줍니다.
Ctrl(⌘)을 누른 채 클릭하거나 드래그하면 범위를 여러 개 고를 수 있습니다. 같은 컬럼이나 같은 행에 놓인 범위는 엑셀처럼 함께 복사되고, Delete와 하단 합계는 모든 범위에 적용됩니다. 주민번호처럼 복사되면 안 되는 컬럼에는 copyable: false를 주세요. 그 셀은 빈 칸으로 복사됩니다.
셀을 우클릭하면 복사, 헤더 포함 복사, 붙여넣기, 너비 자동 맞춤, 숨기기, 고정 메뉴가 열립니다. 헤더를 우클릭하면 컬럼 메뉴가 열립니다. 범위 선택은 rangeSelection: false로 끌 수 있고, contextMenu: false로 브라우저 기본 메뉴를 쓸 수 있습니다.
const grid = createGrid(el, {
columns: [
{ field: 'id', type: 'number' }, // read-only
{ field: 'name', editable: true }, // paste allowed
{ field: 'qty', type: 'number', editable: true }, // "1,234", "(5)", "12%" are parsed
{ field: 'due', type: 'date', editable: true }, // "2026-03-05", "2026. 3. 5." …
],
data,
rangeSelection: true, // default: drag / Shift+click / Shift+arrows / Ctrl+A
contextMenu: p => [
...p.defaultItems, // Copy, Paste, Pin, Hide, …
'separator',
{ label: 'Open order', action: () => open(p.row) },
],
});
grid.on('cellValueChanged', e => save(e.row)); // persist edits
grid.on('paste', e => console.log(e.changed, 'cells changed'));
grid.setRange({ start: { rowIndex: 0, colId: 'name' }, end: { rowIndex: 9, colId: 'qty' } });
grid.copySelection({ headers: true }); // TSV, also written to the clipboard
grid.pasteText('Kim 1,234
Lee 56');메뉴의 "붙여넣기"는 클립보드를 읽어야 해서 브라우저가 막거나 권한을 물을 수 있습니다. Ctrl+V는 브라우저의 붙여넣기 이벤트를 쓰므로 항상 동작합니다.