引用Word对象库文件
具体做法是打开菜单栏中的项目>添加引用>浏览,在打开的“选择组件”对话框中找到MSWORD.OLB后按确定即可引入此对象库文件,vs.net将会自动将库文件转化为DLL组件,这样我们只要在源码中创建该组件对象即可达到操作Word的目的!
如图
这会自动在你的应用程序文件夹中放置一个程序集(assembly)将COM接口邦定到Word。
上传并存储word文件
上传文件时首先通过上传控件找到所需上传的文件,然后获取文件的大小,最后以流的形式写入数据库
具体代码为
private void Btn_OK_Click(object sender, System.EventArgs e) { string name=name_TextBox.Text; //接收上传文件 Stream fileStream=File1.PostedFile.InputStream; //获取上传文件字节的大小 int length=File1.PostedFile.ContentLength; byte[] wordData=new byte[length]; //从流中读取字节并写入wordData int n=fileStream.Read(wordData,0,length); //获取当前时间 DateTime time=DateTime.Now; //连接数据库 SqlConnection conn=new SqlConnection(); conn.ConnectionString="workstation id=TIANCHUNZHU;packet size=4096;integrated security=SSPI;data source=TIANCHUNZHU;persist security info=False;initial catalog=test"; SqlCommand cmd=new SqlCommand(); cmd.Connection=conn; cmd.CommandText="INSERT INTO word (fileName,postTime,fileContent) values (@fileName,@postTime,@fileContent)"; SqlParameter nameParam=new SqlParameter("@fileName",System.Data.SqlDbType.VarChar,50); nameParam.Value=name; cmd.Parameters.Add(nameParam); SqlParameter timeParam=new SqlParameter("@postTime",System.Data.SqlDbType.DateTime,8); timeParam.Value=time; cmd.Parameters.Add(timeParam); //添加word文件 SqlParameter contentParam=new SqlParameter("@fileContent",System.Data.SqlDbType.Image); ①//见本段最后注解 contentParam.Value=wordData; cmd.Parameters.Add(contentParam); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); }
说明
此处由于是Image类型文件,事先可能无法预测文件的大小,因此可不必指定size参数。如果希望控制上传文件的大小则可以输入size参数。如指定1000,则上传时最大可以上传1k的word文档。
从数据库中读取数据并恢复为word文件
读取数据时先将数据从数据库中读入缓冲区,然后再从缓冲区写入最终文件。因此首先要开辟一个缓冲区并设定它的大小,每当缓冲区读满时就要将缓冲区内的数据写入文件,以清空缓冲区并继续向缓冲区读数据,直到最后一次将缓冲区内剩余的数据全部写入文件,新的word文档即可生成。
由于这一部分用到了字节流的输入输出操作,因此要引用System.IO命名空间
代码
private void Btn_get_Click(object sender, System.EventArgs e) { //连接数据库 SqlConnection conn=new SqlConnection(); conn.ConnectionString="workstation id=TIANCHUNZHU;packet size=4096;integrated security=SSPI;data source=TIANCHUNZHU;persist security info=False;initial catalog=test"; SqlCommand cmd=new SqlCommand(); cmd.Connection=conn; //根据TextBox中指定的文件名进行查找读取 cmd.CommandText="select fileContent from word where fileName='"+name_TextBox.Text.ToString()+"'"; FileStream fs; BinaryWriter bw; //设定允许读取到缓冲区的最大长度 int buffersize=100; //要将字节流读入的缓冲区 byte[] outbyte=new byte[buffersize]; //用于记录已经读取的字节数 long reval; //字段中的索引,从这里开始读取操作 long startIndex; //FileStream对象将封装的文件的相对路径或绝对路径 string filePath=@"C:wordData.doc"; conn.Open(); SqlDataReader reader; reader=cmd.ExecuteReader(); while (reader.Read()) { fs=new FileStream(filePath,FileMode.OpenOrCreate,FileAccess.Write); bw=new BinaryWriter(fs); startIndex=0; //将字节流读入outbyte缓冲区中并返回读取的字节数 reval=reader.GetBytes(0,startIndex,outbyte,0,buffersize); //当读取的字节流达到缓冲区允许的最大长度时要卸载缓冲区内的数据并将数据写入文件 while (reval==buffersize) { bw.Write(outbyte); bw.Flush(); //重新设定开始读取的位置,并继续读取和写数据 startIndex+=buffersize; reval=reader.GetBytes(0,startIndex,outbyte,0,buffersize); } //将缓冲区内最后剩余的数据写入文件 bw.Write(outbyte,0,(int)reval-1); bw.Flush(); bw.Close(); fs.Close(); } reader.Close(); conn.Close(); }
说明
此时将按照filePath中指定的路径和名称重新生成word文档。可以在filePath中根据具体情况指定生成的word文档的名称和路径。
常用生成word文档的代码
public string CreateWordFile(string CheckedInfo) { string message = ""; try { Object Nothing = System.Reflection.Missing.Value; Directory.CreateDirectory("C:/CNSI"); //创建文件所在目录 string name = "CNSI.doc"; object filename = "C://CNSI//" + name; //文件保存路径 //创建Word文档 Word.Application WordApp = new Word.ApplicationClass(); Word.Document WordDoc = WordApp.Documents.Add(ref Nothing, ref Nothing, ref Nothing, ref Nothing); //添加页眉 WordApp.ActiveWindow.View.Type = WdViewType.wdOutlineView; WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekPrimaryHeader; WordApp.ActiveWindow.ActivePane.Selection.InsertAfter("[页眉内容]"); WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;//设置右对齐 WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekMainDocument;//跳出页眉设置 WordApp.Selection.ParagraphFormat.LineSpacing = 15f;//设置文档的行间距 /*WordDoc.PageSetup.Orientation = Word.WdOrientation.wdOrientLandscape; //设置页面为纵向 WordDoc.PageSetup.PageHeight = WordApp.CentimetersToPoints(21F); WordDoc.PageSetup.PageWidth = WordApp.CentimetersToPoints(29.7F); WordDoc.PageSetup.TopMargin = 57; //设置上边距 WordDoc.PageSetup.BottomMargin = 57;//设置下边距 WordDoc.PageSetup.LeftMargin = 57;//设置左边距 WordDoc.PageSetup.RightMargin = 57;//设置右边距*/ //移动焦点并换行 object count = 14; object WdLine = Word.WdUnits.wdLine;//换一行; WordApp.Selection.MoveDown(ref WdLine, ref count, ref Nothing);//移动焦点 WordApp.Selection.TypeParagraph();//插入段落 //文档中创建表格 Word.Table newTable = WordDoc.Tables.Add(WordApp.Selection.Range, 12, 3, ref Nothing, ref Nothing); //设置表格样式 newTable.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleThickThinLargeGap; newTable.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle; newTable.Columns[1].Width = 100f; newTable.Columns[2].Width = 220f; newTable.Columns[3].Width = 105f; //填充表格内容 newTable.Cell(1, 1).Range.Text = "产品详细信息表"; newTable.Cell(1, 1).Range.Bold = 2;//设置单元格中字体为粗体 //合并单元格 newTable.Cell(1, 1).Merge(newTable.Cell(1, 3)); WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;//垂直居中 WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中 //填充表格内容 newTable.Cell(2, 1).Range.Text = "产品基本信息"; newTable.Cell(2, 1).Range.Font.Color = Word.WdColor.wdColorDarkBlue;//设置单元格内字体颜色 //合并单元格 newTable.Cell(2, 1).Merge(newTable.Cell(2, 3