当前位置: 移动技术网 > IT编程>开发语言>c# > 利用C#代码将html样式文件与Word文档互换的方法

利用C#代码将html样式文件与Word文档互换的方法

2019年07月18日  | 移动技术网IT编程  | 我要评论

一、c#代码将html样式文件转为word文档

首先有个这样的需求,将以下网页内容下载为word文件。

html代码:

<div class="modal-body">
 <div style="height:600px;width:550px; margin:0 auto;">
 <table style="border-collapse:separate;border-spacing:10px;width: 100%">
  <tr>
  <td style="text-align: center;font-size: 30px;font-weight: bold">中标通知书<hr /></td>
  </tr>
  <tr>
  <td style="text-align: left;font-size:20px;">xx</td>
  </tr>
  <tr>
  <td style="text-align: left"> “xxxx物资平台”zy1703220001号标的开标结果为贵方中标,现通知如下:</td>
  </tr>
 </table>
 <table border="1" cellspacing="0" cellpadding="10" style="border-collapse:separate;height: 300px;">
  <tr style="text-align:center;">
  <th>品名</th>
  <th>资源编号</th>
  <th>数量(吨)</th>
  <th>中标价格(含税总金额:元)</th>
  <th>钢厂</th>
  <th>存放地(提货地)</th>
  </tr>
  <tr style="text-align:center;">
  <td>冷轧窄带</td>
  <td>zy1703220001</td>
  <td>25.725</td>
  <td>47500.00</td>
  <td>xx</td>
  <td>xxxxxx</td>
  </tr>
  <tr>
  <td colspan="6">备注:xxxxxx</td>
  </tr>
 </table>
 <table style="border-collapse:separate;border-spacing:10px;width: 100%">
  <tr>
  <td style="text-align: left">
   请贵方在收到通知书的5个工作日内交齐全额货款并签订合同。
  </td>
  </tr>
  <tr>
  <td style="text-align: left">
   特此通知。
  </td>
  </tr>
  <tr>
  <td style="text-align: right">
   xxxx物资平台
  </td>
  </tr>
  <tr>
  <td style="text-align:right">
   2017 年 4月 16 日
  </td>
  </tr>
 </table>

 </div>
</div>

样式展示:

第一步:封装一个方法

1:在控制器biddingnoticemanagecontroller创建一个downbiddingnoticemodal方法。(采用的mvc模式)

2:根据id查询当前中标信息(ef)

3:建一个中标通知书的html模板页(数据字段自定义占位符)

  3-1:注:html模板中不需要<html>、<head>、<title>、<body>等标签。只是单纯的div布局标签

  3-2:布局标签中的样式必须是内联,就是写在标签中,不能写在外部.css中。

4:通过stream、streamreader两个类来读取这个模板文件(返回的是html字符串)。

5:2中查询出数据(对应字段)替换4中返回的html字符串中的占位符。

6:关键代码

 stringbuilder sb = new stringbuilder();
  sb.append(
  "<html xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" xmlns:m=\"http://schemas.microsoft.com/office/2004/12/omml\"xmlns = \"http://www.w3.org/tr/rec-html40\">");
  sb.append(html);
  sb.append("</html>");

7:用法:在页面前端写一个a标签指向这个方法即可下载为word文件了。

html模板文件:

<div class="modal-body">
 <div style="height:600px;width:550px; margin:0 auto;">
 <table style="border-collapse:separate;border-spacing:10px;width: 100%">
  <tr>
  <td style="text-align: center;font-size: 30px;font-weight: bold">中标通知书<hr /></td>
  </tr>
  <tr>
  <td style="text-align: left;font-size:20px;">@biddername</td>
  </tr>
  <tr>
  <td style="text-align: left"> “xxxx物资平台”@resourcecode号标的开标结果为贵方中标,现通知如下:</td>
  </tr>
 </table>
 <table border="1" cellspacing="0" cellpadding="10" style="border-collapse:separate;height: 300px;">
  <tr style="text-align:center;">
  <th>品名</th>
  <th>资源编号</th>
  <th>数量(@unit)</th>
  <th>中标价格(含税总金额:元)</th>
  <th>钢厂</th>
  <th>存放地(提货地)</th>
  </tr>
  <tr style="text-align:center;">
  <td>@resourcename</td>
  <td>@resourcecode</td>
  <td>@count</td>
  <td>@tenderprice</td>
  <td>@brandname</td>
  <td>@inventoryplace</td>
  </tr>
  <tr>
  <td colspan="6">备注:@remarks</td>
  </tr>
 </table>
 <table style="border-collapse:separate;border-spacing:10px;width: 100%">
  <tr>
  <td style="text-align: left">
   请贵方在收到通知书的5个工作日内交齐全额货款并签订合同。
  </td>
  </tr>
  <tr>
  <td style="text-align: left">
   特此通知。
  </td>
  </tr>
  <tr>
  <td style="text-align: right">
   xxxx物资平台
  </td>
  </tr>
  <tr>
  <td style="text-align:right">
   @year 年 @moth 月 @day 日
  </td>
  </tr>
 </table>

 </div>
