码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2014-11-14 17:26:19      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:style   http   io   color   ar   os   sp   for   strong   

引用Word对象库文件
 

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

如图

bubuko.com,布布扣

 

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

 

上传并存储word文件

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

 

具体代码为

 
C# 代码   复制
bubuko.com,布布扣
bubuko.com,布布扣private void Btn_OK_Click(object sender, System.EventArgs e) 
bubuko.com,布布扣
bubuko.com,布布扣       { 
bubuko.com,布布扣
bubuko.com,布布扣           string name=name_TextBox.Text; 
bubuko.com,布布扣
bubuko.com,布布扣            //接收上传文件 
bubuko.com,布布扣
bubuko.com,布布扣           Stream fileStream=File1.PostedFile.InputStream; 
bubuko.com,布布扣
bubuko.com,布布扣           //获取上传文件字节的大小 
bubuko.com,布布扣
bubuko.com,布布扣           int length=File1.PostedFile.ContentLength; 
bubuko.com,布布扣
bubuko.com,布布扣           byte[] wordData=new byte[length]; 
bubuko.com,布布扣
bubuko.com,布布扣           //从流中读取字节并写入wordData 
bubuko.com,布布扣
bubuko.com,布布扣           int n=fileStream.Read(wordData,0,length); 
bubuko.com,布布扣
bubuko.com,布布扣           //获取当前时间 
bubuko.com,布布扣
bubuko.com,布布扣           DateTime time=DateTime.Now; 
bubuko.com,布布扣
bubuko.com,布布扣           //连接数据库 
bubuko.com,布布扣
bubuko.com,布布扣           SqlConnection conn=new SqlConnection(); 
bubuko.com,布布扣
bubuko.com,布布扣           conn.ConnectionString="workstation id=TIANCHUNZHU;packet size=4096;integrated security=SSPI;data source=TIANCHUNZHU;persist security info=False;initial catalog=test"; 
bubuko.com,布布扣
bubuko.com,布布扣           SqlCommand cmd=new SqlCommand(); 
bubuko.com,布布扣
bubuko.com,布布扣           cmd.Connection=conn; 
bubuko.com,布布扣
bubuko.com,布布扣           cmd.CommandText="INSERT INTO word (fileName,postTime,fileContent) values (@fileName,@postTime,@fileContent)"; 
bubuko.com,布布扣
bubuko.com,布布扣           SqlParameter nameParam=new SqlParameter("@fileName",System.Data.SqlDbType.VarChar,50); 
bubuko.com,布布扣
bubuko.com,布布扣           nameParam.Value=name; 
bubuko.com,布布扣
bubuko.com,布布扣           cmd.Parameters.Add(nameParam); 
bubuko.com,布布扣
bubuko.com,布布扣           SqlParameter timeParam=new SqlParameter("@postTime",System.Data.SqlDbType.DateTime,8); 
bubuko.com,布布扣
bubuko.com,布布扣           timeParam.Value=time; 
bubuko.com,布布扣
bubuko.com,布布扣           cmd.Parameters.Add(timeParam); 
bubuko.com,布布扣
bubuko.com,布布扣//添加word文件 
bubuko.com,布布扣
bubuko.com,布布扣           SqlParameter contentParam=new SqlParameter("@fileContent",System.Data.SqlDbType.Image); ①//见本段最后注解 
bubuko.com,布布扣
bubuko.com,布布扣           contentParam.Value=wordData; 
bubuko.com,布布扣
bubuko.com,布布扣           cmd.Parameters.Add(contentParam); 
bubuko.com,布布扣
bubuko.com,布布扣           conn.Open(); 
bubuko.com,布布扣
bubuko.com,布布扣           cmd.ExecuteNonQuery(); 
bubuko.com,布布扣
bubuko.com,布布扣           conn.Close(); 
bubuko.com,布布扣
bubuko.com,布布扣       } 
bubuko.com,布布扣

 

说明

此处由于是Image类型文件,事先可能无法预测文件的大小,因此可不必指定size参数。如果希望控制上传文件的大小则可以输入size参数。如指定1000,则上传时最大可以上传1k的word文档。

 

从数据库中读取数据并恢复为word文件

 

读取数据时先将数据从数据库中读入缓冲区,然后再从缓冲区写入最终文件。因此首先要开辟一个缓冲区并设定它的大小,每当缓冲区读满时就要将缓冲区内的数据写入文件,以清空缓冲区并继续向缓冲区读数据,直到最后一次将缓冲区内剩余的数据全部写入文件,新的word文档即可生成。

