C# WORD *** 作实现代码

C# WORD *** 作实现代码,第1张

概述1.先通过程序生成报表样式的HTML页面,然后修改HTML页面的后缀名为DOC。2.定制WORD文档的模板文件,在C#中 *** 作WORD模板,生成新的WORD文档。第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如 1.先通过程序生成报表样式的HTML页面,然后修改HTML页面的后缀名为DOC。
2.定制WORD文档的模板文件,在C#中 *** 作WORD模板,生成新的WORD文档。
第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失。这样对于客户来说可能是一个无法通过的方案。第二方案比较复杂,需要调用OFFICE的WORD组件通过C#来 *** 作WORD,进而生成WORD。此方法类似于我们在c#中的后台拼接数据。虽然麻烦,但是能够灵活定制,只不过是 *** 作WORD对象而已。
经过再三考虑:决定用第二种方法来生成WORD报告文档。
通过自己的实践,这个需求总算是搞定了,在实际开发的过程中,遇到了这样那样的问题,还好,通过不断的查找网络资源,结合实际开发中的情况,问题都得到了解决。现将本人在开发过程中的一些理解与经验总结一下:
在VS2008平台下,引用.net-Microsoft.Office.Interop.Word.12,这样就可以在程序用 *** 作WORD对象了。
通过简单执行,报了80070005错误,这个错误是因为权限不够,需要在DCOM配置中更改.net和IIS用户的 *** 作权限,具体修改过程如下: 解决方法一:
1.控制面板-》管理工具-》组件服务-》计算机-》我的电脑-》DCom配置-》找到Microsoft Word文档之后,单击属性打开此应 用程序的属性对话框。
2.单击标识选项卡,然后选择交互式用户。
3.单击"安全"选项卡,分别在"启动和激活权限"和"访问权限"组中选中"自定义",然后自定义->编辑->添加ASP.NET账户和IUSER_计算机 名。
4. 确保允许每个用户访问,然后单击确定。
5. 单击确定关闭 DCOMCNFG。
如果上述方法不能解决问题,就应该是权限问题,请尝试用下面的方法:
在web.config中使用身份模拟,在<system.web>节中加入 <IDentity impersonate="true" username="你的用户名 " password="密码 "/>
</system.web>
解决了上述问题,开始考虑如何创建WORD模板文件,WORD的模板文件其实就是通过书签来添加内容的。也就是通过在WORD文档中创建书签,然后在程序中获取模板文件的所有书签,通过给书签赋值来进行文档生成的。
在程序中的 *** 作流程如下:
声明WORD程序的对象 → 声明一个WORD文档对象 → 获取当前的 *** 作文档对象 → 获取文档所有的书签 → 将数据库数据赋值到对应的书签 → 将文档另存为指定的文件夹下.
下面将针对农业植物测试报告来分析具体的代码实现:
复制代码 代码如下:
//生成WORD程序对象和WORD文档对象
Microsoft.Office.Interop.Word.Application appWord = new Application();
Microsoft.Office.Interop.Word.document doc = new document();
object oMissing = System.Reflection.Missing.Value;//这个是什么东西,我始终没搞明白-_-
//打开模板文档,并指定doc的文档类型
object objTemplate = Server.MapPath(p_TemplatePath);
object objDOCTYPE = WddocumentType.wdTypedocument;
doc = (document)appWord.documents.Add(ref objTemplate,ref objFalse,ref objDOCTYPE,ref objTrue);
//获取模板中所有的书签
Bookmarks odf = doc.Bookmarks;
string[] testtableremarks = { "ApplyNo","AuditingDate","Auditor","CheckDate","Checker"};
string[] testtablevalues = { "ApplyNo","Checker",};
//循环所有的书签,并给书签赋值
for (int oIndex = 0; oIndex < testtableremarks.Length; oIndex++)
{
obDD_name = WD + testtableremarks[oIndex];
doc.Bookmarks.get_Item(ref obDD_name).Range.Text = p_TestReporttable.Rows[0][testtablevalues [oIndex]].ToString();//此处Range也是WORD中很重要的一个对象,就是当前 *** 作参数所在的区域
}
//第四步 生成word,将当前的文档对象另存为指定的路径,然后关闭doc对象。关闭应用程序
object filename = Server.MapPath(p_SavePath) + "\\Testing_" + DateTime.Now.ToShortDateString() + ".doc";
object miss = System.Reflection.Missing.Value;
doc.SaveAs(ref filename,ref miss,ref miss);
object missingValue = Type.Missing;
object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges;
doc.Close(ref doNotSaveChanges,ref missingValue,ref missingValue);
appWord.Application.Quit(ref miss,ref miss);
doc = null;
appWord = null;
this.HID_ShowMessage.Value = "生成成功!";

