Asp.net操作Word文档,原来这么简单啊!

引用Word对象库文件
 

具体做法是打开菜单栏中的项目>添加引用>浏览,在打开的“选择组件”对话框中找到MSWORD.OLB后按确定即可引入此对象库文件,vs.net将会自动将库文件转化为DLL组件,这样我们只要在源码中创建该组件对象即可达到操作Word的目的!
 

如图

 

这会自动在你的应用程序文件夹中放置一个程序集(assembly)将COM接口邦定到Word。
 

 

上传并存储word文件

上传文件时首先通过上传控件找到所需上传的文件,然后获取文件的大小,最后以流的形式写入数据库

 

具体代码为

 
C# 代码   复制

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命名空间

 

代码

 
C# 代码   复制

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文档的代码

 
C# 代码   复制

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));
WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;

            //填充表格内容
newTable.Cell(3, 1).Range.Text = "品牌名称:";
newTable.Cell(3, 2).Range.Text = CheckedInfo;
//纵向合并单元格
newTable.Cell(3, 3).Select();//选中一行
object moveUnit = Word.WdUnits.wdLine;
object moveCount = 5;
object moveExtend = Word.WdMovementType.wdExtend;
WordApp.Selection.MoveDown(ref moveUnit, ref moveCount, ref moveExtend);
WordApp.Selection.Cells.Merge();
//插入图片
string FileName = @"C:\\1.jpg";//图片所在路径
object LinkToFile = false;
object SaveWithDocument = true;
object Anchor = WordDoc.Application.Selection.Range;
WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Anchor);
WordDoc.Application.ActiveDocument.InlineShapes[1].Width = 100f;//图片宽度
WordDoc.Application.ActiveDocument.InlineShapes[1].Height = 100f;//图片高度
//将图片设置为四周环绕型
Word.Shape s = WordDoc.Application.ActiveDocument.InlineShapes[1].ConvertToShape();
s.WrapFormat.Type = Word.WdWrapType.wdWrapSquare;

newTable.Cell(12, 1).Range.Text = "产品特殊属性";
newTable.Cell(12, 1).Merge(newTable.Cell(12, 3));
//在表格中增加行
WordDoc.Content.Tables[1].Rows.Add(ref Nothing);

            WordDoc.Paragraphs.Last.Range.Text = "文档创建时间:" + DateTime.Now.ToString();//“落款”
WordDoc.Paragraphs.Last.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;

            //文件保存
WordDoc.SaveAs(ref filename, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing);
WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);
WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);
message = name + "文档生成成功,以保存到C:CNSI下";
}
catch
{
message = "文件导出异常!";
}
return message;
}

 

有几点需要注意的地方如下:

1、在调整合并后的单元格中的内容的位置时,原先我是先向单元格中写数据,然后选中单元格,再合并单元格,最后调整水平和垂直位置。但是结果发现,不管我怎么调位置,单元格的内容始终都显示在最下方。经过一番尝试后,我发现应该先合并单元格,再往合并后的单元格中添加数据,然后选中合并后的单元格,最后设置水平位置和垂直位置。这样才可行。举例如下:

newTable.Cell(12, 1).Merge(newTable.Cell(18, 1));
newTable.Cell(12, 1).Range.Text = "范例";
newTable.Cell(12, 1).Select();
WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; //垂直居中
WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; //水平居中

 

2、网站发布前,Word导出正常,但发布之后就Word导出异常,则可能是权限的问题,最简单的解决办法是在<system.web></system.web>之间添加如下语句:

<identity impersonate="true" userName="你自己的账户" password="密码"/>,注意密码不能为空或者是弱密码。

 

 

3、如果出现如下错误:

 

 

"word 无法保存此文件, 因为它已在别处打开。(C:\...\STARTUP\Powerword.dot)"

posted @ 2014-11-14 16:58  Ranran  阅读(7634)  评论(0编辑  收藏  举报