パート1 はじめに、スタイル
パート2 行、マークアップ
パート3 PL / SQLを介した編集
良い一日 XLSX形式に関する会話の3番目の部分が到着しました。 ファイルの内部デバイスから始めたのは偶然ではありませんでした。 それがどこにあり、どのように見えるかを理解していないので、なぜ私がこれとそれをしたのかを理解することは困難です。 さらに、いくつかのコメントを作成できるようになりました。
最初のもの。 必要な要素について言及しなかった場合は、空のXLSXファイルを作成し、必要な要素を作成して保存します。 これで、この要素を定義するコードを探す場所がわかりました。
二番目。 OpenXMLは、タグ構造に違反しない場合、マークアップ内の任意のテキストを許可します(これを非常に積極的に使用します)。 次に説明します。 これを行うことができます:
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> <si><t> </t></si> <si><t> </t></si> $ $ </sst>
しかし、このように-あなたはできません:
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> <si><t> </t></si> <si><t> </t></si> < > </sst>
しかし、ポイントに。 厳密に言えば、2つのケースが考えられます。 データを入力する必要がある特定のテンプレートがあるか、彼らが言うように、ゼロからファイルを作成する必要があります。 最初のケースはより単純で、2番目のケースはより興味深いものです。 ただし、この場合、どちらの場合もスタブファイルが必要です。.XLSXファイルは.XMLファイルだけで構成されているわけではないため、残念ながら「手」では機能しません。
一般に、私が使用する方法論は、主に
Alexandria PL / SQLライブラリに基づいてい
ます 。 ライブラリ自体は巨大であり、以下で説明する目的を除き、必要ない場合は、選択的に埋め込む方が良いでしょう。
購読者の領収書の形で簡単に代替するには、このライブラリに提示された資金で十分です。 詳細を考慮して、アドオンを追加する必要がありました。 したがって、読み始めたら、最後まで読むことをお勧めします。おそらく、私の解決策はあなたにとってより便利または効果的だと思うでしょう。 アクションの一般的なアルゴリズムは次のとおりです。
- BLOBでファイルの準備を変換します。
- XMLファイル内の条件付きラベルをデータで置き換えます。
- 変更したBLOBを新しいファイルとして保存します。
- 変更したファイルをユーザーに返します。
これらのポイントをさらに詳しく見ていきましょう。 ライブラリツールと汎用ツールを区別するために、ライブラリコードを投機パッケージ
lib_utilsに配置したと想像して
ください 。
ワークファイルをBLOBに変換します
購読者の名前と支払額を挿入する必要がある領収書などのフォームがある場合、すべては簡単ではありません。完成した領収書を取得し、変数フィールドの内容を特別なビーコンタグに変更します。 これらのビーコンのテキストに関する2つの基本的なルールがあります。タグを模倣してはならず、ドキュメントのソーステキストまたは置換テキストの偶然の可能性は無視できるほど小さいはずです。 そうでなければ、それはすべてあなたの想像力や習慣に依存します。
%name%のようなものを使用しています。 理由を説明します。 「%」記号はマークアップを模倣しておらず、この記号によってこの側でどこか別の単語が存在する可能性はごくわずかです。
ただし、出力ファイルに何が含まれているかが事前にわからない場合は、さらに作業が必要になります。
何よりもまず、Excelを使用して、必要なすべてのセルスタイルを指定することをお勧めします(必要ない場合は、大丈夫です。何か不足している場合よりも良いです)。 その後、メモ帳でノートブックに登り、特定のスタイルのインデックスを書き留めます。 そこで、見出し(灰色の塗りつぶし、太字のスペル、細い境界線)のスタイルと行の行(塗りつぶしなし、通常のスペル、細い境界線)のスタイルを別々にしました。
その後、Excelではなく、手で作業する必要があります。
sharedStrings.xmlファイルは次のようになります。
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> %strings% </sst>
ファイル
sheet1.xml (メインシートとして最初のシートがあると仮定)には、次が含まれている必要があります。
<sheetViews> <sheetView tabSelected="1" workbookViewId="0"> %attach% </sheetView> </sheetViews> <sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/> %colsize% <sheetData> %data% </sheetData> %filter%
ラベル
%attach%は、タグをエリアに取り付ける場所にあります。 ラベル
%colsize% -占有列の幅を示すタグの位置。 これは、たとえば、名前列の幅が適切になるように行われます。
%data%ラベルは、生成されたセルマークアップに置き換えられます。 ラベル
%filter% -オート
フィルターを埋め込む必要がある場合。
保存して閉じます-ディスクの準備ができました。 次に、それをBLOBに変換する必要があります。 これを行うには、ライブラリ関数
lib_utils.get_blob_from_fileが必要
です (
念のため、lib_utilsは投稿の冒頭のリンクからライブラリの関数であることを思い出させてください)。 この関数は、ディレクトリとファイル名の2つのパラメーターを取ります。 これは少し明白ではないので、ディレクトリはOracle DIRECTORYオブジェクトであることを説明します。 この例では、ディレクトリ
FILE_DIRを呼び出しましょう。 つまり、呼び出しは次のようになります。
ラベルをカスタムデータで置き換える
領収書フォームを使用した単純なケース(または同様のケース)では、
lib_utils.multi_replace関数を使用します。 ライブラリはあなたのためにすべてを行います。
難しい場合のために、私は自分の建設を構築しました。 これは、複合手書きデータタイプに基づいています。これは、Excelワークシートの内容の包括的な説明です。 タイプは複合型であるため、下から上へ行きましょう。
type tp_cell is record(address varchar2(15), style number, val varchar2(4000), lines number default 1); type tp_row is table of tp_cell index by binary_integer; type tp_table is table of tp_row index by binary_integer; type tp_string is table of varchar2(4000) index by binary_integer; type tp_number is table of number index by binary_integer;
後者のタイプは
tp_tableの構築に直接関与しませんが、とにかくまだ必要です。
tp_cell型の要素について説明します。
- addressは、セルの実際のアドレスです。 ここで何かを明確にする必要があります。 前の投稿へのコメントでは、実験の結果がレイアウトされており、セルを記述するときにアドレスを入力する必要がないことを示しています。 そうです。 ただし、私の意見では、通常、明示的は暗黙的よりも優れています。
- style-記述されたセルのスタイルインデックスへの参照。 私が説明したすべてのスタイルは、 custom_utilsパッケージのグローバル定数として保存されることにしました 。
- valはセルの内容です。
- lines-複数行のフラグ。 その値を2以上に設定すると、セルの内容に転送が暗黙的に含まれることを意味し、覚えているように、表示するにはセルの高さを増やします。
ファイル作成ルーチンの最終的な署名は次のようになります。
file_build(i_content tp_table, i_filename varchar2, i_filter number default 0, i_attach number default 0);
このプロシージャは、次のパラメータを取ります。
- i_content-将来のファイルのコンテンツ。
- i_filenameは、将来のファイルの名前です。
- i_filter-オートフィルターが必要かどうかのフラグ。
- i_attach-エリアを修正する必要があることを示すフラグ。 私の場合、最初の行のみを修正する必要があるため、このフラグのために生成されたコードは常に同じです。
そして、メイン手順の詳細な分析を開始する前に、補助機能をレイアウトします。
ヘルパー関数 function get_literal(i_number number) return varchar2 is begin
何かを明確にしたいだけです。 ファイルには大量のデータが含まれている可能性があるため、varcharに似たタイプを扱うことは不可能であり、単に十分ではありません。 したがって、CLOBの下で決定を明確にする必要があります。 一般的に、これまでのところ、超自然的なことは何もありません。 しかし、ポイントに。
基本手順 procedure build_file(i_content tp_table, i_filename varchar2, i_filter number default 0, i_attach number default 0) is v_blobsrc blob;
実際には、それだけです。 ええ、はい、私は予約をしたいです:この手順は現在のニーズに応じて定期的に補足されます。