由于这一部分用到了字节流的输入输出操作,因此要引用System.IO命名空间

 

代码

 
C# 代码   复制
bubuko.com,布布扣
bubuko.com,布布扣private void Btn_get_Click(object sender, System.EventArgs e) 
bubuko.com,布布扣
bubuko.com,布布扣{ 
bubuko.com,布布扣
bubuko.com,布布扣//连接数据库 
bubuko.com,布布扣
bubuko.com,布布扣           SqlConnection conn=new SqlConnection(); 
bubuko.com,布布扣
bubuko.com,布布扣           conn.ConnectionString="workstation id=TIANCHUNZHU;packet size=4096;integrated security=SSPI;data source=TIANCHUNZHU;persist security info=False;initial catalog=test"; 
bubuko.com,布布扣
bubuko.com,布布扣           SqlCommand cmd=new SqlCommand(); 
bubuko.com,布布扣
bubuko.com,布布扣           cmd.Connection=conn; 
bubuko.com,布布扣
bubuko.com,布布扣            //根据TextBox中指定的文件名进行查找读取 
bubuko.com,布布扣
bubuko.com,布布扣           cmd.CommandText="select fileContent from word where fileName=‘"+name_TextBox.Text.ToString()+""; 
bubuko.com,布布扣
bubuko.com,布布扣           FileStream fs; 
bubuko.com,布布扣
bubuko.com,布布扣           BinaryWriter bw; 
bubuko.com,布布扣
bubuko.com,布布扣           //设定允许读取到缓冲区的最大长度 
bubuko.com,布布扣
bubuko.com,布布扣           int buffersize=100; 
bubuko.com,布布扣
bubuko.com,布布扣           //要将字节流读入的缓冲区 
bubuko.com,布布扣
bubuko.com,布布扣           byte[] outbyte=new byte[buffersize]; 
bubuko.com,布布扣
bubuko.com,布布扣           //用于记录已经读取的字节数 
bubuko.com,布布扣
bubuko.com,布布扣           long reval; 
bubuko.com,布布扣
bubuko.com,布布扣           //字段中的索引,从这里开始读取操作 
bubuko.com,布布扣
bubuko.com,布布扣           long startIndex; 
bubuko.com,布布扣
bubuko.com,布布扣           //FileStream对象将封装的文件的相对路径或绝对路径 
bubuko.com,布布扣
bubuko.com,布布扣           string filePath=@"C:wordData.doc"; 
bubuko.com,布布扣
bubuko.com,布布扣           conn.Open(); 
bubuko.com,布布扣
bubuko.com,布布扣           SqlDataReader reader; 
bubuko.com,布布扣
bubuko.com,布布扣           reader=cmd.ExecuteReader(); 
bubuko.com,布布扣
bubuko.com,布布扣           while (reader.Read()) 
bubuko.com,布布扣
bubuko.com,布布扣           { 
bubuko.com,布布扣
bubuko.com,布布扣              fs=new FileStream(filePath,FileMode.OpenOrCreate,FileAccess.Write); 
bubuko.com,布布扣
bubuko.com,布布扣              bw=new BinaryWriter(fs); 
bubuko.com,布布扣
bubuko.com,布布扣              startIndex=0; 
bubuko.com,布布扣
bubuko.com,布布扣              //将字节流读入outbyte缓冲区中并返回读取的字节数 
bubuko.com,布布扣
bubuko.com,布布扣              reval=reader.GetBytes(0,startIndex,outbyte,0,buffersize); 
bubuko.com,布布扣
bubuko.com,布布扣              //当读取的字节流达到缓冲区允许的最大长度时要卸载缓冲区内的数据并将数据写入文件 
bubuko.com,布布扣
bubuko.com,布布扣              while (reval==buffersize) 
bubuko.com,布布扣
bubuko.com,布布扣              { 
bubuko.com,布布扣
bubuko.com,布布扣                  bw.Write(outbyte); 
bubuko.com,布布扣
bubuko.com,布布扣                  bw.Flush(); 
bubuko.com,布布扣
bubuko.com,布布扣                  //重新设定开始读取的位置,并继续读取和写数据 
bubuko.com,布布扣
bubuko.com,布布扣                  startIndex+=buffersize; 
bubuko.com,布布扣
bubuko.com,布布扣                  reval=reader.GetBytes(0,startIndex,outbyte,0,buffersize); 
bubuko.com,布布扣
bubuko.com,布布扣              } 
bubuko.com,布布扣
bubuko.com,布布扣              //将缓冲区内最后剩余的数据写入文件 
bubuko.com,布布扣
bubuko.com,布布扣              bw.Write(outbyte,0,(int)reval-1); 
bubuko.com,布布扣
bubuko.com,布布扣              bw.Flush(); 
bubuko.com,布布扣
bubuko.com,布布扣              bw.Close(); 
bubuko.com,布布扣
bubuko.com,布布扣               fs.Close(); 
bubuko.com,布布扣
bubuko.com,布布扣           } 
bubuko.com,布布扣
bubuko.com,布布扣           reader.Close(); 
bubuko.com,布布扣
bubuko.com,布布扣           conn.Close(); 
bubuko.com,布布扣
bubuko.com,布布扣} 
bubuko.com,布布扣

 

