[size=medium]
现象简述:
将生成的word文档,作为mail的附件发送给客服部门。连续点击发送按钮报错。一般点击到第2,3次时报错。(winform)
在发现这个错误时我有点不解因为
a.c#生成word开发过,
b.c#发送mail开发过。
c.二者结合是再正常不过的业务需求也开发过(控制台程序)
纠结…………
好了找错吧!
主要程序代码
fileName = Func_cfg.getBakPath() + fileName;
string dotName = Func_cfg.getTemplatePath() + "工单.dot";
WordUtility wordUtility = new WordUtility(dotName);
wordUtility.createWordDocment();
wordUtility.replaceItems(ht);
wordUtility.saveAs(@fileName);//这句报错 文件只读
wordUtility.close();
//发送报表
SendReport(fileName);
1.怀疑程序写法问题,导致word进程没有被关闭。
wordUtility.close();
wordUtility类的close方法如下
public void close()
{
object o = false;
oDoc.Close(ref o, ref oMissing, ref oMissing);
oDoc = null;
oWord.Quit(ref o, ref oMissing, ref oMissing);
oWord = null;
}
查看任务管理器,在错误发生前,没有未关闭的进程。
又查了一下参数的意义,觉得问题不在这里。
2.调查了一下saveas()方法参数意义 也没有发现问题
3.在同事的帮助下修改了写法
fileName = Func_cfg.getTempPath() + fileName;
string bakFilePath = Func_cfg.getBakPath() + fileName;
string dotName = Func_cfg.getTemplatePath() + "工单.dot";
WordUtility wordUtility = new WordUtility(dotName);
wordUtility.createWordDocment();
wordUtility.replaceItems(ht);
wordUtility.saveAs(@fileName);
wordUtility.close();
SendReport(fileName);
MyUtility.copyFile(fileName, bakFilePath, true);
MyUtility.deleFile(fileName);//这句报错 说文件被打开
貌似跟1一样
将
MyUtility.deleFile(fileName);
前移如下
wordUtility.close();
MyUtility.deleFile(fileName);//断点放在这句
SendReport(fileName);
执行到断点处时一切正常,由此判断word生成没有问题,问题出在发送mail的方法
SendReport里,再根据经验推断,很可能附件语句占用了word文档进程。
sMTPUtility.addAttachment(fullFileName);
4.找到问题的所在开始想解决方法。
MailMessage message = new MailMessage ();
message .Dispose();
不起作用
5.到网上查。也有人遇到此问题。但未找到解决方法,不过还是找到了点解决思路。
网上说stream没有关闭。可是保存附件时并没有打开stream?难道是dot添加附件是自己打开的?
下面能做是尽快找到关闭流的方法。
还好找到了,遍历后关闭。
this.message.Attachments[i].ContentStream.Close();
6.测试后,一切ok。
7.思考:上面c中提到程序为何没有发生?也曾经对一个word文档多次发送?
原来c是控制台程序运行完一次就释放了。
8.致谢:感谢同事,“感谢”微软。
分享到:
相关推荐
c#根据word模板生成word文档 附件中包含程序源码以及word模板文件 需要引用的DLL已经在源码中标出
将assets中.xml中的doc文件中,就会生成word文档和excel文档
asp生成word文档,看了就明白
Java POI 生成Word文档,支持图片插入,关键是修改XML部分,本人已测试通过。
本程序编写环境.NET 4.0、 VS2010,语言为C#,通过引用Aspose.Words.dll,不依赖Office安装,将一定格式的Excel文档转换为Word文件,例如:Excel表中表头为 单位名称 联系人 联系电话 会自动检测出字段[字段0:单位...
利用Aspose.Words.dll动态生成Word文档 步骤:1、创建word模板,在模板中指定地方插入书签 2、运行代码 功能:1、动态生成Word文档 2、给图片添加文字水印
软件简介: Word文档批量生成工具是一款基于Python和PyQt5开发的桌面应用程序,...批量生成并压缩文件:用户可以点击“批量生成并压缩文件”按钮,将生成的Word文档批量压缩成一个ZIP文件,方便用户进行文件管理和传输
js将HTML导出生成word文档,方式简单,不需要修改浏览器配置,引入两个js就可以解决该问题,亲测有效
利用freemaker 生成 word文档
Qt生成word文档
开发语言java 可以根据word模板生成word文档
java XML解析方式实现自动生成word文档,文档中主要描述word模板的使用方法,文件中带有案例代码,可以方便理解
需下载安装office,WPS不支持,Winform自动生成Word文档,报错重新引用一下Microsoft.Office.Interop.Word.dll。
本工具基于Excel表格信息实现标准化word文档的一键生成,支持在段落中插入文字、插入图片和在表格中插入文字。 对于不懂编程的人,只要弄清Excel表格的填写,便可以修改成适合自己工作场景的办公小助手,比如制作...
最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用docx4j生成word文档。里面包括完整代码和所需jar包。
C# 生成word文档,包括页眉,页码,表格、图片、字体等的编辑
用C#生成word文档系列,用C#生成word文档系列,用C#生成word文档系列,用C#生成word文档系列
PhpOffice这是一个强大的PHP库用于创建Word文件。事实上许多办公软件可以打开.docx文件(Office Open XML) 。利用这个库可以插入文本、Text分段、页分段、页头/页脚、表格、列表元素、超链接、并进行格式化。
thinkphp把数据库内容生成word,且可以下载到本地,一个类放到指定文件夹里,另一个则是控制器,自行修改即可。
将SQL SERVER数据库表结构自动生成word文档,速度快,效率高