7

私は現在、データベースに保存されている値に基づいてレポートを生成することを主な役割とするコンソール アプリケーションをリファクタリングしています。

私が今までレポートを作成してきた方法は次のとおりです。

const string format = "<tr><td>{0, 10}</td><td>
                       {1}</td><td>{2, 8}</td><td>{3}</td><td>{4, -30}</td>
                       <td>{5}</td><td>{6}</td></tr>";

if(items.Count > 0)
{
    builder.AppendLine(
        String.Format(format, "Date", "Id", "WorkItemId", 
                      "Account Number", "Name", "Address", "Description"));
}

foreach(Item item in items)
{
    builder.AppendLine(String.Format(format, item.StartDate, item.Id,
                       item.WorkItemId, item.AccountNumber, 
                       String.Format("{0} {1}", 
                                     item.FirstName, item.LastName), 
                       item.Address, item.Description));
}

string report = String.Format("<html><table border=\"1\">{0}
                                     </table></html>",
                              builder.ToString());

(上記は単なるサンプルです...書式設定については申し訳ありません...横スクロールを必要としないように書式設定しようとしました....)

私は本当に私がこれをした方法が好きではありません。それは機能し、今のところ仕事をしています...しかし、私はそれが保守可能だとは思いません...特に、作成する必要があるhtmlに関してレポートがさらに複雑になる場合. さらに悪いことに、私のチームの他の開発者は、HTML レポートを生成するアプリケーション用に私のコードをコピー アンド ペーストし、ひどい混乱を引き起こす可能性があります。(私はすでにそのような恐怖が生み出されるのを見てきました!レポートの詳細を取得するために数百行のハードコードされた SQL を含むレポート関数を想像してみてください...それは大人の男を泣かせるのに十分です!)

しかし、私はこれがまったく好きではありませんが...私はそれを行う別の方法を考えることはできません.

確かにこれを行う方法があるに違いありません...私はそれを確信しています。少し前まで、aspx ページでテーブルを生成するときに同じことをしていましたが、オブジェクトをコントロールにバインドして .NET にレンダリングを任せることができることを誰かが親切に教えてくれました。上記のコードに似たひどいコードが、2 ~ 3 行のエレガントなコードに変わりました。

HTMLをハードコーディングせずに、このレポートのHTMLを作成する同様の方法を知っている人はいますか?

4

7 に答える 7

10

生データを含む XML ファイルを生成するアプリを作成します。次に、HTML を含む外部 XSLT をそれに適用します。

詳細: http://msdn.microsoft.com/en-us/library/14689742.aspx

于 2009-03-29T23:59:11.893 に答える
4

NVelocityなどのテンプレート エンジンを使用して、レポート ビューとコードを分離できます。おそらく他にもまともなテンプレートエンジンがあるでしょう...

于 2009-03-30T00:13:24.263 に答える
3

meziod - 熟読すべきもう 1 つの手段は、HtmlTextWriter オブジェクトの拡張メソッドです。まさにこのサイトで、まさにこれに見事な突き刺しを見つけました。

HtmlTextWriter 拡張機能

そこから大きな可能性を引き出すことができると確信しています...

よろしく - クーラ

于 2009-03-30T12:40:39.443 に答える
2

レポート フレームワークの 1 つ (Crystal、MS RDL など) を使用して html としてエクスポートすることもできますが、単純なデータの場合、現在のアプローチの方がオーバーヘッドが少ないと思います。XmlWriterまたは LINQ-to-XML (string.Formatエスケープを処理しない ではなく)を使用する可能性があります...

        new XElement("tr",
            new XElement("td", item.StartDate),
            new XElement("td", item.Id),
            new XElement("td", item.WorkItemId),

エスケープは、テキスト値 (名前、説明など) では特に重要です。

于 2009-03-29T23:54:42.577 に答える
1

http://www.stefansarstedt.com/templatemaschine.htmlなどの単純なテンプレート エンジンを使用して、テンプレートをコンテンツから分離することを検討してください。

これは非常に実用的で、再コンパイルせずにテンプレートを変更でき、テンプレートで C# の機能を引き続き利用できます。

于 2009-03-30T00:13:24.763 に答える
0

Microsoft SQL Reporting Servicesはこれを非常にうまく実行し、複数の形式を実行できます。

私の会社はこれを使用してPDFレポートを作成していますが、HIPAA要件があるため、サードパーティのPDFコントロールを介して自動的にパスワードを設定します...

于 2009-03-30T01:36:44.547 に答える