WPF開発(三)---Wordブックマークに基づくXPSレポートを記録する
5220 ワード
レポートを作成するには多くのシナリオがあります.ここには、Wordを使用してテンプレートを作成し、動的コンテンツにブックマークを追加し、プログラムを介してXPSという接尾辞のファイルとして保存するC#版のレポートシナリオが記録されています.どうしてXPSのレポートを要して、第1はWin 7以上のシステムがすべて持参するためで、XPのインストールも比较的に便利で、第2のレポートの効果はとてもきれいで、また署名を设置することができます.
Wordはテンプレートを作成し、ブックマークを追加します.
Wordテンプレート処理ツールを提供します.具体的な考え方は、
1.パスに従ってモジュールを開き、一時ファイルを作成します.Wordプログラムは元のテンプレートを直接操作し、テンプレートの構造を変更するので、まず存在するかどうかをチェックし、存在する場合は削除してから元のテンプレートと一時ファイルをコピーしてから処理します.
2.ブックマークを見つけ、データを書き込む
3.xpsファイルとして保存
ReportUtil.csは次のとおりです.
呼び出し方法は
xpsファイルを生成したら、システムのxpsプログラムを呼び出し、そのxpsファイルを開きます.
ps:ClassPropertyは、取得器を熟知し、汎用クラスを呼び出してクラスのすべてのフィールドの属性と名前を取得し、hashで返すツールです.
Wordはテンプレートを作成し、ブックマークを追加します.
Wordテンプレート処理ツールを提供します.具体的な考え方は、
1.パスに従ってモジュールを開き、一時ファイルを作成します.Wordプログラムは元のテンプレートを直接操作し、テンプレートの構造を変更するので、まず存在するかどうかをチェックし、存在する場合は削除してから元のテンプレートと一時ファイルをコピーしてから処理します.
2.ブックマークを見つけ、データを書き込む
3.xpsファイルとして保存
ReportUtil.csは次のとおりです.
class ReportUtil
{
private _Application wordApp = null;
private _Document wordDoc = null;
public _Application Application
{
get { return wordApp; }
set
{
wordApp = value;
}
}
public _Document Document
{
get
{
return wordDoc;
}
set
{
wordDoc = value;
}
}
public void CreateNewDocument(string filePath)
{
killWinWordProcess();
wordApp = new ApplicationClass();
wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
wordApp.Visible = false;
object missing = System.Reflection.Missing.Value;
//String path = Directory.GetParent(Environment.CurrentDirectory).Parent.FullName.ToString();
string TempTemplateFile = Session.EvenDir + @"/WordTemplate/Temp.doc";
if(File.Exists(TempTemplateFile))
{
File.Delete(TempTemplateFile);
}
File.Copy(filePath, TempTemplateFile);
object templateName = TempTemplateFile;
wordDoc = wordApp.Documents.Open(ref templateName, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing);
}
public bool SaveDocument(string filePath)
{
bool result = true;
object fileName = filePath;
object format = WdSaveFormat.wdFormatXPS;
object miss = System.Reflection.Missing.Value;
try
{
wordDoc.SaveAs(ref fileName, ref format, ref miss,
ref miss, ref miss, ref miss, ref miss,
ref miss, ref miss, ref miss, ref miss,
ref miss, ref miss, ref miss, ref miss,
ref miss);
}
catch (Exception e)
{
MessageBox.Show(" ");
result = false;
}
//object miss1 = System.Reflection.Missing.Value;
// ref miss);
object SaveChanges = WdSaveOptions.wdSaveChanges;
object OriginalFormat = WdOriginalFormat.wdOriginalDocumentFormat;
object RouteDocument = false;
wordDoc.Close(ref SaveChanges, ref OriginalFormat, ref RouteDocument);
wordApp.Quit(ref SaveChanges, ref OriginalFormat, ref RouteDocument);
killWinWordProcess();
return result;
}
public bool InsertValue(string bookmark, string value)
{
object bkObj = bookmark;
if (wordApp.ActiveDocument.Bookmarks.Exists(bookmark))
{
wordApp.ActiveDocument.Bookmarks.get_Item(ref bkObj).Select();
wordApp.Selection.TypeText(value);
return true;
}
return false;
}
public void killWinWordProcess()
{
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("WINWORD");
foreach (System.Diagnostics.Process process in processes)
{
bool b = process.MainWindowTitle == "";
if (process.MainWindowTitle == "")
{
process.Kill();
}
}
}
}
呼び出し方法は
string filePath = Session.EvenDir + @"/WordTemplate/template.doc";
ReportUtil report = new ReportUtil();
report.CreateNewDocument(filePath);
Dictionary<String, String> d = ClassProperty.GetProperties(t);
foreach (KeyValuePair<String, String> a in d)
{
report.InsertValue(a.Key, a.Value);
}
bool b = report.SaveDocument(Session.EvenDir + @"\WordTemplate\report");
if (b)
{
Process.Start("xpsrchvw.exe", Session.EvenDir + @"\WordTemplate\report.xps");
}
xpsファイルを生成したら、システムのxpsプログラムを呼び出し、そのxpsファイルを開きます.
ps:ClassPropertyは、取得器を熟知し、汎用クラスを呼び出してクラスのすべてのフィールドの属性と名前を取得し、hashで返すツールです.