필터 범위 자동 확장

SpreadJS는 데이터를 추가하거나, 필터 범위 아래에서 복사-붙여넣기, 끌어서 채우기 및 끌어서 놓기 작업을 사용하여 필터 범위 자동 확장을 지원합니다.

AutoExtendFilterRange는 모든 null 값이 필터 범위 열에 있을 때까지 원점 필터 범위 아래로 필터 범위를 자동으로 확장합니다. AutoExtendFilterRange는 일반 워크 시트 필터에서만 작동하고 table/pivotTable/tableSheet 필터에서는 작동하지 않습니다. 기본값이 false(비활성화됨)인 allowAutoExtendFilterRange를 사용하여 필터 범위 자동 확장을 비활성화/활성화할 수 있습니다. allowAutoExtendFilterRange가 true이면 사용자는 rowFilter.extendedRange로 확장된 필터 범위를 가져올 수 있습니다.
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-resources-ko'; GC.Spread.Common.CultureManager.culture("ko-kr"); import { SpreadSheets } from '@mescius/spread-sheets-react'; const GCsheets = GC.Spread.Sheets; let spread = null; export function AppFunc() { const [isAllowAutoExtendFilterRange, setIsAllowAutoExtendFilterRange] = React.useState(false); const initSpread = (currSpread) => { spread = currSpread; spread.suspendPaint(); let sheet = spread.getActiveSheet(); var headerStyle = new GCsheets.Style(); headerStyle.font = "bold 11pt Calibri" sheet.setStyle(1, 1, headerStyle); sheet.setStyle(1, 2, headerStyle); sheet.setStyle(1, 3, headerStyle); sheet.setStyle(1, 4, headerStyle); sheet.setColumnWidth(1, 120); sheet.setColumnWidth(2, 120); sheet.setColumnWidth(3, 120); sheet.setColumnWidth(4, 120); sheet.getCell(1, 1).text("First Name"); sheet.getCell(1, 2).text("Last Name"); sheet.getCell(1, 3).text("Score"); sheet.getCell(1, 4).text("Position"); sheet.getCell(2, 1).text("Alexa"); sheet.getCell(2, 2).text("Wilder"); sheet.getCell(2, 3).text("90"); sheet.getCell(2, 4).text("Web Developer"); sheet.getCell(3, 1).text("Victor"); sheet.getCell(3, 2).text("Wooten"); sheet.getCell(3, 3).text("70"); sheet.getCell(3, 4).text(".NET Developer"); sheet.getCell(4, 1).text("Ifeoma"); sheet.getCell(4, 2).text("Mays"); sheet.getCell(4, 3).text("85"); sheet.getCell(4, 4).text("Sales Manager"); var basedFilterRange = new GCsheets.Range(2, 1, 2, 4); var rowFilter = new GCsheets.Filter.HideRowFilter(basedFilterRange); sheet.rowFilter(rowFilter); spread.resumePaint(); } const onAllowAutoExtendFilterRange = (e) => { if (spread) { try { let checked = !isAllowAutoExtendFilterRange; spread.options.allowAutoExtendFilterRange = checked; setIsAllowAutoExtendFilterRange(checked); } catch (ex) { alert(!!ex.message ? ex.message : ex); } } } return ( <div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => initSpread(spread)}> </SpreadSheets> </div> <Panel isAllowAutoExtendFilterRange={isAllowAutoExtendFilterRange} onAllowAutoExtendFilterRange={(e) => { onAllowAutoExtendFilterRange(e) }} /> </div> ); } function Panel(props) { return ( <div class="options-container"> <p>Change the state of allowAutoExtendFilterRange and open the filter dialog to see how the filter range extend works.</p> <div class="option-group"> <input type="checkbox" id="allowAutoExtendFilterRange" checked={props.isAllowAutoExtendFilterRange} onChange={(e) => { props.onAllowAutoExtendFilterRange(e) }} /> <label for="allowAutoExtendFilterRange">Allow Auto Extend Filter Range</label> </div> </div> ); }
import * as React from 'react'; import GC from '@mescius/spread-sheets'; import '@mescius/spread-sheets-resources-ko'; GC.Spread.Common.CultureManager.culture("ko-kr"); import { SpreadSheets } from '@mescius/spread-sheets-react'; const Component = React.Component; const GCsheets = GC.Spread.Sheets; export class App extends Component { constructor(props) { super(props); this.spread = null; this.state = { isAllowAutoExtendFilterRange: false }; } render() { return ( <div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => this.initSpread(spread)}> </SpreadSheets> </div> <Panel isAllowAutoExtendFilterRange={this.state.isAllowAutoExtendFilterRange} onAllowAutoExtendFilterRange={(e) => { this.onAllowAutoExtendFilterRange(e) }} /> </div> ); } initSpread(spread) { this.spread = spread; spread.suspendPaint(); let sheet = spread.getActiveSheet(); var headerStyle = new GCsheets.Style(); headerStyle.font = "bold 11pt Calibri" sheet.setStyle(1, 1, headerStyle); sheet.setStyle(1, 2, headerStyle); sheet.setStyle(1, 3, headerStyle); sheet.setStyle(1, 4, headerStyle); sheet.setColumnWidth(1, 120); sheet.setColumnWidth(2, 120); sheet.setColumnWidth(3, 120); sheet.setColumnWidth(4, 120); sheet.getCell(1, 1).text("First Name"); sheet.getCell(1, 2).text("Last Name"); sheet.getCell(1, 3).text("Score"); sheet.getCell(1, 4).text("Position"); sheet.getCell(2, 1).text("Alexa"); sheet.getCell(2, 2).text("Wilder"); sheet.getCell(2, 3).text("90"); sheet.getCell(2, 4).text("Web Developer"); sheet.getCell(3, 1).text("Victor"); sheet.getCell(3, 2).text("Wooten"); sheet.getCell(3, 3).text("70"); sheet.getCell(3, 4).text(".NET Developer"); sheet.getCell(4, 1).text("Ifeoma"); sheet.getCell(4, 2).text("Mays"); sheet.getCell(4, 3).text("85"); sheet.getCell(4, 4).text("Sales Manager"); var basedFilterRange = new GCsheets.Range(2, 1, 2, 4); var rowFilter = new GCsheets.Filter.HideRowFilter(basedFilterRange); sheet.rowFilter(rowFilter); spread.resumePaint(); } onAllowAutoExtendFilterRange(e) { let spread = this.spread; if (spread) { try { let checked = !this.state.isAllowAutoExtendFilterRange; spread.options.allowAutoExtendFilterRange = checked; this.setState({ isAllowAutoExtendFilterRange: checked }); } catch (ex) { alert(!!ex.message ? ex.message : ex); } } } } class Panel extends Component { constructor(props) { super(props); } render() { return ( <div class="options-container"> <p>Change the state of allowAutoExtendFilterRange and open the filter dialog to see how the filter range extend works.</p> <div class="option-group"> <input type="checkbox" id="allowAutoExtendFilterRange" checked={this.props.isAllowAutoExtendFilterRange} onChange={(e) => { this.props.onAllowAutoExtendFilterRange(e) }} /> <label for="allowAutoExtendFilterRange">Allow Auto Extend Filter Range</label> </div> </div> ); } }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta name="spreadjs culture" content="ko-kr" /> <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"> <!-- 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>
.sample { position: relative; height: 100%; overflow: auto; } .sample::after { display: block; content: ""; clear: both; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 280px); height: 100%; overflow: hidden; float: left; } .options-container { float: right; width: 280px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .option-row { font-size: 14px; padding: 5px; margin-top: 10px; } .option-group { margin-bottom: 6px; } label { display: inline-block; min-width: 90px; margin-bottom: 6px; } select { padding: 4px 6px; } p { padding: 0 0 12px; margin: 0; } .options-toggle { display: none; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } #app { height: 100%; }
(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-react': 'npm:@mescius/spread-sheets-react/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);