分享帖:不使用Word组件,根据Word模板生成新Word

马老虎 2011-01-26 02:18:56
首先说该方法不使用COM组件,不使用开源组件(貌似没有啥开源的组件)....
------------------
先说说我想这个方法的原因吧。
我之前在CS程序中导出WORD 是使用COM组件,一直使用的没问题。
客户的新需求将CS改成BS,我直接套用原来的方法。当网站完成后部署到服务器上,发现无法调用WORD COM组件,貌似是权限的问题。
又谷歌又百度有“病”的,解决方法就是那么俩个..... 我这就不提了,反正是一个不好使一个危险性大。

最后我上MSDN上查询发现一篇文章:
http://support.microsoft.com/kb/257757/zh-cn

文章的大概意思是不推荐在服务器上使用office自动化。大概看了下他说的解决方案,突然看见个字眼 XML

接下来进入正题:
需求:读取WORD模板,替换指定的字符标签,保存新的Word。不使用COM组件,不使用开源组件...
思路:将Word模板另存为XML文件,编辑XML设置标签保存。然后程序读取该XML替换其中的内容,将XML的内容另存为后缀为.doc的文件。
注:由于是XML里面有好多节点,我们最后把我们的标签放到一个节点内且是连续字符串方便替换。
核心代码:(其实挺简单的)

/// <summary>
/// 读取Word模板的XML文件,替换标签保存Word
/// </summary>
/// <param name="sSourceDocUrl">模板地址</param>
/// <param name="sSaveDocUrl">保存到路径</param>
/// <param name="list">标签对应文本</param>
/// <param name="sErrMsg">返回信息</param>
/// <returns></returns>
public bool DoWordXmlANDSave(string sSourceDocUrl,string sSaveDocUrl,List<MarkWithText> list,ref string sErrMsg)
{
return WirteToDOC(ReplaceMarkToText(ReadToString(sSourceDocUrl), list), sSaveDocUrl, ref sErrMsg);
}

private string ReadToString(string sFileFullUrl)
{
StreamReader sReader = new StreamReader(sFileFullUrl);
return sReader.ReadToEnd();
}


private string ReplaceMarkToText(string sSourceText,List<MarkWithText> list)
{
if (string.IsNullOrEmpty(sSourceText))
return "";
if (list.Count == 0)
return sSourceText;

string sReturnText = sSourceText;

foreach (MarkWithText mt in list)
{
sReturnText = sReturnText.Replace(mt.BookMark, mt.ReplaceValue);
}

return sReturnText;
}

private bool WirteToDOC(string sSourceText,string sFileFullUrl,ref string sErrMsg)
{

if (!sFileFullUrl.ToUpper().EndsWith(".DOC"))
sFileFullUrl = sFileFullUrl + ".doc";
try
{
File.WriteAllText(sFileFullUrl, sSourceText);
return true;
}
catch (Exception ex)
{

sErrMsg += "|Function:WirteToDOC ErrMsg:" + ex.Message;
return false;
}

}






Word模板中有图片也没问题。且速度很快。这样就无需为了COM组件权限的问题烦恼了。
详细的内容查看:http://www.myaspx.com/Example/Word/OupPutWordByWordXmlTemp.htm
总之向大家分享下,这是我几天的一点点收获,希望让大家少走点弯路。
在此祝福大家新年快乐
大家有任何更好的方法,请联系我哦。
QQ:124339316


...全文
1155 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
poletiny 2012-05-29
  • 打赏
  • 举报
回复
对于表格之类的 该方法可用么?
poletiny 2012-05-29
  • 打赏
  • 举报
回复
楼主源代码有么 求源代码。。。。
tinypole1@163.com
xiaomagex 2012-03-31
  • 打赏
  • 举报
回复
应该是自己设置吧,比如加【】[Quote=引用 44 楼 的回复:]

请问字符标签在哪设置的??
[/Quote]
Q792583036 2011-11-26
  • 打赏
  • 举报
回复
学习了,楼主是个大好淫啊!
xiaoshen1360 2011-08-19
  • 打赏
  • 举报
回复
请问字符标签在哪设置的??
confidenceyu 2011-07-20
  • 打赏
  • 举报
回复
刻苦学习
段传涛 2011-07-20
  • 打赏
  • 举报
回复
做个标记, 学习下吧。
angygaga 2011-07-20
  • 打赏
  • 举报
回复
[Quote=关注]
关注中
[/Quote]
111
indusl 2011-07-20
  • 打赏
  • 举报
回复
关注中
C_S_D_N_119 2011-07-20
  • 打赏
  • 举报
回复
回复内容太短了!
ChinaXtHuLang 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 meqxx 的回复:]

这个方法我也用过
在excel上也可以用xml
[/Quote]
我也用过。。呵呵呵
jpcai2012 2011-03-10
  • 打赏
  • 举报
回复
我也只用过XML的
马老虎 2011-03-10
  • 打赏
  • 举报
回复
v风雪山神庙v 2011-02-11
  • 打赏
  • 举报
回复
这个方法我也用过
在excel上也可以用xml

马老虎 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 winner2050 的回复:]

xml 早招式我很久前就会用了。
office 2007 刚刚出来的时候遇到这种word文档会警告的,不知道什么时候开始不会进行过于严格的检查了。
以后这种招数还可以长期使用。
[/Quote]
尤其是根据模板生成Word这方法好。
马老虎 2011-01-30
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 mmm306306 的回复:]

引用 23 楼 fangxuan 的回复:

COM组件用在BS结构中是存在你说的问题。
另外,貌似你用.html格式的模板,替换后response抛出.doc的word文档,不是更简单么

那种假的Word中office中不能正确的打开。
就像LS上人说的,一些样式呀图片呀都会单独建立一个文件夹里的。。。
[/Quote]
刚发现上面好几楼都没了
office2007会有提示。。。
马老虎 2011-01-30
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 fangxuan 的回复:]

COM组件用在BS结构中是存在你说的问题。
另外,貌似你用.html格式的模板,替换后response抛出.doc的word文档,不是更简单么
[/Quote]
那种假的Word中office中不能正确的打开。
就像LS上人说的,一些样式呀图片呀都会单独建立一个文件夹里的。。。
白云任去留 2011-01-30
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 mmm306306 的回复:]

引用 24 楼 mmm306306 的回复:

引用 23 楼 fangxuan 的回复:

COM组件用在BS结构中是存在你说的问题。
另外,貌似你用.html格式的模板,替换后response抛出.doc的word文档,不是更简单么

那种假的Word中office中不能正确的打开。
就像LS上人说的,一些样式呀图片呀都会单独建立一个文件夹里的。。。

刚发现上面好几楼都……
[/Quote]
是的,前几天我也发现了,有些帖子好几楼都没了
白云任去留 2011-01-28
  • 打赏
  • 举报
回复
COM组件用在BS结构中是存在你说的问题。
另外,貌似你用.html格式的模板,替换后response抛出.doc的word文档,不是更简单么
winner2050 2011-01-27
  • 打赏
  • 举报
回复
xml 早招式我很久前就会用了。
office 2007 刚刚出来的时候遇到这种word文档会警告的,不知道什么时候开始不会进行过于严格的检查了。
以后这种招数还可以长期使用。
加载更多回复(9)

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