引用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)"

Asp.net操作Word文档,原来这么简单啊!的更多相关文章

  1. ASP.NET生成WORD文档,服务器部署注意事项

    网上转的,留查备用,我服务器装的office2007所以修改的是Microsoft Office word97 - 2003 文档这一个. ASP.NET生成WORD文档服务器部署注意事项 1.Asp ...

  2. iText操作word文档总结

    操作word文档的工具有很多,除了iText之外还有POI,但是POI擅长的功能是操作excel,虽然也可以操作word,但是能力有限,而且还有很多的bug,技术并不成熟,下面就重点介绍一种操作wor ...

  3. C#操作Word文档(加密、解密、对应书签插入分页符)

    原文:C#操作Word文档(加密.解密.对应书签插入分页符) 最近做一个项目,客户要求对已经生成好的RTF文件中的内容进行分页显示,由于之前对这方面没有什么了解,后来在网上也找了相关的资料,并结合自己 ...

  4. 利用Python操作Word文档【图片】

    利用Python操作Word文档

  5. asp.net生成word文档服务器配置

    一.asp.net生成word文档,布署到正式的服务器上就出现           错误:System.Runtime.InteropServices.COMException (0x800A1098 ...

  6. Java文件操作系列[3]——使用jacob操作word文档

    Java对word文档的操作需要通过第三方组件实现,例如jacob.iText.POI和java2word等.jacob组件的功能最强大,可以操作word,Excel等格式的文件.该组件调用的的是操作 ...

  7. QTP操作word文档

    QTP可以对word文档进行操作,这里最主要展示的是向word文档写入内容,并保存的功能. Option explicit Dim wordApp Set wordApp = createobject ...

  8. asp.net 将word文档进行编辑并导出一个新的word

    最近做项目,需要多word文档进行编辑并导出一个新的word,在最初的word编辑中留下特定的字符串用来替换,然后在本地生成一个新的word文档,并且不修改服务器中的word文档,这样才能保证服务器中 ...

  9. c#中操作word文档-四、对象模型

    转自:http://blog.csdn.net/ruby97/article/details/7406806 Word对象模型  (.Net Perspective) 本文主要针对在Visual St ...

随机推荐

  1. jmeter分布式压力测试之添加压力机

    前提:多台电脑可以互相ping通 1.jmeter的bin目录下的jmeter.properties配置文件里面remote_hosts添加测试机的 IP:端口号,用英文“,”逗号间隔例如:remot ...

  2. C语言版本:循环单链表的实现

    SClist.h #ifndef __SCLIST_H__ #define __SCLIST_H__ #include<cstdio> #include<malloc.h> # ...

  3. 第二阶段Sprint9

    昨天:重新规划主界面,把视频录制暂放到主页面里 今天:查看有关“共享平台”的资料,看如何实现上传下载功能,并尝试编码, 遇到的问题:看不懂什么意思,照例子做不行,还得需要联网等

  4. java 封装,继承,多态基础

    什么是封装? 1,对象数据和在.操作该对象的指令都是对象自身的一部分,能够实现尽可能对外部隐藏数据. 2,实际项目开发中,使用封装最多的就是实体类. 什么是继承? 1,继承是面向对象程序设计能提高效率 ...

  5. kickstart自动化安装

    preboot execute environment预启动执行环境--intel开发的技术,计算机可以通过pxe协议从网络引导启动. 工作模式为客户端/服务器端的c/s模式 客户端从远端服务器下载镜 ...

  6. Alpha冲刺——测试随笔

    写在前面 作业链接 测试工作安排 测试模块 用户登录 日常管理模块 项目展示模块 测试计划 用户登录 测试功能 测试项 输入/操作 检验点 预期效果 用户登录 登录动作 点击登录 报错提示 无法登录, ...

  7. vue 请求后台数据2(copy)

    https://blog.csdn.net/vergilgeekopen/article/details/68954940 需要引用vue-resource 安装请参考https://github.c ...

  8. js & parseFloat & toFixed

    js & parseFloat & toFixed https://repl.it/languages/javascript https://repl.it/repls/MintyBa ...

  9. 04 Spring的@Autowired注解、@Resource注解、@Service注解

    什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事务,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...

  10. 【刷题】LOJ 6225 「网络流 24 题」火星探险问题

    题目描述 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车. 登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动. 探测车在移动中还必须采集岩石标本. 每一块岩石标本由最先遇到它 ...