序文最近、日々の開発に関わる業務要件を整理していたところ、開発ではよくある Excel の解析とアップロードについてふと思いつきました。週末を利用して整理して学習してみようと思います。 基本的な紹介主にVue +要素に基づいてファイルの解析とエクスポートを実装します。使用するプラグインはxlsxです。その中の具体的な方法は、興味があれば勉強してください。基本的なスタイルと構成は繰り返されず、比較的簡単です。すぐに主食に行きましょう コードの実装基本構造ユーザーがファイルのアップロードをクリックすると、ExcelテーブルがJSON形式でページに表示されます。ユーザーは操作を実行し、データを確認し、サービスに送信します。アップロード操作では、要素のアップロードコンポーネントを使用します。 <!-- ファイルのアップロード ボタン --> <div class="buttonBox"> <el-アップロード アクション 受け入れる = ".xlsx、.xls" :自動アップロード="false" :ファイルリストを表示="false" :on-change="ハンドル" > <el-button type="primary" slot="trigger">EXCEL ファイルを選択</el-button> </el-アップロード> <el-button type="success" @click="submit" :disabled="disable">データを収集して送信</el-button> </div> <!-- 解析されたデータ--> <div class="tableBox" v-show="表示"> <h3> <i class="el-icon-info"></i> 収集されたデータは次のとおりです。正しいことを確認した後、「収集したデータを送信」ボタンをクリックしてサーバーにアップロードしてください。 </h3> <el-table :data="tempData" style="width: 100%" :height="height" border> <el-table-column prop="name" label="名前" min-width="50%"></el-table-column> <el-table-column prop="phone" label="電話" min-width="50%"></el-table-column> </el-table> </div> アップロード分析アップロードされたファイルストリームは、アップロードコンポーネントを通じて取得できます(下の図を参照)。 ファイルストリームをバイナリに変換します。ここで、対応するメソッドを utils ファイルに追加できます (次のように) // バイナリ形式でファイルを読み込む export function readFile(file) { 新しいPromiseを返します(resolve => { リーダーを新しいFileReader()にします。 reader.readAsBinaryString(ファイル); リーダー.onload = ev => { ev.target.result を解決します。 }; }); } バイナリをxlsx経由でjsonに変換して表示できるようにします //FILE内のデータを読み取り(JSON形式に変換) データ = readFile(ファイル) を待機します。 workbook = xlsx.read(data, { type: "binary" }) とします。 ワークシート = workbook.Sheets[workbook.SheetNames[0]]; データ = xlsx.utils.sheet_to_json(ワークシート); // 結果を印刷し、次の図を追加します console.log(workbook); 読み取ったデータをサーバーに渡せるデータに変換するには、バックエンドに渡される形式に対応するマッピングテーブルをカプセル化する必要があります(以下を参照)。 // フィールド対応表エクスポートlet character = { 名前: { テキスト: "名前", タイプ: '文字列' }, 電話: テキスト: "電話", タイプ: '文字列' } }; データ形式の変換 arr = [] とします。 データ.forEach(アイテム => { obj = {} とします。 for (let key in 文字) { if (!character.hasOwnProperty(key)) break; v = 文字[キー]とします。 テキスト = v.text、 タイプ = v.type; v = 項目[テキスト] || ""; 型 === "文字列" ? (v = String(v)): null; 型 === "number" ? (v = Number(v)): null; obj[キー] = v; } arr.push(obj); }); サーバーに送信 ここで、サーバーが複数のファイルをまとめて送信できるかどうかを確認する必要があります。サポートされていない場合は、フロントエンドで再帰送信メソッドを使用して、ファイルを 1 つずつ送信できます。特定の状況では、バックエンドと通信できます。ここでは再帰送信を使用します。 //サーバーにデータを送信する async submit() { (this.tempData.length <= 0)の場合{ this.$メッセージ({ メッセージ: 「まず EXCEL ファイルを選択してください!」 タイプ:「警告」、 表示閉じる: true }); 戻る; } これを無効にします。 loadingInstance = Loading.service({ テキスト: 「親愛なるあなた、少々お待ちください。私は懸命に対処中です!」 背景: "rgba(0,0,0,.5)" }); // 完了後に行う処理 let complate = () => { this.$メッセージ({ メッセージ: 「親愛なるあなたへ、データをアップロードしました!」 タイプ: "成功", 表示閉じる: true }); this.show = false; これを無効にします。 ロードインスタンスを閉じます。 }; // データを 1 つずつサーバーに渡す必要があります。let n = 0; 送信を非同期() => { (n > this.tempData.length - 1) の場合 { // すべて complate() に合格しました。 戻る; } 本文を this.tempData[n] とします。 // インターフェイスを実行します。let result = await createAPI(body); (parseInt(結果コード)=== 0)の場合{ // 成功 n++; } 送信(); }; 送信(); } 以上がExcelファイルの解析とアップロードの概要です。実はそれほど難しいことではありません。これらは日常の開発でよく行われる業務です。次にExcelエクスポートについて見ていきましょう。 Excelエクスポート基本構造ページに入るとすぐに、アップロードしたファイルを取得し、それをテーブルに表示し、ページを作成します...これらについては説明しません。まずはExcelエクスポートボタンをクリックしてページ構造を見てみましょう。 <div class="コンテナ"> <!-- アップロード ボタン --> <div class="buttonBox"> <router-link to="/upload"> <el-tooltip content="EXCEL データ収集" placement="top"> <el-button type="primary" icon="el-icon-edit" 円></el-button> </el-tooltip> </ルーターリンク> </div> <!-- 検索エリア --> <div class="検索ボックス"> <el-input v-model="search" placeholder="名前と携帯電話に基づくあいまい検索" @change="searchHandle"></el-input> <el-button type="success" @click="submit" :disabled="disabled">選択したデータをエクスポート</el-button> </div> <!-- リストエリア --> <div class="tableBox"> <el-テーブル :data="テーブルデータ" :height="高さ" スタイル="幅: 100%" v-loading="読み込み中" element-loading-text="お嬢様、読み込みに一生懸命取り組んでいます..." @selection-change="選択変更" > <el-table-column type="selection" width="50" align="center"></el-table-column> <el-table-column prop="id" label="数値" min-width="10%"></el-table-column> <el-table-column prop="name" label="名前" min-width="20%"></el-table-column> <el-table-column prop="phone" label="電話" min-width="20%"></el-table-column> <el-table-column prop="time" label="作成時間" min-width="25%" :formatter="フォーマッタ"></el-table-column> </el-table> </div> <!-- ページング領域 --> <div class="pageBox"> <el-ページネーション 背景 単一ページで非表示 layout="total, sizes, prev, pager, next" :page-size="ページサイズ" :current-page="ページ" :total="合計" @size-change="サイズ変更" @current-change="前へ次へ" @prev-click="前へ次へ" @next-click="前へ次へ" </el-pagination> ... </div> </div> Excel にエクスポートjson データをシート データに変換し、新しいテーブルを作成し、テーブルにシートを挿入し、xlsx の writeFile メソッドを使用してファイルをテーブルに書き込みます。 // データをエクスポートする submit() { if (this.selectionList.length <= 0) { this.$メッセージ({ メッセージ: 「まずエクスポートしたいデータを選択してください!」 タイプ:「警告」、 表示閉じる: true }); 戻る; } this.disabled = true; loadingInstance = Loading.service({ テキスト: 「親愛なるあなた、少々お待ちください。私は懸命に対処中です...」 背景: "rgba(0,0,0,.5)" }); arr = this.selectionList.map(item => { とする 戻る { ID: アイテム.id、 名前: アイテム名、 電話番号: item.phone }; }); // jsonデータをシートデータに変換する let sheet = xslx.utils.json_to_sheet(arr), // 新しいテーブルを作成します book = xslx.utils.book_new(); //テーブルにシートを挿入する xslx.utils.book_append_sheet(ブック、シート、"sheet1"); // xlsx の writeFile メソッドを使用してファイルを書き込みます xslx.writeFile(book, `user${new Date().getTime()}.xls`); ロードインスタンスを閉じます。 this.disabled = false; } **上記はExceleの関連操作です。ファイルのアップロードと解析は一般的な要件です。大容量ファイルのアップロードと電源オフ再開に興味がある場合は、私の記事「大容量ファイルのアップロードとブレークポイント再開」を参照してください。 要約するVue をベースに Excel 解析およびエクスポート機能を実装するこの記事はこれで終わりです。Vue Excel 解析およびエクスポートに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQL の連結で複数の一重引用符と三重引用符を使用する際の問題
>>: Docker.v19 で Docker Compose オーケストレーション ツールをインストールして構成する方法
序文CSS グリッドは通常、さまざまなフレームワークにバンドルされていますが、実際のビジネス ニーズ...
1. フローティングとは何ですか?フローティングは、その名の通り、浮遊することを意味します。要素がド...
方法1: SET PASSWORDコマンドを使用する mysql> username@loca...
目次序文1. 基本データ2. 継承駆動設計3. 左右の値のエンコーディングに基づく設計4. ツリー構...
この記事はCentOS 7.3システム環境をベースに、MySQLとRedisのインストールと使用につ...
問題現象最近、sysbench を使用して MySQL をテストしました。テストに長い時間がかかった...
序文この記事では主にMySQLでトランザクションを開始する方法について紹介します。関連情報については...
textarea の形式は保存時にデータベースに保存できますが、表示時には /n と相互に変換できな...
Docker はコンテナを作成するときに、デフォルトでブリッジ ネットワークを使用し、IP アドレス...
HTML のセマンティクスはありふれた問題のようです。Google で検索すると、セマンティクスに関...
この記事の冒頭で、以前書いた入門記事の間違いを訂正したいと思います。初心者を再び誤解させないように、...
目次1. 説明2. 関連する依存パッケージをダウンロードする3. 設定ファイル .eslintrc....
この記事では、州、市、地区のドロップダウンリストのリンクを実現するためのJS + AJAXの具体的な...
インデックスのマージは、MySQL が最下層で提供するインテリジェントなアルゴリズムです。インデック...
目次1. イベントのリスニング2. イベントパラメータを渡す3. イベント修飾子ケース1: クリック...