가져오기 및 내보내기

SpreadJS는 Excel .xlsx/.xlsm, .csv, .ssjson(이전 SpreadJS 형식) 등 널리 사용되는 여러 파일 형식 외에도 새롭고 더 빠른 .sjs SpreadJS 파일 형식을 열고 저장하는 기능을 제공합니다. 새로운 .sjs 형식을 사용하면 매우 큰 Excel 파일을 사용할 때 로그 시간과 메모리 사용량이 이전 SpreadJS에 비해 크게 개선되며 파일을 다시 저장할 때 파일 크기가 대폭 줄어듭니다.

암호로 보호된 Excel 파일을 여는 방법에 대해 자세히 알아보세요.

SpreadJS 파일 형식 기능을 사용하려면 관련 js 파일 링크를 Spread 링크 아래의 문서 헤더 섹션에 추가해야 합니다. 예를 들어 다음과 같습니다. SpreadJS는 sjs 파일 형식을 열고 저장하는 기능을 지원합니다. xlsx, ssjson 및 csv 파일 형식을 가져오고 내보내는 기능도 지원합니다. 예를 들어 다음과 같습니다. GC.Spread.Sheets.Workbook 클래스 GC.Spread.Sheets.SaveOptions GC.Spread.Sheets.OpenOptions GC.Spread.Sheets.ImportOptions GC.Spread.Sheets.ExportOptions GC.Spread.Sheets.ImportXlsxOptions GC.Spread.Sheets.ExportXlsxOptions GC.Spread.Sheets.ImportCsvOptions .Spread.Sheets.ExportCsvOptions GC.Spread.Sheets.ImportSSJsonOptions GC.Spread.Sheets.ExportSSJsonOptions
import * as React from 'react'; import * as ReactDOM from 'react-dom'; import './styles.css'; import { AppFunc } from './app-func'; import { App } from './app-class'; // 1. Functional Component sample ReactDOM.render(<AppFunc />, document.getElementById('app')); // 2. Class Component sample // ReactDOM.render(<App />, document.getElementById('app'));
import * as React from 'react'; import GC from '@mescius/spread-sheets'; import '@mescius/spread-sheets-print'; import '@mescius/spread-sheets-io'; import '@mescius/spread-sheets-shapes'; import '@mescius/spread-sheets-charts'; import '@mescius/spread-sheets-slicers'; import '@mescius/spread-sheets-pivot-addon'; import '@mescius/spread-sheets-reportsheet-addon'; import "@mescius/spread-sheets-tablesheet"; import "@mescius/spread-sheets-ganttsheet"; import '@mescius/spread-sheets-resources-ko'; GC.Spread.Common.CultureManager.culture("ko-kr"); import { SpreadSheets, Worksheet } from '@mescius/spread-sheets-react'; import './styles.css'; window.GC = GC; function deepClone(obj) { return JSON.parse(JSON.stringify(obj)); } function getElementId(mode, fileType, propName) { return mode + '-' + fileType + '-' + propName; } function getFileType(file) { if (!file) { return; } var fileName = file.name; var extensionName = fileName.substring(fileName.lastIndexOf(".") + 1); if (extensionName === 'sjs') { return FileType.SJS; } else if (extensionName === 'xlsx' || extensionName === 'xlsm') { return FileType.Excel; } else if (extensionName === 'ssjson' || extensionName === 'json') { return FileType.SSJson; } else if (extensionName === 'csv') { return FileType.Csv; } } function mapExportFileType(fileType) { if (fileType === FileType.SSJson) { return GC.Spread.Sheets.FileType.ssjson; } else if (fileType === FileType.Csv) { return GC.Spread.Sheets.FileType.csv; } return GC.Spread.Sheets.FileType.excel; } function _getElementById(id) { return document.getElementById(id); } var defaultOpenOptions = [ { propName: "openMode", type: "select", displayText: "OpenMode", options: [{ name: 'normal', value: 0 }, { name: 'lazy', value: 1 }, { name: 'incremental', value: 2 }], default: 0 }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "fullRecalc", type: "boolean", default: false }, { propName: "dynamicReferences", type: "boolean", default: true }, { propName: "calcOnDemand", type: "boolean", default: false }, { propName: "includeUnusedStyles", type: "boolean", default: true }, ]; var importXlsxOptions = [ { propName: "openMode", type: "select", displayText: "OpenMode", options: [{ name: 'normal', value: 0 }, { name: 'lazy', value: 1 }, { name: 'incremental', value: 2 }], default: 0 }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "frozenColumnsAsRowHeaders", type: "boolean", default: false }, { propName: "frozenRowsAsColumnHeaders", type: "boolean", default: false }, { propName: "fullRecalc", type: "boolean", default: false }, { propName: "dynamicReferences", type: "boolean", default: true }, { propName: "calcOnDemand", type: "boolean", default: false }, { propName: "includeUnusedStyles", type: "boolean", default: true }, { propName: "convertSheetTableToDataTable", type: "boolean", default: false }, ]; var importSSJsonOptions = [ { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "frozenColumnsAsRowHeaders", type: "boolean", default: false }, { propName: "frozenRowsAsColumnHeaders", type: "boolean", default: false }, { propName: "fullRecalc", type: "boolean", default: false }, { propName: "incrementalLoading", type: "boolean", default: false } ]; var importCsvOptions = [ { propName: "encoding", type: "string", default: "UTF-8" }, { propName: "rowDelimiter", type: "string", default: "\r\n" }, { propName: "columnDelimiter", type: "string", default: "," } ]; var defaultSaveOptions = [ { propName: "includeBindingSource", type: "boolean", default: false }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "saveAsView", type: "boolean", default: false }, { propName: "includeAutoMergedCells", type: "boolean", default: false }, { propName: "includeCalcModelCache", type: "boolean", default: false }, { propName: "saveR1C1Formula", type: "boolean", default: false }, { propName: "includeUnusedNames", type: "boolean", default: true }, { propName: "includeEmptyRegionCells", type: "boolean", default: true }, ]; var exportXlsxOptions = [ { propName: "includeBindingSource", type: "boolean", default: false }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "saveAsView", type: "boolean", default: false }, { propName: "rowHeadersAsFrozenColumns", type: "boolean", default: false }, { propName: "columnHeadersAsFrozenRows", type: "boolean", default: false }, { propName: "includeAutoMergedCells", type: "boolean", default: false }, { propName: "includeUnusedNames", type: "boolean", default: true }, { propName: "includeEmptyRegionCells", type: "boolean", default: true }, ]; var exportSSJsonOptions = [ { propName: "includeBindingSource", type: "boolean", default: false }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "saveAsView", type: "boolean", default: false }, { propName: "rowHeadersAsFrozenColumns", type: "boolean", default: false }, { propName: "columnHeadersAsFrozenRows", type: "boolean", default: false }, { propName: "includeAutoMergedCells", type: "boolean", default: false }, ]; var exportCsvOptions = [ { propName: "encoding", type: "string", default: "UTF-8" }, { propName: "rowDelimiter", type: "string", default: "\r\n" }, { propName: "columnDelimiter", type: "string", default: "," }, { propName: "sheetIndex", type: "number", default: 0 }, { propName: "row", type: "number", default: 0 }, { propName: "column", type: "number", default: 0 }, { propName: "rowCount", type: "number", default: 200 }, { propName: "columnCount", type: "number", default: 20 }, ]; var FileType = { SJS: 'sjs', Excel: 'xlsx', SSJson: 'ssjson', Csv: 'csv', } export function AppFunc() { const [spread, setSpread] = React.useState(null); const [selectedFile, setSelectedFile] = React.useState(null); const [openFileType, setOpenFileType] = React.useState(''); const [saveFileType, setSaveFileType] = React.useState(FileType.SJS); const [openOptions, setOpenOptions] = React.useState({ sjs: {}, ssjson: {}, xlsx: {}, csv: {}, }); const [saveOptions, setSaveOptions] = React.useState({ sjs: {}, ssjson: {}, xlsx: {}, csv: {}, }); function initSpread(spread) { setSpread(spread); //init Status Bar var statusBar = new GC.Spread.Sheets.StatusBar.StatusBar(document.getElementById('statusBar')); statusBar.bind(spread); } function open() { var file = selectedFile; if (!file) { return; } var fileType = getFileType(file); var options = deepClone(openOptions[fileType]); if (fileType === FileType.SJS) { spread.open(file, function () { }, function () { }, options); } else { spread.import(file, function () { }, function () { }, options); } } function save() { var fileType = saveFileType; var fileName = 'export.' + fileType; var options = deepClone(saveOptions[fileType]); if (fileType === FileType.SJS) { spread.save(function (blob) { saveAs(blob, fileName); }, function () { }, options); } else { if (fileType === FileType.Csv) { var { sheetIndex, row, rowCount, column, columnCount } = options; options.range = { sheetIndex: sheetIndex, row: row, rowCount: rowCount, column: column, columnCount: columnCount, }; } options.fileType = mapExportFileType(fileType); spread.export(function (blob) { saveAs(blob, fileName); }, function () { }, options); } } function onSelectedFileChange(e) { let selectedFile = e.target.files[0]; let openFileType = getFileType(selectedFile); setSelectedFile(selectedFile); setOpenFileType(openFileType) } function onSaveFileTypeChange(e) { let saveFileType = e.target.value; setSaveFileType(saveFileType); } function onPropChange(mode, fileType, prop, e) { let element = e.target; var value; if (prop.type === 'boolean') { value = element.checked; } else if (prop.type === 'number') { value = +element.value; } else if (prop.type === 'string') { value = element.value; } else if (prop.type === 'select') { value = +element.value; } if (mode === 'open') { openOptions[fileType][prop.propName] = value; setOpenOptions(openOptions); } else if (mode === 'save') { saveOptions[fileType][prop.propName] = value; setSaveOptions(saveOptions); } } function createOptions(options, fileType, mode) { let selectFileType = mode === 'open' ? openFileType : saveFileType; let display = selectFileType === fileType ? '' : 'none'; return <div className={fileType} style={{ display }}> {options.map((prop) => createProp(mode, fileType, prop))} </div>; } function createProp(mode, fileType, prop) { let id = getElementId(mode, fileType, prop.propName); if (prop.type === 'select') { return <item className='item'> <label for={id}>{prop.displayText || prop.propName}</label> <select id={id} defaultValue={prop.default} onChange={(e) => onPropChange(mode, fileType, prop, e)}> {prop.options.map((p) => <option value={p.value}>{p.name}</option>)} </select> </item> } else if (prop.type === 'boolean') { return <item className='item'> <input id={id} type='checkbox' defaultChecked={prop.default} onChange={(e) => onPropChange(mode, fileType, prop, e)}></input> <label for={id}>{prop.displayText || prop.propName}</label> </item> } else if (prop.type === 'number') { return <item className='item'> <label for={id}>{prop.displayText || prop.propName}</label> <input id={id} type='number' defaultValue={prop.default} onChange={(e) => onPropChange(mode, fileType, prop, e)}></input> </item> } else { return <item className='item'> <label for={id}>{prop.displayText || prop.propName}</label> <input id={id} type='text' defaultValue={prop.default} onChange={(e) => onPropChange(mode, fileType, prop, e)}></input> </item> } } return <div class="sample-tutorial"> <div class="sample-container"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => initSpread(spread)}> <Worksheet> </Worksheet> </SpreadSheets> </div> <div id="statusBar"></div> </div> <div className="options-container"> <div className="option-row"> <div class="inputContainer"> <input id="selectedFile" type="file" accept=".sjs, .xlsx, .xlsm, .ssjson, .json, .csv" onChange={onSelectedFileChange} /> <button class="settingButton" id="open" onClick={open}>Open</button> <div class="open-options"> {[ createOptions(defaultOpenOptions, FileType.SJS, 'open'), createOptions(importXlsxOptions, FileType.Excel, 'open'), createOptions(importSSJsonOptions, FileType.SSJson, 'open'), createOptions(importCsvOptions, FileType.Csv, 'open'), ]} </div> </div> <div class="inputContainer"> <label for="saveFileType">FileType:</label> <select id="saveFileType" value={saveFileType} onChange={onSaveFileTypeChange}> <option value="sjs">SJS</option> <option value="xlsx">Excel</option> <option value="ssjson">SSJson</option> <option value="csv">Csv</option> </select> <button class="settingButton" id="save" onClick={save}>Save</button> <div class="save-options"> {[ createOptions(defaultSaveOptions, FileType.SJS, 'save'), createOptions(exportXlsxOptions, FileType.Excel, 'save'), createOptions(exportSSJsonOptions, FileType.SSJson, 'save'), createOptions(exportCsvOptions, FileType.Csv, 'save'), ]} </div> </div> </div> </div> </div>; }
import * as React from 'react'; import * as ReactDOM from 'react-dom'; import { SpreadSheets, Worksheet } from '@mescius/spread-sheets-react'; import GC from '@mescius/spread-sheets'; import '@mescius/spread-sheets-io'; import '@mescius/spread-sheets-shapes'; import '@mescius/spread-sheets-charts'; import '@mescius/spread-sheets-slicers'; import '@mescius/spread-sheets-pivot-addon'; import '@mescius/spread-sheets-reportsheet-addon'; import "@mescius/spread-sheets-tablesheet"; import "@mescius/spread-sheets-ganttsheet"; import '@mescius/spread-sheets-resources-ko'; GC.Spread.Common.CultureManager.culture("ko-kr"); import './styles.css'; const Component = React.Component; window.GC = GC; var openOptions = [ { propName: "openMode", type: "select", displayText: "OpenMode", options: [{name: 'normal', value: 0}, {name: 'lazy', value: 1}, {name: 'incremental', value: 2}], default: 0 }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "fullRecalc", type: "boolean", default: false }, { propName: "dynamicReferences", type: "boolean", default: true }, { propName: "calcOnDemand", type: "boolean", default: false }, { propName: "includeUnusedStyles", type: "boolean", default: true }, ]; var importXlsxOptions = [ { propName: "openMode", type: "select", displayText: "OpenMode", options: [{name: 'normal', value: 0}, {name: 'lazy', value: 1}, {name: 'incremental', value: 2}], default: 0 }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "frozenColumnsAsRowHeaders", type: "boolean", default: false }, { propName: "frozenRowsAsColumnHeaders", type: "boolean", default: false }, { propName: "fullRecalc", type: "boolean", default: false }, { propName: "dynamicReferences", type: "boolean", default: true }, { propName: "calcOnDemand", type: "boolean", default: false }, { propName: "includeUnusedStyles", type: "boolean", default: true }, { propName: "convertSheetTableToDataTable", type: "boolean", default: false }, ]; var importSSJsonOptions = [ { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "frozenColumnsAsRowHeaders", type: "boolean", default: false }, { propName: "frozenRowsAsColumnHeaders", type: "boolean", default: false }, { propName: "fullRecalc", type: "boolean", default: false }, { propName: "incrementalLoading", type: "boolean", default: false } ]; var importCsvOptions = [ { propName: "encoding", type: "string", default: "UTF-8" }, { propName: "rowDelimiter", type: "string", default: "\r\n" }, { propName: "columnDelimiter", type: "string", default: "," } ]; var saveOptions = [ { propName: "includeBindingSource", type: "boolean", default: false }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "saveAsView", type: "boolean", default: false }, { propName: "includeAutoMergedCells", type: "boolean", default: false }, { propName: "includeCalcModelCache", type: "boolean", default: false }, { propName: "saveR1C1Formula", type: "boolean", default: false }, { propName: "includeUnusedNames", type: "boolean", default: true }, { propName: "includeEmptyRegionCells", type: "boolean", default: true }, ]; var exportXlsxOptions = [ { propName: "includeBindingSource", type: "boolean", default: false }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "saveAsView", type: "boolean", default: false }, { propName: "rowHeadersAsFrozenColumns", type: "boolean", default: false }, { propName: "columnHeadersAsFrozenRows", type: "boolean", default: false }, { propName: "includeAutoMergedCells", type: "boolean", default: false }, { propName: "includeUnusedNames", type: "boolean", default: true }, { propName: "includeEmptyRegionCells", type: "boolean", default: true }, ]; var exportSSJsonOptions = [ { propName: "includeBindingSource", type: "boolean", default: false }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "saveAsView", type: "boolean", default: false }, { propName: "rowHeadersAsFrozenColumns", type: "boolean", default: false }, { propName: "columnHeadersAsFrozenRows", type: "boolean", default: false }, { propName: "includeAutoMergedCells", type: "boolean", default: false }, ]; var exportCsvOptions = [ { propName: "encoding", type: "string", default: "UTF-8" }, { propName: "rowDelimiter", type: "string", default: "\r\n" }, { propName: "columnDelimiter", type: "string", default: "," }, { propName: "sheetIndex", type: "number", default: 0 }, { propName: "row", type: "number", default: 0 }, { propName: "column", type: "number", default: 0 }, { propName: "rowCount", type: "number", default: 200 }, { propName: "columnCount", type: "number", default: 20 }, ]; var FileType = { SJS: 'sjs', Excel: 'xlsx', SSJson: 'ssjson', Csv: 'csv', } function deepClone (obj) { return JSON.parse(JSON.stringify(obj)); } function getElementId (mode, fileType, propName) { return mode + '-' + fileType + '-' + propName; } function getFileType (file) { if (!file) { return; } var fileName = file.name; var extensionName = fileName.substring(fileName.lastIndexOf(".") + 1); if (extensionName === 'sjs') { return FileType.SJS; } else if (extensionName === 'xlsx' || extensionName === 'xlsm') { return FileType.Excel; } else if (extensionName === 'ssjson' || extensionName === 'json') { return FileType.SSJson; } else if (extensionName === 'csv') { return FileType.Csv; } } function mapExportFileType (fileType) { if (fileType === FileType.SSJson) { return GC.Spread.Sheets.FileType.ssjson; } else if (fileType === FileType.Csv) { return GC.Spread.Sheets.FileType.csv; } return GC.Spread.Sheets.FileType.excel; } function _getElementById(id) { return document.getElementById(id); } export class App extends Component { constructor(props) { super(props); this.spread = null; this.state = { selectedFile: null, openFileType: '', saveFileType: FileType.SJS, openOptions: { sjs: {}, ssjson: {}, xlsx: {}, csv: {}, }, saveOptions: { sjs: {}, ssjson: {}, xlsx: {}, csv: {}, } }; this.open = this.open.bind(this); this.save = this.save.bind(this); this.onSelectedFileChange = this.onSelectedFileChange.bind(this); this.onSaveFileTypeChange = this.onSaveFileTypeChange.bind(this); this.onPropChange = this.onPropChange.bind(this); } render() { return <div class="sample-tutorial"> <div class="sample-container"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => this.initSpread(spread)}> <Worksheet> </Worksheet> </SpreadSheets> </div> <div id="statusBar"></div> </div> <div className="options-container"> <div className="option-row"> <div class="inputContainer"> <input id="selectedFile" type="file" accept=".sjs, .xlsx, .xlsm, .ssjson, .json, .csv" onChange={this.onSelectedFileChange} /> <button class="settingButton" id="open" onClick={this.open}>Open</button> <div class="open-options"> {[ this.createOptions(openOptions, FileType.SJS, 'open'), this.createOptions(importXlsxOptions, FileType.Excel, 'open'), this.createOptions(importSSJsonOptions, FileType.SSJson, 'open'), this.createOptions(importCsvOptions, FileType.Csv, 'open'), ]} </div> </div> <div class="inputContainer"> <label for="saveFileType">FileType:</label> <select id="saveFileType" value={this.state.saveFileType} onChange={this.onSaveFileTypeChange}> <option value="sjs">SJS</option> <option value="xlsx">Excel</option> <option value="ssjson">SSJson</option> <option value="csv">Csv</option> </select> <button class="settingButton" id="save" onClick={this.save}>Save</button> <div class="save-options"> {[ this.createOptions(saveOptions, FileType.SJS, 'save'), this.createOptions(exportXlsxOptions, FileType.Excel, 'save'), this.createOptions(exportSSJsonOptions, FileType.SSJson, 'save'), this.createOptions(exportCsvOptions, FileType.Csv, 'save'), ]} </div> </div> </div> </div> </div>; } initSpread(spread) { this.spread = spread; //init Status Bar var statusBar = new GC.Spread.Sheets.StatusBar.StatusBar(document.getElementById('statusBar')); statusBar.bind(spread); } open() { var file = this.state.selectedFile; if (!file) { return; } var fileType = getFileType(file); var options = deepClone(this.state.openOptions[fileType]); if (fileType === FileType.SJS) { this.spread.open(file, function() {}, function() {}, options); } else { this.spread.import(file, function() {}, function() {}, options); } } save() { var fileType = this.state.saveFileType; var fileName = 'export.' + fileType; var options = deepClone(this.state.saveOptions[fileType]); if (fileType === FileType.SJS) { this.spread.save(function(blob) { saveAs(blob, fileName); }, function() {}, options); } else { if (fileType === FileType.Csv) { var { sheetIndex, row, rowCount, column, columnCount } = options; options.range = { sheetIndex: sheetIndex, row: row, rowCount: rowCount, column: column, columnCount: columnCount, }; } options.fileType = mapExportFileType(fileType); this.spread.export(function(blob) { saveAs(blob, fileName); }, function() {}, options); } } onSelectedFileChange(e) { let selectedFile = e.target.files[0]; let openFileType = getFileType(selectedFile); this.setState({ ...this.state, selectedFile, openFileType }); } onSaveFileTypeChange(e) { let saveFileType = e.target.value; this.setState({ ...this.state, saveFileType }); } onPropChange (mode, fileType, prop, e) { let element = e.target; var value; if (prop.type === 'boolean') { value = element.checked; } else if (prop.type === 'number') { value = +element.value; } else if (prop.type === 'string') { value = element.value; } else if (prop.type === 'select') { value = +element.value; } if (mode === 'open') { let openOptions = deepClone(this.state.openOptions); openOptions[fileType][prop.propName] = value; this.setState({...this.state, openOptions}); } else if (mode === 'save') { let saveOptions = deepClone(this.state.saveOptions); saveOptions[fileType][prop.propName] = value; this.setState({...this.state, saveOptions}); } } createOptions (options, fileType, mode) { let selectFileType = mode === 'open' ? this.state.openFileType : this.state.saveFileType; let display = selectFileType === fileType ? '' : 'none'; return <div className={fileType} style={{display}}> { options.map((prop) => this.createProp(mode, fileType, prop)) } </div>; } createProp (mode, fileType, prop) { let id = getElementId(mode, fileType, prop.propName); if (prop.type === 'select') { return <item className='item'> <label for={id}>{prop.displayText || prop.propName}</label> <select id={id} defaultValue={prop.default} onChange={(e) => this.onPropChange(mode, fileType, prop, e)}> { prop.options.map((p) => <option value={p.value}>{p.name}</option>) } </select> </item> } else if (prop.type === 'boolean') { return <item className='item'> <input id={id} type='checkbox' defaultChecked={prop.default} onChange={(e) => this.onPropChange(mode, fileType, prop, e)}></input> <label for={id}>{prop.displayText || prop.propName}</label> </item> } else if (prop.type === 'number') { return <item className='item'> <label for={id}>{prop.displayText || prop.propName}</label> <input id={id} type='number' defaultValue={prop.default} onChange={(e) => this.onPropChange(mode, fileType, prop, e)}></input> </item> } else { return <item className='item'> <label for={id}>{prop.displayText || prop.propName}</label> <input id={id} type='text' defaultValue={prop.default} onChange={(e) => this.onPropChange(mode, fileType, prop, e)}></input> </item> } } } ReactDOM.render(<App />, _getElementById('app'));
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ko/react/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/spread/source/js/FileSaver.js" type="text/javascript"></script> <!-- SystemJS --> <script src="$DEMOROOT$/ko/react/node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import('$DEMOROOT$/ko/lib/react/license.js').then(function () { System.import('./src/app'); }); </script> </head> <body> <div id="app"></div> </body> </html>
body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } #app { height: 100%; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-container { width: calc(100% - 280px); height: 100%; float: left; } .sample-spreadsheets { width: 100%; height: calc(100% - 25px); overflow: hidden; } #statusBar { bottom: 0; height: 25px; width: 100%; position: relative; } .options-container { float: right; width: 280px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .sample-options { z-index: 1000; } .inputContainer { width: 100%; height: auto; border: 1px solid #eee; padding: 6px 12px; margin-bottom: 10px; box-sizing: border-box; } .settingButton { color: #fff; background: #82bc00; outline: 0; line-height: 1.5715; position: relative; display: inline-block; font-weight: 400; white-space: nowrap; text-align: center; height: 32px; padding: 4px 15px; font-size: 14px; border-radius: 2px; user-select: none; cursor: pointer; border: 1px solid #82bc00; box-sizing: border-box; margin-bottom: 10px; margin-top: 10px; } .settingButton:hover { color: #fff; border-color: #88b031; background: #88b031; } .options-title { font-weight: bold; margin: 4px 2px; } #selectedFile { width: 180px; } #saveFileType { width: 120px; height: 31px; } .open-options .item { margin: 5px 0px; display: flex; } .save-options .item { margin: 5px 0px; display: flex; } label { margin-left: 3px; } select, input[type="text"], input[type="number"] { display: inline-block; margin-left: auto; width: 120px; font-weight: 400; outline: 0; line-height: 1.5715; border-radius: 2px; border: 1px solid #F4F8EB; box-sizing: border-box; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true, react: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-print': 'npm:@mescius/spread-sheets-print/index.js', '@mescius/spread-sheets-react': 'npm:@mescius/spread-sheets-react/index.js', '@mescius/spread-sheets-io': 'npm:@mescius/spread-sheets-io/index.js', '@mescius/spread-sheets-charts': 'npm:@mescius/spread-sheets-charts/index.js', '@mescius/spread-sheets-shapes': 'npm:@mescius/spread-sheets-shapes/index.js', '@mescius/spread-sheets-slicers': 'npm:@mescius/spread-sheets-slicers/index.js', '@mescius/spread-sheets-pivot-addon': 'npm:@mescius/spread-sheets-pivot-addon/index.js', '@mescius/spread-sheets-reportsheet-addon': 'npm:@mescius/spread-sheets-reportsheet-addon/index.js', '@mescius/spread-sheets-tablesheet': 'npm:@mescius/spread-sheets-tablesheet/index.js', '@mescius/spread-sheets-ganttsheet': 'npm:@mescius/spread-sheets-ganttsheet/index.js', '@mescius/spread-sheets-resources-ko': 'npm:@mescius/spread-sheets-resources-ko/index.js', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js', 'react': 'npm:react/umd/react.production.min.js', 'react-dom': 'npm:react-dom/umd/react-dom.production.min.js', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'jsx' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);