上述代码就是一个通过模板文件生成WORD的过程。其实也就是一个替换书签内容的过程。
在开发的过程中,有些数据是动态增加的,假如我要向一个表格中动态的添加几行数据,就无法用替换书签的方式来进行 *** 作,需要通过程序在文档页面的表格中添加行。
向表格中添加行,有两种 *** 作形式:一种是在WORD模板中已经存在了一个表格。一种是我们在程序中直接添加一个表格对象。
第一种情况下,需要注意:在WORD模板中要 *** 作的表格中,不能有纵向合并的单元格,不然程序无法获取到当前要 *** 作对象导致程序报错.单元格的合并,我们可以在程序中控制。
第二种情况下就需要我们通过程序去直接添加表格了。
生成表格的代码具体如下:
1.获取文档中已存在的表格:
Microsoft.Office.Interop.Word.table charactertable = doc.tables[2];//在document对象的集合 *** 作中,起始点是从1开始,并不是从0开始的,此处需要注意。
2.在文档中直接生成表格,首先要获取插入表格的位置,然后添加表格对象:
object oEndOfDoc = "\\endofdoc";//WORD中预定义的书签,还有很多,此处就不一一列举。
object oMissing = System.Reflection.Missing.Value;
Range wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;//获取当前文档的末尾位置。
wrdRng.InsertAfter(" ");//插入一行,此处不能用 wrdRng.InsertAfter(""),如果用这个,就不能换行,我也不知道为什么。
复制代码 代码如下:
object oCollapseEnd = Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd;
object oPageBreak = Microsoft.Office.Interop.Word.WdBreakType.wdPageBreak;//分页符
wrdRng.Collapse(ref oCollapseEnd);
wrdRng.InsertBreak(ref oPageBreak);//插入了一页
wrdRng.Collapse(ref oCollapseEnd);
wrdRng.InsertAfter("图片信息");
wrdRng.Font.Size = 20;//指定 *** 作对象的文字大小
wrdRng.Font.Bold = 1;//指定 *** 作对象的粗体:1为粗体,0为正常
wrdRng.ParagraphFormat.Alignment = WdParagraphAlignment.wdalignParagraphCenter;//指定 *** 作区域的文字布局:居中对齐
//上述代码的意思是:找到当前的末尾位置,然后插入一个分页符,相当于跳到了一个新页,在这个新页的顶端写入文字“图片信息”,并指定文字大小为20,粗体居中显示。
wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;
wrdRng.InsertAfter(" ");
wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;
wrdRng.InsertParagraphAfter();//插入一个段落,在此段落上插入一个2行一列的表格。
Microsoft.Office.Interop.Word.table newtable = doc.tables.Add(wrdRng,2,1,ref oMissing,ref oMissing);
我们还可以对表格进行格式设置,此处我们就不在一一列举。
3.下面我们分析一下对表格的单元格的 *** 作:合并,拆分。这个就需要我们根据实际表格来进行 *** 作:
//获取具体的某个单元格(1,1),获取第一行第一列的单元格
Cell cell = doc.tables[1].Cell(1,1);
cell.Range.Text="Text";//指定当前单元格的内容为Text
在table的 *** 作中,添加新行:
object beforeRow = doc.tables[1].Rows[2];//此行是先获取到第二行
doc.tables[1].Rows.Add(ref beforeRow);//效果类似于在WORD中此表格的第二行上进行【插入行】 *** 作,插入的新行将会插入到当前行的上一行中,格式也是和此行一致的。
//合并单元格:感觉在此处合并单元格挺傻瓜的,你只需要指定你要合并的起始单元格和结束单元格,然后通过Merge *** 作就行了
Cell cell = doc.tables[1].Cell(iRow,2);//列合并
cell.Merge(doc.tables[1].Cell(iRow,6));
Cell cell1 = doc.tables[1].Cell(iRow - 1,1);//行合并
cell1.Merge(doc.tables[1].Cell(iRow + 1,1));
上述 *** 作就是在此程序中用到的一些知识点,还有好多的东西需要去熟悉、理解。
另外,在程序的测试过程中发现,当执行一次文档生成后,在资源管理器中始终有winword.exe进程杀不掉,目前的解决办法是:直接杀进程,代码如下:
复制代码 代码如下:
protected voID killAllProcess() // 杀掉所有winword.exe进程
{
System.Diagnostics.Process[] myPs;
myPs = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process p in myPs)
{
if (p.ID != 0)
{
string myS = "WINWORD.EXE" + p.Processname + " ID:" + p.ID.ToString();
try
{
if (p.Modules != null)
if (p.Modules.Count > 0)
{
System.Diagnostics.ProcessModule pm = p.Modules[0];
myS += "\n Modules[0].filename:" + pm.filename;
myS += "\n Modules[0].Modulename:" + pm.Modulename;
myS += "\n Modules[0].FiLeversionInfo:\n" + pm.FiLeversionInfo.ToString();
if (pm.Modulename.Tolower() == "winword.exe")
p.Kill();
}
}
catch
{ }
finally
{

}
}
}
}

