- 古い学校: RTF形式をキャンセルした人はいませんでしたが、私は個人的に、色とリンクの異なるフォントを使用してカラーテキストよりも難しいものを作成することはできませんでした。 この方法は効果的ですが、標準は最も簡単に理解できるものではなく、 最新バージョンを見るのも怖いです
- Silverlight / WPFの場合- 独自のFlowDocument形成。 オブジェクトモデルは、古い形式を手動で作成するよりも間違いなく便利ですが、オプションは太字の場合のみです
- Crystal Reportsなどのサードパーティソリューションは 、おそらくレポートを作成するための非常に強力なツールですが、これは常に必要なわけではありません。 さらに 、いくつかの追加ソフトウェア製品をプルすることも常に可能とは限りません1
- Microsoft Office Interopを使用します 。 いいえ、これはm笑です。 制御された環境でのメモリを使用した手動作業は、喜びの嵐のみを引き起こします 。 初心者プログラマーは、この仕事の原則を受け入れる前に、複数のコーヒーのパッケージを飲みます。
- HTMLの形成。 喜ばしいことに、この標準では、思いつくことができるCSSを使用して、中程度のフォーマットのドキュメントを作成できます。 短所-すべての要件を満たすドキュメントを作成することは非常に困難です。 しかし、これは必要がある場合です。 長所:標準のシンプルさと「クラウドとブラウザへの」普遍的な移行は、HTMLの開発を刺激します。
後者について話します。
最も簡単で明白なオプションは、HTML文字列を手動で生成することです。 プラットフォームに精通している人はすぐにStringオブジェクトの連結を開始し、ドキュメントを読む人はStringBuilderクラスに注意を払います。 いずれにしても、String.Formatは常にレポートを生成する最も便利な方法ではありません。 しかし、ASP.NET MVCを使用するプラットフォームの同僚は、 Razorプレゼンテーションエンジンを十分に活用できません。 ここで疑問が生じます。ASP.NETRazorのパワーを自分の目的に使用してみませんか?
まず、 System.Web.Razorアセンブリを接続する必要があります。 ASP.NET MVCによって提供されるため、ターゲットコンピューターにインストールされていない場合は、必要なdllのローカルコピーを処理する必要があります。
ビューを継承する基本クラスを宣言します。
public abstract class TemplateBase { public StringBuilder Buffer { get; set; } public StringWriter Writer { get; set; } public TemplateBase() { Buffer = new StringBuilder(); Writer = new StringWriter(Buffer); } public abstract void Execute(); // : "@foo.Bar" public virtual void Write(object value) { // Don't need to do anything special // Razor for ASP.Net does HTML encoding here. WriteLiteral(value); } // : "<p>Foo</p>" public virtual void WriteLiteral(object value) { Buffer.Append(value); } // ... - , Razor , }
まず、エンジンを初期化する必要があります。
private RazorTemplateEngine SetupRazorEngine() { // 1. , C# RazorEngineHost host = new RazorEngineHost(new CSharpRazorCodeLanguage()); // 2. , . , host.DefaultBaseClass = typeof(TemplateBase).FullName; // 3. host.DefaultNamespace = "RazorOutput"; host.DefaultClassName = "Template"; // 4. (using) host.NamespaceImports.Add("System"); // 5. return new RazorTemplateEngine(host); }
ご存知のように、.NETはコードのオンザフライでのコンパイルをサポートしています。 この機能は、Razorによって使用されます。 したがって、この場合、テンプレートを使用してファイルを読み取り、別のアセンブリに保存する必要があります。
// GeneratorResults razorResult = null; using (TextReader rdr = new StringReader( MyTemplatesString )) razorResult = _engine.GenerateCode(rdr); CSharpCodeProvider codeProvider = new CSharpCodeProvider(); // string outputAssemblyName = String.Format("Temp_{0}.dll", Guid.NewGuid().ToString("N")); CompilerResults results = codeProvider.CompileAssemblyFromDom( new CompilerParameters(new string[] { typeof(Form1).Assembly.CodeBase.Replace("file:///", "").Replace("/", "\\") }, outputAssemblyName), razorResult.GeneratedCode);
すべてがうまくいけば、使い方は簡単です:
Assembly asm = Assembly.LoadFrom(outputAssemblyName); if (asm == null) { MessageBox.Show(" "); } else { Type typ = asm.GetType("RazorOutput.Template"); if (typ == null) { MessageBox.Show(" RazorOutput.Template {0}", asm.FullName); } else { TemplateBase newTemplate = Activator.CreateInstance(typ) as TemplateBase; if (newTemplate == null) { MessageBox.Show(" RazorOutput.Template TemplateBase"); } else { // newTemplate // ... newTemplate.Execute(); string resultHTML = newTemplate.Buffer.ToString(); newTemplate.Buffer.Clear(); return resultHTML; // String, } } }
それだけです。 残っているのは、TemplateBaseを介して、またはフォームのRazor構文を介して、プレゼンテーションデータを指定する方法の問題です。
@functions { public string CustomerName { get; set; } public string ResetLink { get; set; } }
後者の場合、テンプレートの動的生成を放棄する必要がありますが、このデータにアクセスするのは非常に簡単です。
そのため、単純な動きの助けを借りて、MSの強力で便利なツールを使用して、「別の」テンプレートエンジンを記述する誘惑を回避しました。
1 .NET Frameworkで記述しているため、クライアントにインストールされていると想定されています。 しかし、Office、Crystal Reports、SQL Server、Visual Studio-必ずしもではありません