</div>
 /// <summary>
 /// 下载中标通知书
 /// 用法:前端一个a标签指向这个控制器的这个方法
 /// </summary>
 /// <param name="id">中标通知书id</param>
 [abpmvcauthorize(biddingnoticeapppermissions.biddingnotice)]

 public actionresult downbiddingnoticemodal(long id)
 {
  #region 读取模板 
  var html = getbidtempstrng();
  #endregion

  #region 根据id读取中标内容 替换数据
  var model = _biddingnoticerepository.firstordefault(id);
  if (model != null)
  {
  html = html.replace("@brandname", model.brandname).replace("@resourcecode", model.resourcecode)
   .replace("@resourcename", model.resourcename).replace("@count", model.count.tostring())
   .replace("@tenderprice", model.tenderprice.tostring()).replace("@biddername", model.biddername)
   .replace("@inventoryplace", model.inventoryplace).replace("@remarks", model.remarks)
   .replace("@year", model.creationtime.year.tostring()).replace("@moth", model.creationtime.month.tostring())
   .replace("@day", model.creationtime.day.tostring()).replace("@unit", model.unit);
  }
  else
  {
  html = html.replace("@brandname", "xxxxx").replace("@resourcecode", "zyxxxxxxxx")
   .replace("@resourcename", "xxxxx").replace("@count", "0")
   .replace("@tenderprice", "0").replace("@biddername", "xxxxx")
   .replace("@inventoryplace", "xxxxx").replace("@remarks", "xxxxxxxx")
   .replace("@year", "xxxx").replace("@moth", "xx")
   .replace("@day", "xx").replace("@unit", "x");
  }
  #endregion

  #region 转换为word文档样式

  stringbuilder sb = new stringbuilder();
  sb.append(
  "<html xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" xmlns:m=\"http://schemas.microsoft.com/office/2004/12/omml\"xmlns = \"http://www.w3.org/tr/rec-html40\">");
  sb.append(html);
  sb.append("</html>");
  return file(encoding.utf8.getbytes(sb.tostring()), "application/msword", $"中标通知书.doc");

  #endregion
 }

 /// <summary>
 /// 读取中标通知书模板
 /// </summary>
 /// <returns></returns>
 private string getbidtempstrng()
 {
  stringbuilder sbhtml = new stringbuilder();
  // 读取模板替换数据
  var path = server.mappath("~/common/bidtemplace/bidtemp.html");
  using (stream instream = new filestream(path, filemode.openorcreate, fileaccess.read))
  using (streamreader outstream = new streamreader(instream, encoding.default))
  {
  while (!outstream.endofstream)
  {
   sbhtml.append(outstream.readline());
  }
  }
  var html = sbhtml.tostring();
  return html;
 }

二、c# 将word文档转换为html

日常生活中,我们总是在word中进行文字的编辑,它不仅能够保存text文本,还可以保存文本的格式等等。那么如果我要将一word文档上的内容展示在网页上,该怎么做呢?这里我提供了一个小工具,你可以将word转换为html,需要显示的话,可以直接访问该html,废话不多说,下面看代码。

页面代码:

<span style="font-size:18px;"><div> 
<input id="file1" type="file" runat="server"/> 
<asp:button id="btnconvert" runat="server" text="转换" onclick="btnconvert_click" /> 
</div></span> 

c#代码:

<span style="font-size:18px;" deep="5">using system; 
using system.data; 
using system.configuration; 
using system.collections; 
using system.collections.generic; 
using system.linq; 
using system.web; 
using system.web.security; 
using system.web.ui; 
using system.web.ui.webcontrols; 
using system.web.ui.webcontrols.webparts; 
using system.web.ui.htmlcontrols; 
using system.io; 

protected void page_load(object sender, eventargs e) 
{ 

} 

/// <summary> 
/// 将word转换为html 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
protected void btnconvert_click(object sender, eventargs e) 
{ 
try 
{ 

//上传 
//uploadword(file1); 
//转换 
wordtohtml(file1); 
} 
catch (exception ex) 
{ 
throw ex; 
} 
finally 
{ 
response.write("恭喜,转换成功!"); 
} 

} 