说明

此时将按照filePath中指定的路径和名称重新生成word文档。可以在filePath中根据具体情况指定生成的word文档的名称和路径。

 

常用生成word文档的代码

 
C# 代码   复制
bubuko.com,布布扣
bubuko.com,布布扣public string CreateWordFile(string CheckedInfo)
bubuko.com,布布扣{
bubuko.com,布布扣string message = "";
bubuko.com,布布扣try
bubuko.com,布布扣{
bubuko.com,布布扣Object Nothing = System.Reflection.Missing.Value;
bubuko.com,布布扣Directory.CreateDirectory("C:/CNSI"); //创建文件所在目录
bubuko.com,布布扣string name = "CNSI.doc";
bubuko.com,布布扣object filename = "C://CNSI//" + name; //文件保存路径
bubuko.com,布布扣//创建Word文档
bubuko.com,布布扣Word.Application WordApp = new Word.ApplicationClass();
bubuko.com,布布扣Word.Document WordDoc = WordApp.Documents.Add(ref Nothing, ref Nothing, ref Nothing, ref Nothing);
bubuko.com,布布扣
bubuko.com,布布扣    //添加页眉
bubuko.com,布布扣WordApp.ActiveWindow.View.Type = WdViewType.wdOutlineView;
bubuko.com,布布扣WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekPrimaryHeader;
bubuko.com,布布扣WordApp.ActiveWindow.ActivePane.Selection.InsertAfter("[页眉内容]");
bubuko.com,布布扣WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;//设置右对齐
bubuko.com,布布扣WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekMainDocument;//跳出页眉设置
bubuko.com,布布扣
bubuko.com,布布扣WordApp.Selection.ParagraphFormat.LineSpacing = 15f;//设置文档的行间距
bubuko.com,布布扣
bubuko.com,布布扣/*WordDoc.PageSetup.Orientation = Word.WdOrientation.wdOrientLandscape; //设置页面为纵向
bubuko.com,布布扣            WordDoc.PageSetup.PageHeight = WordApp.CentimetersToPoints(21F);
bubuko.com,布布扣            WordDoc.PageSetup.PageWidth = WordApp.CentimetersToPoints(29.7F);
bubuko.com,布布扣            WordDoc.PageSetup.TopMargin = 57; //设置上边距
bubuko.com,布布扣            WordDoc.PageSetup.BottomMargin = 57;//设置下边距
bubuko.com,布布扣            WordDoc.PageSetup.LeftMargin = 57;//设置左边距
bubuko.com,布布扣            WordDoc.PageSetup.RightMargin = 57;//设置右边距*/
bubuko.com,布布扣
bubuko.com,布布扣//移动焦点并换行
bubuko.com,布布扣object count = 14;
bubuko.com,布布扣object WdLine = Word.WdUnits.wdLine;//换一行;
bubuko.com,布布扣WordApp.Selection.MoveDown(ref WdLine, ref count, ref Nothing);//移动焦点
bubuko.com,布布扣WordApp.Selection.TypeParagraph();//插入段落
bubuko.com,布布扣
bubuko.com,布布扣//文档中创建表格
bubuko.com,布布扣Word.Table newTable = WordDoc.Tables.Add(WordApp.Selection.Range, 12, 3, ref Nothing, ref Nothing);
bubuko.com,布布扣//设置表格样式
bubuko.com,布布扣newTable.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleThickThinLargeGap;
bubuko.com,布布扣newTable.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;
bubuko.com,布布扣newTable.Columns[1].Width = 100f;
bubuko.com,布布扣newTable.Columns[2].Width = 220f;
bubuko.com,布布扣newTable.Columns[3].Width = 105f;
bubuko.com,布布扣
bubuko.com,布布扣//填充表格内容
bubuko.com,布布扣newTable.Cell(1, 1).Range.Text = "产品详细信息表";
bubuko.com,布布扣newTable.Cell(1, 1).Range.Bold = 2;//设置单元格中字体为粗体
bubuko.com,布布扣//合并单元格
bubuko.com,布布扣newTable.Cell(1, 1).Merge(newTable.Cell(1, 3));
bubuko.com,布布扣WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;//垂直居中
bubuko.com,布布扣WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中
bubuko.com,布布扣
bubuko.com,布布扣            //填充表格内容
bubuko.com,布布扣newTable.Cell(2, 1).Range.Text = "产品基本信息";
bubuko.com,布布扣newTable.Cell(2, 1).Range.Font.Color = Word.WdColor.wdColorDarkBlue;//设置单元格内字体颜色
bubuko.com,布布扣//合并单元格
bubuko.com,布布扣newTable.Cell(2, 1).Merge(newTable.Cell(2, 3));
bubuko.com,布布扣WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
bubuko.com,布布扣
bubuko.com,布布扣            //填充表格内容
bubuko.com,布布扣newTable.Cell(3, 1).Range.Text = "品牌名称:";
bubuko.com,布布扣newTable.Cell(3, 2).Range.Text = CheckedInfo;
bubuko.com,布布扣//纵向合并单元格
bubuko.com,布布扣newTable.Cell(3, 3).Select();//选中一行
bubuko.com,布布扣object moveUnit = Word.WdUnits.wdLine;
bubuko.com,布布扣object moveCount = 5;
bubuko.com,布布扣object moveExtend = Word.WdMovementType.wdExtend;
bubuko.com,布布扣WordApp.Selection.MoveDown(ref moveUnit, ref moveCount, ref moveExtend);
bubuko.com,布布扣WordApp.Selection.Cells.Merge();
bubuko.com,布布扣//插入图片
bubuko.com,布布扣string FileName = @"C:\\1.jpg";//图片所在路径
bubuko.com,布布扣object LinkToFile = false;
bubuko.com,布布扣object SaveWithDocument = true;
bubuko.com,布布扣object Anchor = WordDoc.Application.Selection.Range;
bubuko.com,布布扣WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Anchor);
bubuko.com,布布扣WordDoc.Application.ActiveDocument.InlineShapes[1].Width = 100f;//图片宽度
bubuko.com,布布扣WordDoc.Application.ActiveDocument.InlineShapes[1].Height = 100f;//图片高度
bubuko.com,布布扣//将图片设置为四周环绕型
bubuko.com,布布扣Word.Shape s = WordDoc.Application.ActiveDocument.InlineShapes[1].ConvertToShape();
bubuko.com,布布扣s.WrapFormat.Type = Word.WdWrapType.wdWrapSquare;
bubuko.com,布布扣
bubuko.com,布布扣newTable.Cell(12, 1).Range.Text = "产品特殊属性";
bubuko.com,布布扣newTable.Cell(12, 1).Merge(newTable.Cell(12, 3));
bubuko.com,布布扣//在表格中增加行
bubuko.com,布布扣WordDoc.Content.Tables[1].Rows.Add(ref Nothing);
bubuko.com,布布扣
bubuko.com,布布扣            WordDoc.Paragraphs.Last.Range.Text = "文档创建时间:" + DateTime.Now.ToString();//“落款”
bubuko.com,布布扣WordDoc.Paragraphs.Last.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
bubuko.com,布布扣
bubuko.com,布布扣            //文件保存
bubuko.com,布布扣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);
bubuko.com,布布扣WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);
bubuko.com,布布扣WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);
bubuko.com,布布扣message = name + "文档生成成功,以保存到C:CNSI下";
bubuko.com,布布扣}
bubuko.com,布布扣catch
bubuko.com,布布扣{
bubuko.com,布布扣message = "文件导出异常!";
bubuko.com,布布扣}
bubuko.com,布布扣return message;
bubuko.com,布布扣}
bubuko.com,布布扣

 

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

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、如果出现如下错误:

 

 

bubuko.com,布布扣

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

bubuko.com,布布扣

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

标签:style   http   io   color   ar   os   sp   for   strong   

原文地址:http://www.cnblogs.com/ranran/p/4097705.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!