手头上的一个项目报表相对比较简单,所以报表打印采用VBA引擎,通过定制Word模版,然后根据模版需要填充数据,然后OK,打印即可。
实现方法:首先需要引用VBA组建,我用的是Office2003 PRofessional,Dll版本号为Microsoft Word11.0
另外当然还需要引用Interop.Word.Dll.
代码如下:
///#region 打开Word文档,并且返回对象wDoc,wDoc/// /// 打开Word文档,并且返回对象wDoc,wDoc/// /// 完整Word文件路径+名称 /// 返回的Word.Document wDoc对象/// 返回的Word.application对象public static void CreateWordDocument(string FileName,ref Word.Document wDoc,ref Word.Application WApp){if(FileName == "") return;Word.Document thisDocument = null;Word.FormFields formFields = null;Word.Application thisApplication = new Word.ApplicationClass();thisApplication.Visible = true;thisApplication.Caption = "";thisApplication.Options.CheckSpellingAsYouType = false;thisApplication.Options.CheckGrammarAsYouType = false;Object filename = FileName;Object ConfirmConversions = false;Object ReadOnly = true;Object AddToRecentFiles = false;Object PasswordDocument = System.Type.Missing;Object PasswordTemplate = System.Type.Missing;Object Revert = System.Type.Missing;Object WritePasswordDocument = System.Type.Missing;Object WritePasswordTemplate = System.Type.Missing;Object Format = System.Type.Missing;Object Encoding = System.Type.Missing;Object Visible = System.Type.Missing;Object OpenAndRepair = System.Type.Missing;Object DocumentDirection = System.Type.Missing;Object NoEncodingDialog = System.Type.Missing;Object xmlTransform = System.Type.Missing;try{Word.Document wordDoc =thisApplication.Documents.Open(ref filename, ref ConfirmConversions,ref ReadOnly, ref AddToRecentFiles, ref PasswordDocument, ref PasswordTemplate,ref Revert,ref WritePasswordDocument, ref WritePasswordTemplate, ref Format,ref Encoding, ref Visible, ref OpenAndRepair, ref DocumentDirection,ref NoEncodingDialog, ref XMLTransform );thisDocument = wordDoc;wDoc = wordDoc;WApp = thisApplication;formFields = wordDoc.FormFields;}catch(Exception ex){MessageBox.Show(ex.Message);}}#endregion调用上面静态方法,打开目标文件并且把DataGrid中数据填充到对应Word标签中去///#region Word填充数据(For Example)/// /// Word填充数据/// private void WordLoadData(){Word.Document wDoc=null;Word.Application wApp=null;sysFun.CreateWordDocument("E://监测报告(new).dot",ref wDoc,ref wApp);//对标签"C"进行填充object bkmC="C";if(wApp.ActiveDocument.Bookmarks.Exists("C") == true){wApp.ActiveDocument.Bookmarks.get_Item(ref bkmC).Select();}wApp.Selection.TypeText(this.txt1.Text);object bkmG = "TWaterTable3";object unit; object count; //移动数object extend;extend = Word.WdMovementType.wdExtend;unit = Word.WdUnits.wdCell;//把DataGrid中数据填充到标签TWaterTable3上if(wApp.ActiveDocument.Bookmarks.Exists("TWaterTable3") == true){wApp.ActiveDocument.Bookmarks.get_Item(ref bkmG).Select();for(int i=0;i {if(i==0){count=1;}else{count=0;}//需填充5列数据wApp.Selection.Move(ref unit,ref count);wApp.Selection.TypeText(gridEX1.GetRow(i).Cells[0].Text);count=1;wApp.Selection.Move(ref unit,ref count);wApp.Selection.TypeText(gridEX1.GetRow(i).Cells[1].Text);wApp.Selection.Move(ref unit,ref count);wApp.Selection.TypeText(gridEX1.GetRow(i).Cells[2].Text);wApp.Selection.Move(ref unit,ref count);wApp.Selection.TypeText(gridEX1.GetRow(i).Cells[3].Text);wApp.Selection.Move(ref unit,ref count);wApp.Selection.TypeText(gridEX1.GetRow(i).Cells[4].Text);//换行wApp.Selection.MoveRight(ref unit,ref count,ref extend);}}}#endregion 然后就OK了,在对标签表控制要注意列循环和换行.C#操作Excel(导入导出) 有很多朋友说需要C#导出到Excel的代码,现共享给大家/// /// 读取Excel文档/// /// 文件名称/// 返回一个数据集public DataSet ExcelToDS(string Path){string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";OleDbConnection conn = new OleDbConnection(strConn);conn.Open(); string strExcel = ""; OleDbDataAdapter myCommand = null;DataSet ds = null;strExcel="select * from [sheet1$]";myCommand = new OleDbDataAdapter(strExcel, strConn);ds = new DataSet();myCommand.Fill(ds,"table1"); return ds;}/// /// 写入Excel文档/// /// 文件名称public bool SaveFP2toExcel(string Path){try{string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";OleDbConnection conn = new OleDbConnection(strConn);conn.Open(); System.Data.OleDb.OleDbCommand cmd=new OleDbCommand ();cmd.Connection =conn;//cmd.CommandText ="UPDATE [sheet1$] SET 姓名='2005-01-01' WHERE 工号='日期'";//cmd.ExecuteNonQuery ();for(int i=0;i {if(fp2.Sheets [0].Cells[i,0].Text!=""){cmd.CommandText ="INSERT INTO [sheet1$] (工号,姓名,部门,职务,日期,时间) VALUES('"+fp2.Sheets [0].Cells[i,0].Text+ "','"+fp2.Sheets [0].Cells[i,1].Text+"','"+fp2.Sheets [0].Cells[i,2].Text+"','"+fp2.Sheets [0].Cells[i,3].Text+"','"+fp2.Sheets [0].Cells[i,4].Text+"','"+fp2.Sheets [0].Cells[i,5].Text+"')";cmd.ExecuteNonQuery ();}}conn.Close ();return true;}catch(System.Data.OleDb.OleDbException ex){System.Diagnostics.Debug.WriteLine ("写入Excel发生错误:"+ex.Message );}return false;} 这种方法是相当有效的。 下附:VB.NET版实现word打开与关闭,有兴趣的朋友可以研究一下VB.NET实现word打开与关闭Imports Word'打开Dim mWordapp As Word.Application 'word 应用程序Dim mobjDoc As Word.Document 'word 文档Dim fullFileName as string '文件路径mWordapp = CreateObject("Word.Application")mobjDoc = mWordapp.Documents.Add(FullFileName)'关闭Dim missing As Object = System.Reflection.Missing.ValuemWordapp.Application.Quit()If Not mobjDoc Is Nothing Then'垃圾回收System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjDoc)mobjDoc = NothingEnd IfIf Not mWordapp Is Nothing ThenSystem.Runtime.InteropServices.Marshal.ReleaseComObject(mWordapp)mWordapp = NothingEnd If'真正释放word进程
新闻热点
疑难解答