//上传文件并转换为html wordtohtml(wordfilepath) 
///<summary> 
///上传文件并转存为html 
///</summary> 
///<param name="wordfilepath">word文档在客户机的位置</param> 
///<returns>上传的html文件的地址</returns> 
public string wordtohtml(system.web.ui.htmlcontrols.htmlinputfile wordfilepath) 
{ 
microsoft.office.interop.word.applicationclass word = new microsoft.office.interop.word.applicationclass(); 
type wordtype = word.gettype(); 
microsoft.office.interop.word.documents docs = word.documents; 

// 打开文件 
type docstype = docs.gettype(); 

//应当先把文件上传至服务器然后再解析文件为html 
string filepath = uploadword(wordfilepath); 

//判断是否上传文件成功 
if (filepath == "0") 
return "0"; 
//判断是否为word文件 
if (filepath == "1") 
return "1"; 

object filename = filepath; 

microsoft.office.interop.word.document doc = (microsoft.office.interop.word.document)docstype.invokemember("open", 
system.reflection.bindingflags.invokemethod, null, docs, new object[] { filename, true, true }); 

// 转换格式,另存为html 
type doctype = doc.gettype(); 

string filename = system.datetime.now.year.tostring() + system.datetime.now.month.tostring() + system.datetime.now.day.tostring() + 
system.datetime.now.hour.tostring() + system.datetime.now.minute.tostring() + system.datetime.now.second.tostring(); 

// 判断指定目录下是否存在文件夹,如果不存在,则创建 
if (!directory.exists(server.mappath("~\\html"))) 
{ 
// 创建up文件夹 
directory.createdirectory(server.mappath("~\\html")); 
} 

//被转换的html文档保存的位置 
string configpath = httpcontext.current.server.mappath("html/" + filename + ".html"); 
object savefilename = configpath; 

/*下面是microsoft word 9 object library的写法,如果是10,可能写成: 
* doctype.invokemember("saveas", system.reflection.bindingflags.invokemethod, 
* null, doc, new object[]{savefilename, word.wdsaveformat.wdformatfilteredhtml}); 
* 其它格式: 
* wdformathtml 
* wdformatdocument 
* wdformatdostext 
* wdformatdostextlinebreaks 
* wdformatencodedtext 
* wdformatrtf 
* wdformattemplate 
* wdformattext 
* wdformattextlinebreaks 
* wdformatunicodetext 
*/ 
doctype.invokemember("saveas", system.reflection.bindingflags.invokemethod, 
null, doc, new object[] { savefilename, microsoft.office.interop.word.wdsaveformat.wdformatfilteredhtml }); 

//关闭文档 
doctype.invokemember("close", system.reflection.bindingflags.invokemethod, 
null, doc, new object[] { null, null, null }); 

// 退出 word 
wordtype.invokemember("quit", system.reflection.bindingflags.invokemethod, null, word, null); 
//转到新生成的页面 
return ("/" + filename + ".html"); 

} 


public string uploadword(system.web.ui.htmlcontrols.htmlinputfile uploadfiles) 
{ 
if (uploadfiles.postedfile != null) 
{ 
string filename = uploadfiles.postedfile.filename; 

int extendnameindex = filename.lastindexof("."); 
string extendname = filename.substring(extendnameindex); 
string newname = ""; 
try 
{ 
//验证是否为word格式 
if (extendname == ".doc" || extendname == ".docx") 
{ 

datetime now = datetime.now; 
newname = now.dayofyear.tostring() + uploadfiles.postedfile.contentlength.tostring(); 

// 判断指定目录下是否存在文件夹,如果不存在,则创建 
if (!directory.exists(server.mappath("~\\wordtmp"))) 
{ 
// 创建up文件夹 
directory.createdirectory(server.mappath("~\\wordtmp")); 
} 

//上传路径 指当前上传页面的同一级的目录下面的wordtmp路径 
uploadfiles.postedfile.saveas(system.web.httpcontext.current.server.mappath("wordtmp/" + newname + extendname)); 
} 
else 
{ 
return "1"; 
} 
} 
catch 
{ 
return "0"; 
} 
//return "http://" + httpcontext.current.request.url.host + httpcontext.current.request.applicationpath + "/wordtmp/" + newname + extendname; 
return system.web.httpcontext.current.server.mappath("wordtmp/" + newname + extendname); 
} 
else 
{ 
return "0"; 
} 
}</span> 

效果图:

转换后的html文件


这样就可以简单的在html中展示word文档中的内容,而不需要在自己进行编辑了。当然,如果有需要的话,可以将转换的html的路径存入数据库,根据不同的条件直接进行访问。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。   

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网