目前为止,一个WORD文档就生成了。上述为我在这个程序开发中遇到的问题和解决方法,可能有好多地方都是考虑不全的,如果在程序开发中对WORD的 *** 作有新的认识的话,欢迎和我沟通交流,彼此提高!
下边是在网上一些比较好的摘抄:
创建新Word
复制代码 代码如下:
object oMissing = System.Reflection.Missing.Value;
Word._Application oWord;
Word._document odoc;
oWord = new Word.Application();
oWord.Visible = true;
odoc = oWord.documents.Add(ref oMissing,
ref oMissing,ref oMissing);

打开文档:
复制代码 代码如下:
object oMissing = System.Reflection.Missing.Value;
Word._Application oWord;
Word._document odoc;
oWord = new Word.Application();
oWord.Visible = true;
object filename = @"E:CCCXcxxtestDoc.doc";
odoc = oWord.documents.Open(ref filename,ref oMissing);

导入模板
复制代码 代码如下:
object oMissing = System.Reflection.Missing.Value;
Word._Application oWord;
Word._document odoc;
oWord = new Word.Application();
oWord.Visible = true;
object filename = @"E:XXXCCXTest.doc";
odoc = oWord.documents.Add(ref filename,ref oMissing);

.添加新表
复制代码 代码如下:
object oMissing = System.Reflection.Missing.Value;
Word._Application oWord;
Word._document odoc;
oWord = new Word.Application();
oWord.Visible = true;
odoc = oWord.documents.Add(ref oMissing,ref oMissing);
object start = 0;
object end = 0;
Word.Range tableLocation = odoc.Range(ref start,ref end);
odoc.tables.Add(tableLocation,3,4,ref oMissing);

.表插入行
复制代码 代码如下:
object oMissing = System.Reflection.Missing.Value;
Word._Application oWord;
Word._document odoc;
oWord = new Word.Application();
oWord.Visible = true;
odoc = oWord.documents.Add(ref oMissing,ref oMissing);
Word.table newtable = odoc.tables[1];
object beforeRow = newtable.Rows[1];
newtable.Rows.Add(ref beforeRow);

.单元格合并
复制代码 代码如下:
object oMissing = System.Reflection.Missing.Value;
Word._Application oWord;
Word._document odoc;
oWord = new Word.Application();
oWord.Visible = true;
odoc = oWord.documents.Add(ref oMissing,ref oMissing);
Word.table newtable = odoc.tables[1];
object beforeRow = newtable.Rows[1];
newtable.Rows.Add(ref beforeRow);
Word.Cell cell = newtable.Cell(1,1);
cell.Merge(newtable.Cell(1,2));

.单元格分离
复制代码 代码如下:
object oMissing = System.Reflection.Missing.Value;
Word._Application oWord;
Word._document odoc;
oWord = new Word.Application();
oWord.Visible = true;
odoc = oWord.documents.Add( oMissing,2));
object Rownum = 2;
object Columnnum = 2;
cell.Split(ref Rownum,ref Columnnum);

通过段落控制插入
复制代码 代码如下:
object oMissing = System.Reflection.Missing.Value;
object oEndOfDoc = "\endofdoc"; /**//* endofdoc is a predefined bookmark */
//Start Word and create a new document.
Word._Application oWord;
Word._document odoc;
oWord = new Word.Application();
oWord.Visible = true;
odoc = oWord.documents.Add(ref oMissing,ref oMissing);
//Insert a paragraph at the beginning of the document.
Word.Paragraph oPara1;
oPara1 = odoc.Content.Paragraphs.Add(ref oMissing);
oPara1.Range.Text = "heading 1";
oPara1.Range.Font.Bold = 1;
oPara1.Format.SpaceAfter = 24; //24 pt spacing after paragraph.
oPara1.Range.InsertParagraphAfter();
您可能感兴趣的文章:C#对Word文档的创建、插入表格、设置样式等 *** 作实例C#设置Word文档背景的三种方法(纯色/渐变/图片背景)C# 向Word中设置/更改文本方向的方法(两种)C#添加、读取Word脚注尾注的方法C#实现通过模板自动创建Word文档的方法C# Word 类库的深入理解比较全的一个C# *** 作word文档示例C# 利用Aspose.Words.dll将 Word 转成PDFasp.net(c#)下读取word文档的方法小结C#如何更改Word的语言设置 总结

以上是内存溢出为你收集整理的C# WORD *** 作实现代码全部内容,希望文章能够帮你解决C# WORD *** 作实现代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1253181.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存