JS を使用してクリップボード内の Excel コンテンツを解析する方法

JS を使用してクリップボード内の Excel コンテンツを解析する方法

序文

今回は昨晩思いついたアイデアを記録しました。Excel の内容をクリップボードにコピーし、必要な JSON 形式に変換するというものです。核となるのは、Excel の内容を JSON に変換することです。この部分は主に Excel 形式と JSON がビジネスにどのようにマッピングされるかによって決まるため、ここでは詳しく説明しません。しかし、実践を通して、クリップボードに関するいくつかの知識を得ることができました。

注: これは自分のガジェット実装用なので互換性は考慮せず、Chromeで実践しています

全体の手順は次のとおりです。

  • コンテンツを含む Excel ファイルから、コンテンツを選択し、Ctrl + C を押してクリップボードにコピーします (コンテンツはテーブル全体であるため、Ctrl + A でコンテンツを選択できます)
  • ウェブページに貼り付けると、js は貼り付けイベントをリッスンし、クリップボード オブジェクトからコピーされた Excel コンテンツ (形式を含む) を取得します。
  • コンテンツを独自の形式に解析する [拡張補足]

ここでの主なポイントは 3 つあります。

1. イベントとクリップボードを貼り付ける

document.addEventListener('貼り付け', イベント => {
    // イベント内のclipboardDataオブジェクト console.log(event.clipboardData)
})

貼り付けイベントがトリガーされると、イベントからclipboardDataを取得できます。

ただし、window.clipboardData も使用されています。Chrome と codepen で試してみましたが、コンテンツを取得できませんでした。

2. クリップボード内のコンテンツ形式

前の部分のコードがコンソールに出力されると、困惑するでしょう。コンソールには DataTransfer オブジェクトが出力されますが、実際には、このオブジェクトがコンソールで展開されると、属性に値がないか、空の配列になっているため、非常に混乱します。

コンソールのプロパティ コンテンツを調べて初めて、それを見つけました。

このオブジェクトでは、getData はデータ コンテンツを取得するために使用される共通メソッドです。DOMString パラメータを受け入れる必要があります。

よく使われる方法は、getData('text') を呼び出して取得できるプレーンテキストを貼り付けることです。

しかし、私が欲しいのはExcel形式です。最初はExcel形式が何なのか分かりませんでしたが、ExcelからコピーしてExcelに貼り付けると、形式が保持されたままだったので、クリップボードには元のコンテンツの形式が保持されているはずだと思い、試してみました。

DataTransferオブジェクトのtypes属性を走査して出力することで、

document.addEventListener('貼り付け', イベント => {
      イベント.クリップボードデータ.タイプ.マップ(タイプ=>{console.log(タイプ)})
})

タイプには3つの値があります: text/plain、text/html、Files

そこで、タイプ「text/html」を使用してgetDataを試したところ、確かにフォーマットされたコンテンツが取得されました。これは実際には次のHTMLコードの文字列です。

<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
<ヘッド>
<meta http-equiv=コンテンツタイプコンテンツ="text/html; charset=utf-8">
<スタイル>
...
<テーブル>
...

観察すると、必要なコンテンツは HTML コード内のテーブルであることがわかります。その後、形式を変換するのは簡単です。HTML 文字列を解析し、セレクターを使用してセル コンテンツを取得するだけです。

3. HTML文字列を解析する方法

これには本当に時間がかかりましたが、その後、HTML 文字列の解析をもともとサポートしている DOMParser を見つけました>>

(new DOMParser()).parseFromString を使用して文字列を DOM に変換します。

定数html = event.clipboardData.getData('text/html');
定数 $doc = 新しい DOMParser().parseFromString(html, 'text/html');
// すべての行を読み込みます const $trs = Array.from($doc.querySelectorAll('table tr'));

その後、問題なく querySelectorAll を実行できます。

上記は、JS を使用してクリップボード内の Excel コンテンツを解析する方法の詳細です。クリップボード内の Excel コンテンツを JS で解析する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • JSは巧みにクリップボードデータを取得し、Excelデータを貼り付けます
  • JavaScript でコンテンツをクリップボードにコピーする一般的な 2 つの方法
  • JS クリップボード操作のコード詳細説明
  • JSはコンテンツをクリップボードにコピーする機能を実装します
  • jsはクリップボードにコピーする(共有する)さまざまな方法を実装します
  • js コンテンツをクリップボードにコピーするコード、js コピーコードの簡単な例
  • JSはクリップボードの内容を取得するメソッドを実装します
  • JS はコンテンツをクリップボードにコピーする機能を実装しており、すべてのブラウザと互換性があります (推奨)
  • JavaScript を使用してコンテンツをクリップボードにコピーまたは切り取る方法

<<:  Windows で mysql5.7.21 をインストールするための詳細なチュートリアル

>>:  1 つの記事で Nginx の現在の制限を理解する (簡単な実装)

推薦する

MySql データベースにリモートでログインするにはどうすればよいですか?

はじめに: プロジェクトを開発するために、サーバーに MySql データベース サーバーを展開し、ロ...

HTML 学習ノート - HTML 構文の詳細な説明 (必読)

1. HTML マークアップ言語とは何ですか? HTML は、Web ページの情報を表すマークアッ...

VMware に Linux システム (Redhat8) と仮想マシンのネットワーク構成をインストールする方法

目次1. VMwareをインストールする1.1 VMwareworkstationsをダウンロードし...

JavaScript におけるイベント委譲メカニズムと深いコピーと浅いコピーの簡単な分析

目次1. イベントの委任イベントバブリングイベントキャプチャイベントの泡立ちの昇華考える2. 深いコ...

ウェブデザインとは何か

<br />元の記事: http://www.alistapart.com/articl...

MySQLクエリキャッシュの簡単な使い方の詳細な説明

目次1. クエリキャッシュの実装プロセス2. クエリキャッシュを構成する3. クエリキャッシュを有効...

CSSは座席選択効果を実現するためにautoflow属性を使用する

1. 自動フロー属性、要素コンテンツの長さと幅が要素自体の長さと幅を超える場合、スクロールバーが表示...

Vueは秒殺しのカウントダウンコンポーネントを実装する

この記事では、2番目のキルカウントダウンコンポーネントを実装するためのVueの具体的なコードを参考ま...

jsはショッピングサイトの虫眼鏡機能を実現します

この記事では、ショッピングサイトの虫眼鏡機能を実現するためのjsの具体的なコードを紹介します。具体的...

Centos7 システムでの MySQL マスター スレーブ同期構成スキーム

序文最近、高可用性プロジェクトに取り組む際には、データの同期が必要になっています。ノードが 2 つし...

jQueryはアコーディオンの小さなケースを実装します

この記事では、アコーディオンを実装するためのjQueryの具体的なコードを参考までに紹介します。具体...

VMwareがwin10ホームバージョンに64ビットオペレーティングシステムをインストールできない問題を解決します

問題の説明VMware Workstationが新しい仮想マシンを作成し、64ビットオペレーティング...

Vueの監視方法のケースの詳細な説明

Vueでの監視方法時計知らせ名前: 監視する属性に同じ名前を付ける必要があります。 1. 機能Vue...

MySQL に接続する際に Navicat for MySQL が 2005 エラーを報告する問題を解決する

前回の記事では、Navicat for Mysql 接続エラー 1251 (接続失敗) の問題を解決...

Linux で g++ を使用してプログラムをコンパイルする際の -I (大文字の i)、-L (大文字の l)、-l (小文字の l) の機能の詳細な説明

初心者の Linux ユーザーとして、私は単純なgcc/g++操作を何度も使用してきましたが、少し複...