パスワード設定

SpreadJSファイル機能は、Excelファイルのインポートやエクスポート時にパスワードを設定することができます。

SpreadJSファイル機能は、インポートおよびエクスポート時にパスワードを使用してファイルの暗号化および復号化をサポートしています。 エクスポートサンプル: インポートサンプル GC.Spread.Sheets.IO.ErrorCodeはエラーコードを定義します。
const $ = selector => document.querySelector(selector); const listen = (host, type, handler) => host.addEventListener(type, handler); window.onload = function () { let spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss")); const importPassword = $('#importPassword'); const selectBtn = $('#selectBtn'); const fileSelect = $('#selectedFile'); const importBtn = $('#importBtn'); const warningBox = $('#warningBox'); const exportPassword = $('#exportPassword'); const exportBtn = $('#exportBtn'); listen(selectBtn, "click", () => fileSelect.click()); const fileSelectedHandler = () => { importPassword.disabled = false; importBtn.disabled = false; } listen(fileSelect, 'change', fileSelectedHandler); const wrongPasswordHandler = message => { importPassword.setAttribute('warning', true); importPassword.style.animation = "shake 0.5s"; setTimeout(() => importPassword.style.animation = "", 500); warningBox.innerText = message; importPassword.value = ''; }; listen(importPassword, 'focus', () => { warningBox.innerText = ''; importPassword.removeAttribute('warning'); }); const importFileHandler = () => { let file = fileSelect.files[0]; if (!file) return ; spread.import(file, console.log, error => { if (error.errorCode === GC.Spread.Sheets.IO.ErrorCode.noPassword || error.errorCode === GC.Spread.Sheets.IO.ErrorCode.invalidPassword ) { wrongPasswordHandler(error.errorMessage); } }, { fileType: GC.Spread.Sheets.FileType.excel, password: importPassword.value }); }; listen(importBtn, 'click', importFileHandler); const exportFileHandler = () => { let password = exportPassword.value; spread.export(blob => saveAs(blob, (password ? 'encrypted-' : '') + 'export.xlsx'), console.log, { fileType: GC.Spread.Sheets.FileType.excel, password: password }); }; listen(exportBtn, 'click', exportFileHandler); };
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta name="spreadjs culture" content="ja-jp" /> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-io/dist/gc.spread.sheets.io.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-shapes/dist/gc.spread.sheets.shapes.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-charts/dist/gc.spread.sheets.charts.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-slicers/dist/gc.spread.sheets.slicers.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-pivot-addon/dist/gc.spread.pivot.pivottables.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-reportsheet-addon/dist/gc.spread.report.reportsheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-tablesheet/dist/gc.spread.sheets.tablesheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-ganttsheet/dist/gc.spread.sheets.ganttsheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-resources-ja/dist/gc.spread.sheets.resources.ja.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/FileSaver.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div class="sample-tutorial"> <div class="sample-container"> <div id="ss" class="sample-spreadsheets"></div> <div id="statusBar"></div> </div> <div class="options-container"> <div class="option-row"> <div class="inputContainer"> <div class="options-title">インポート:</div> <input class="passwordIpt" id="importPassword" type="password" placeholder="Password" disabled> <br> <div id="warningBox"></div> <input id="selectedFile" type="file" accept=".xlsx" /> <button class="settingButton" id="selectBtn">ファイルを選択</button> <button class="settingButton" id="importBtn" disabled>インポート</button> </div> <div class="inputContainer"> <div class="options-title">エクスポート:</div> <input class="passwordIpt" id="exportPassword" type="password" placeholder="Password"> <br> <button class="settingButton" id="exportBtn">エクスポート</button> </div> </div> </div> </div> </body> </html>
html, body { height: 100%; margin: 0; } body { position: absolute; inset: 0; color: #1f2933; background: #f7f8fa; } .sample-tutorial { display: flex; height: 100%; overflow: hidden; } .sample-container { display: flex; flex: 1 1 auto; flex-direction: column; min-width: 0; height: 100%; } .sample-spreadsheets { flex: 1 1 auto; min-height: 0; width: 100%; overflow: hidden; } #statusBar { flex: 0 0 25px; width: 100%; height: 25px; } .options-container { flex: 0 0 320px; width: 320px; height: 100%; padding: 22px 20px; box-sizing: border-box; overflow: auto; background: #ffffff; border-left: 1px solid #e5e7eb; } .inputContainer { padding: 0 0 22px; margin: 0 0 22px; border-bottom: 1px solid #eef0f3; } .inputContainer:last-child { padding-bottom: 0; margin-bottom: 0; border-bottom: 0; } .options-title { margin: 0 0 14px; color: #111827; font-size: 18px; font-weight: 650; line-height: 1.25; } .settingButton { display: inline-flex; align-items: center; justify-content: center; width: 100%; height: 34px; margin: 10px 0 0; padding: 0 14px; color: #fff; font: inherit; font-weight: 600; text-align: center; white-space: nowrap; background: #2563eb; border: 1px solid #2563eb; border-radius: 6px; box-sizing: border-box; cursor: pointer; } .settingButton:hover { background: #1d4ed8; border-color: #1d4ed8; } .settingButton:disabled { color: #8a93a3; background: #edf0f4; border-color: #edf0f4; cursor: not-allowed; } #selectedFile { display: none; } select, input[type="text"], input[type="number"], input[type="password"] { width: 100%; height: 34px; padding: 0 10px; color: #111827; font: inherit; background: #ffffff; border: 1px solid #d8dde5; border-radius: 6px; box-sizing: border-box; outline: none; transition: border-color .15s ease, box-shadow .15s ease; } select:focus, input[type="text"]:focus, input[type="number"]:focus, input[type="password"]:focus { border-color: #2563eb; box-shadow: 0 0 0 3px rgba(37, 99, 235, .12); } .passwordIpt { margin-top: 0; } .passwordIpt[warning="true"], .passwordIpt.warning { border-color: #dc2626; } .passwordIpt[warning="true"]::placeholder, .passwordIpt.warning::placeholder { color: #dc2626; opacity: .8; } #warningBox { min-height: 18px; margin: 8px 0 0; color: #dc2626; font-size: 12px; line-height: 1.5; } @keyframes shake { 0% { transform: translate(1px, 1px) rotate(0deg); } 10% { transform: translate(-1px, -2px) rotate(-1deg); } 20% { transform: translate(-3px, 0) rotate(1deg); } 30% { transform: translate(3px, 2px) rotate(0deg); } 40% { transform: translate(1px, -1px) rotate(1deg); } 50% { transform: translate(-1px, 2px) rotate(-1deg); } 60% { transform: translate(-3px, 1px) rotate(0deg); } 70% { transform: translate(3px, 1px) rotate(-1deg); } 80% { transform: translate(-1px, -1px) rotate(1deg); } 90% { transform: translate(1px, 2px) rotate(0deg); } 100% { transform: translate(1px, 1px) rotate(0deg); } } @media (max-width: 760px) { .sample-tutorial { flex-direction: column; } .sample-container { min-height: 55%; } .options-container { flex: 0 0 45%; width: 100%; height: 45%; border-top: 1px solid #e5e7eb; border-left: 0; } }