制作报表可有很多方案,这里记录一种C#版的报表方案:利用Word做好模板,并为动态内容添加书签,然后通过程序另存为后缀名为XPS的文件。为什么要XPS的报表呢,第一是因为Win7以上的系统都自带,XP安装也比较方便,第二报表效果非常好看,还可设置签名。
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"); }
ps:ClassProperty是一个工具,熟悉获取器,通过传人一个泛型类,获取到该类的所有字段的属性和名称,并以hash的方式返回