手头上的一个项目报表相对比较简单,所以报表打印采用VBA引擎,通过定制Word模版,然后根据模版需要填充数据,然后OK,打印即可。
实现方法:首先需要引用VBA组建,我用的是Office2003PRofessional,Dll版本号为Microsoft Word11.0
另外当然还需要引用Interop.Word.Dll.
代码如下:
///#region 打开Word文档,并且返回对象wDoc,wDoc//////打开Word文档,并且返回对象wDoc,wDoc//////完整Word文件路径+名称///返回的Word.Document wDoc对象///返回的Word.application对象publicstaticvoidCreateWordDocument(stringFileName,refWord.Document wDoc,refWord.Application WApp)
{if(FileName =="")return;
Word.Document thisDocument=null;
Word.FormFields formFields=null;
Word.Application thisApplication=newWord.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;
ObjectxmlTransform=System.Type.Missing;try{
Word.Document wordDoc=thisApplication.Documents.Open(reffilename,refConfirmConversions,refReadOnly,refAddToRecentFiles,refPasswordDocument,refPasswordTemplate,refRevert,refWritePasswordDocument,refWritePasswordTemplate,refFormat,refEncoding,refVisible,refOpenAndRepair,refDocumentDirection,refNoEncodingDialog,refXMLTransform );
thisDocument=wordDoc;
wDoc=wordDoc;
WApp=thisApplication;
formFields=wordDoc.FormFields;
}catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}#endregion调用上面静态方法,打开目标文件并且把DataGrid中数据填充到对应Word标签中去///#region Word填充数据(For Example)//////Word填充数据///privatevoidWordLoadData()
{
Word.Document wDoc=null;
Word.Application wApp=null;
sysFun.CreateWordDocument("E:\\监测报告(new).dot",refwDoc,refwApp);//对标签"C"进行填充objectbkmC="C";if(wApp.ActiveDocument.Bookmarks.Exists("C") ==true)
{
wApp.ActiveDocument.Bookmarks.get_Item
(refbkmC).Select();
}
wApp.Selection.TypeText(this.txt1.Text);objectbkmG ="TWaterTable3";objectunit;objectcount;//移动数objectextend;
extend=Word.WdMovementType.wdExtend;
unit=Word.WdUnits.wdCell;//把DataGrid中数据填充到标签TWaterTable3上if(wApp.ActiveDocument.Bookmarks.Exists("TWaterTable3") ==true)
{
wApp.ActiveDocument.Bookmarks.get_Item
(refbkmG).Select();for(inti=0;i {if(i==0)
{
count=1;
}else{
count=0;
}//需填充5列数据wApp.Selection.Move(refunit,refcount);
wApp.Selection.TypeText(gridEX1.GetRow(i).Cells[0].Text);
count=1;
wApp.Selection.Move(refunit,refcount);
wApp.Selection.TypeText(gridEX1.GetRow(i).Cells[1].Text);
wApp.Selection.Move(refunit,refcount);
wApp.Selection.TypeText(gridEX1.GetRow(i).Cells[2].Text);
wApp.Selection.Move(refunit,refcount);
wApp.Selection.TypeText(gridEX1.GetRow(i).Cells[3].Text);
wApp.Selection.Move(refunit,refcount);
wApp.Selection.TypeText(gridEX1.GetRow(i).Cells[4].Text);//换行wApp.Selection.MoveRight(refunit,refcount,refextend);
}
}
}#endregion然后就OK了,在对标签表控制要注意列循环和换行.
C#操作Excel(导入导出)
有很多朋友说需要C#导出到Excel的代码,现共享给大家//////读取Excel文档//////文件名称///返回一个数据集publicDataSet ExcelToDS(stringPath)
{stringstrConn ="Provider=Microsoft.Jet.OLEDB.4.0;"+"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
OleDbConnection conn=newOleDbConnection(strConn);
conn.Open();stringstrExcel ="";
OleDbDataAdapter myCommand=null;
DataSet ds=null;
strExcel="select * from [sheet1$]";
myCommand=newOleDbDataAdapter(strExcel, strConn);
ds=newDataSet();
myCommand.Fill(ds,"table1");returnds;
}//////写入Excel文档//////文件名称publicboolSaveFP2toExcel(stringPath)
{try{stringstrConn ="Provider=Microsoft.Jet.OLEDB.4.0;"+"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
OleDbConnection conn=newOleDbConnection(strConn);
conn.Open();
System.Data.OleDb.OleDbCommand cmd=newOleDbCommand ();
cmd.Connection=conn;//cmd.CommandText ="UPDATE [sheet1$] SET 姓名='2005-01-01' WHERE 工号='日期'";//cmd.ExecuteNonQuery ();for(inti=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 ();returntrue;
}catch(System.Data.OleDb.OleDbException ex)
{
System.Diagnostics.Debug.WriteLine ("写入Excel发生错误:"+ex.Message );
}returnfalse;
}
这种方法是相当有效的。
下附:VB.NET版实现word打开与关闭,有兴趣的朋友可以研究一下
VB.NET实现word打开与关闭
Imports Word'打开Dim mWordapp As Word.Application'word 应用程序Dim mobjDoc As Word.Document'word 文档Dim fullFileNameasstring'文件路径mWordapp= CreateObject("Word.Application")
mobjDoc=mWordapp.Documents.Add(FullFileName)'关闭Dim missing As Object=System.Reflection.Missing.Value
mWordapp.Application.Quit()
If Not mobjDoc Is Nothing Then'垃圾回收System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjDoc)
mobjDoc=Nothing
End If
If Not mWordapp Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(mWordapp)
mWordapp=Nothing
End If'真正释放word进程