1. はじめに レポート印刷は通常、経営情報システムの重要なモジュールであり、Excel はその強力な機能、柔軟なアプリケーション、および高い汎用性によりレポート印刷に広く使用されています。
初期の経営情報システムは基本的にクライアント/サーバー(C/S)モデルで開発されましたが、WWWの普及に伴い、現在の経営情報システムは徐々にC/Sモデルからブラウザ/サーバーモデルに移行し始めています。 (B/S)モード変更。 B/S モードには、よりオープンであること、ソフトウェアやハードウェアから独立していること、アプリケーションの拡張やシステムのメンテナンスとアップグレードに便利であることなど、従来の C/S モードにはない多くの機能があります。現在、B/S モードは推奨されるコンピューティング モードとなっています。企業ネットワーク向け 元々は C/S で使用されていましたが、インターネット上の多くのソフトウェアが B/S モードに移植され始めています。 B/S モードの特殊性により、C/S では比較的容易に実現できる Excel レポート印刷機能が、B/S では困難になってしまいます。この記事では、ASP を例として、実際のプロジェクトで要約された経験に基づいた、より一般的な方法を説明します。
2. 関数の実装 問題を説明するために、例を示します。システムプラットフォームはWindows 2000+SQL Server 2000+IIS 5.0+ASP 3です。レポートはExcelを使用します。所定のレポート形式に従って書籍販売統計レポートを生成し、印刷できることが必要です。
2.1 Excel レポート テンプレートの作成 まず、指定されたレポート形式に従って Excel テンプレート (つまり、印刷するレポートの形式) を作成します。もちろん、データベース内の動的統計から生成されたデータは空白のままにする必要があります。このレポートは最初に Excel で描画され、次にテンプレートとして保存され、ここに testbook1.xlt として保存されます。
2.2 Excel レポートの生成と印刷 ここでは Excel のアプリケーション コンポーネントが使用されます。Excel のインストール時にシステムにインストールされます。私たちの業務もこのコンポーネントを対象としています。
(1) Excel.Applicationオブジェクトの作成
set objExcel=CreateObject("Excel.Application")
(2) Excelテンプレートを開く
objExcel.Workbooks.Open(server.mappath("test")&"book1.xlt") 'Excel テンプレートを開く
objExcel.Sheets(1).select '作業ページを選択
setsheetActive=objExcel.ActiveWorkbook.ActiveSheet
(3) SheetActive.range("g4").value=date() などの Excel の通常の追加操作 ' ここで追加されるのは時間ですが、もちろん指定した任意のデータでも構いません。
(4) Excel でデータベースにレコードを追加します。SQL 操作によって生成された統計データを格納するデータセット adoRset がすでに存在しているものとします。
num=7 'Excelの7行目から開始
do until adoRset.EOF 'データセット内のデータが書き込まれるまでループします
strRange="d"&num&":f"&num 'コンテンツを埋める単位領域を設定します
sheetActive.range(strRange).font.size=10 'フォントサイズを設定します
SheetActive.range(strRange).WrapText=false 'テキストの折り返しを設定します
sheetActive.range(strRange).ShrinkToFit=true '表単位のサイズに自動適応するかどうかを設定します
sheetActive.range(strRange).value=array(adoRset("bookid"),adoRset("bookname"),adoRset("author")) 'データセット内のデータを対応する単位に埋め込みます
番号=番号+1
adoRset.MoveNext
ループ
(5) Excel 一時レポート ファイルの保存と処理 実際の運用では、ファイル名が固定されている場合、ユーザーがレポートを印刷するたびにファイル名を厳密に指定するのではなく、一時 Excel ファイルが使用されることに注意してください。最初のファイルのみが使用されます。生成が成功すると、同じ名前のファイルがすでに存在するため、後続の操作は失敗します。したがって、一時的で繰り返しのないファイル名を毎回生成する必要があります。ここでは、カスタム getTemporaryFile() 関数を使用してそれを生成し、それを変数 filename に保存し、変数 filepos を使用してこれらのパスを表します。一時ファイル。
さらに、これらの一時ファイルは処理されないと、時間の経過とともにファイルがゴミになってしまうため、各ユーザーが Excel レポートの印刷要求を送信するときは、一時ディレクトリ内に以前に生成されたすべての一時印刷ファイルを最初に削除する必要があります。
一時ファイルを処理するための主なコードは次のとおりです。
関数 getTemporaryFile(myFileSystem)
dimtempファイル、dotPos
tempFile=myFileSystem.getTempName
dotPos=instr(1,tempFile,".")
getTemporaryFile=mid(tempFile,1,dotPos)&"xls"
終了関数
set myFs=createObject("scripting.FileSystemObject")
filePos=server.mappath("test") & "tmp" '一時的な印刷ファイルを保存する一時ディレクトリ
fileName=getTemporaryFile(myFs) '一時ファイル名を取得します
myFs.DeleteFile filePos&"*.xls" 'このディレクトリに最初に生成されたすべての一時印刷ファイルを削除します
myFs=何も設定しない
Excel 一時ファイルの保存コードは次のとおりです。
objExcel.ActiveWorkbook.saveas ファイル位置&ファイル名
(6) Excelアプリケーションを終了する
objExcel.quit
set objExcel=なし
(7) Excel レポートの印刷 前の手順で Excel レポートが生成されました。次の手順で印刷する場合、次の 2 つの方法があります。
オプション 1: 上記で生成された Excel レポートの一時ファイルへのリンクをユーザーに提供します。ユーザーは、直接クリックしてブラウザーで Excel レポートを開き、ブラウザーの印刷機能を使用して印刷することもできます。印刷などはローカルで対応します。
オプション 2: Excel レポートを生成した後、クライアント側のブラウザに直接読み込みます。もちろん、完全に読み込まれていない場合は、「読み込み中です。お待ちください」などのメッセージが表示されます。
2.3 システム構成と注意事項 上記のコードは非常にシンプルですが、実際に使用するとエラーが発生することが多いため、以下のシステム構成と注意事項は非常に重要です。
(1) 上記のコード入力が正しいことを必ず確認してください。そうでないと、操作エラーが発生すると、Excel オブジェクトがメモリ内に残り、削除することが困難になり、次の呼び出しが非常に遅くなり、Windows エラーが生成されます。メモリの読み書きができないこと。現時点での解決策は、現在のユーザーからログアウトすることです。それがうまくいかない場合は、リセットするしかありません。
(2) 印刷機能を担うaspファイルのパーミッションを必ず設定してください。方法は次のとおりです。 IIS 管理で、asp ファイルを選択し、右クリックして [プロパティ]/[ファイル セキュリティ]/[匿名アクセスと認証制御] を選択します。ここでは、IIS はデフォルトで匿名アクセスに設定されているため、認証されたアクセスを選択する必要があります。これは基本認証です。両方の方法を使用して Windows 認証を統合できますが、前者は十分に安全ではありません)。これは非常に重要です。そうしないと、アプリケーションでエラーが発生します。
(3) レポートが複数のページに分かれている場合があり、各ページに同じヘッダーを付ける必要があります。これは Excel テンプレートで設定できます。方法は次のとおりです。 メニュー「ファイル」/「ページ設定」/「ワークシート」を選択し、「上部のタイトル行」にヘッダーの行数を入力します(たとえば、ヘッダーが 1 行目から 1 行目の場合)。 3、次のように入力します: $1:$3 )。
3.要約すると、ASP で記述された B/S モードでの EXCEL レポートの生成と印刷の例を示しましたが、これは実際によく適用されています。この例のコードを書くのは難しくありませんが、システム構成に注意を払う必要があることも事実によって証明されています。これは、数え切れないほどの失敗を経て得られた経験でもあります。