Vue ベースの Excel 解析とエクスポートの詳細な説明

Vue ベースの Excel 解析とエクスポートの詳細な説明

序文

最近、日々の開発に関わる業務要件を整理していたところ、開発ではよくある 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 をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue フロントエンドでバックエンドから返された Excel ファイルをエクスポートする方法
  • VueはバックエンドインターフェースにExcelテーブルをエクスポートするよう要求します
  • js-xlsx を使用して Vue で Excel をエクスポートする方法
  • VueはExcelデータをエクスポートするパブリック関数メソッドをカプセル化します
  • Vue フロントエンドの Excel ファイルのエクスポートの詳細な実装計画
  • Vue を使用して Excel をエクスポートする際の落とし穴と解決策

<<:  MySQL の連結で複数の一重引用符と三重引用符を使用する際の問題

>>:  Docker.v19 で Docker Compose オーケストレーション ツールをインストールして構成する方法

推薦する

nginx をベースにリロードなしでアップストリーム サーバーの動的な自動起動と停止を実装する方法

目次1. Consulクラスタをデプロイする1. 準備3. Consulクラスタを作成する4. 管理...

Linux システムでの vim プラグインのインストールの概要

目次vimプラグインマネージャーをインストールするプラグインデモを追加プラグインを削除するには: v...

Vue は書籍管理ケースを実装します

この記事では、書籍管理を実装するためのVueの具体的なコードを例として紹介します。具体的な内容は次の...

レンダリング関数と JSX の詳細

目次1. 基本2. ノード、ツリー、仮想DOM 1. 仮想DOM 3. createElementパ...

MySQL 8.0.19 では、間違ったパスワードを 3 回入力するとアカウントがロックされるようになりました (例)

MySQL 8.0.19 では、間違ったパスワードを 3 回入力するとアカウントがロックされるよう...

MySQLはテーブル内のフィールドを別のテーブル内のフィールドの値と等しくなるように更新します

以下のように表示されます。 table1 を z として更新し、table2 を zb として結合し...

CSSは親要素の下の最初の子要素を選択します(:first-child)

序文最近、プロジェクトで :first-child を使用したのですが、すぐに思いつきました。これは...

SSDストレージを有効にしたMySQLインスタンスの詳細な説明

SSDストレージを有効にしたMySQLインスタンスの詳細な説明特に OS と MySQL が同じディ...

見栄えの良い CSS カスタム スタイル (タイトル h1 h2 h3)

レンダリングBlog Gardenでよく使われるスタイル /*タイトル h1 h2 h3 スタイル*...

JS を使用して要素が配列であるかどうかを判断する例

検証できるデータの種類は次のとおりです a = [1,2,3,4,5,6]とします。 b = [とし...

SecureCRT に基づくリモート Linux ホストへのファイルのアップロードとダウンロードのグラフィカルな手順

wget や curl ツールを使用して、Linux サーバーで大規模なネットワーク ファイルを直接...

MySQL マスタースレーブレプリケーションの役割と動作原理の詳細な説明

1. マスタースレーブレプリケーションとは何ですか?マスタースレーブレプリケーションは、スレーブデー...

複数の条件を持つ MySQL クエリ メソッド

複数の条件を持つ MySQL クエリ環境: MySQL 5.7 where ステートメントに複数の ...

HTML における src と href の違いについての簡単な説明

簡単に言うと、srcは「このリソースをロードしたい」という意味で、hrefは「このリソースに関連付け...

MySQL データベースのマスター・スレーブ レプリケーションと読み取り/書き込み分離

目次1. マスタースレーブレプリケーションマスタースレーブレプリケーション3スレッドマスタースレーブ...