.net生成word的问题

chenhaoying 2017-08-10 09:51:34
.net生成word,使用的是下面的代码:
 StringBuilder sb = new StringBuilder();
sb.AppendLine("<html xmlns:v=\"urn:schemas-microsoft-com:vml\"");
sb.AppendLine("xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
sb.AppendLine("xmlns:w=\"urn:schemas-microsoft-com:office:word\"");
sb.AppendLine("xmlns:m=\"http://schemas.microsoft.com/office/2004/12/omml\"");//ns0
sb.AppendLine("xmlns=\"http://www.w3.org/TR/REC-html40\">");
// html代码
sb.AppendLine("<head>");
sb.AppendLine("<meta http-equiv=Content-Type content=\"text/html; charset=utf-8\">");
sb.AppendLine("<meta name=ProgId content=Word.Document>");
sb.AppendLine("<meta name=Generator content=\"Microsoft Word 11\">");
sb.AppendLine("<meta name=Originator content=\"Microsoft Word 11\">");
sb.AppendLine("<title></title>");
sb.AppendLine("<!--[if !mso]>");
sb.AppendLine("<style>");
sb.AppendLine("v\\:* {behavior:url(#default#VML);}");
sb.AppendLine("o\\:* {behavior:url(#default#VML);}");
sb.AppendLine("w\\:* {behavior:url(#default#VML);}");
sb.AppendLine(".shape {behavior:url(#default#VML);}");
sb.AppendLine("</style type=\"text/css\">");
sb.AppendLine("<![endif]-->");
//使导出的word以页面模式显示

sb.AppendLine("<!--[if gte mso 9]><xml>");
sb.AppendLine(" <w:WordDocument>");
sb.AppendLine(" <w:View>Print</w:View>");
sb.AppendLine(" <w:SpellingState>Clean</w:SpellingState>");
sb.AppendLine(" <w:GrammarState>Clean</w:GrammarState>");
sb.AppendLine(" <w:ValidateAgainstSchemas/>");
sb.AppendLine(" <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>");
sb.AppendLine(" <w:IgnoreMixedContent>false</w:IgnoreMixedContent>");
sb.AppendLine(" <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>");
sb.AppendLine(" <w:Compatibility>");
sb.AppendLine(" <w:UseFELayout/>");
sb.AppendLine(" </w:Compatibility>");
sb.AppendLine(" <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>");
sb.AppendLine(" </w:WordDocument>");
sb.AppendLine("</xml>");
sb.AppendLine("<![endif]-->");
sb.AppendLine("<!--[if gte mso 9]>");
sb.AppendLine("<xml>");
sb.AppendLine(" <w:LatentStyles DefLockedState=\"false\" LatentStyleCount=\"156\">");
sb.AppendLine(" </w:LatentStyles>");
sb.AppendLine("</xml>");
sb.AppendLine("<![endif]-->");
//样式
sb.AppendLine("<style type=\"text/css\">");

sb.AppendLine(" html, body{font-size: 12px;padding: 0;margin: 0;border: 0;height: 100%;}");
//sb.AppendLine(" .showtable {border-left:1px #000000 solid;border-top:1px #000000 solid;}");
//sb.AppendLine(" .showtable td{border-right:1px #000000 solid;border-bottom:1px #000000 solid;}");
sb.AppendLine(" .showtable,.showtable td,.showtable th{border:1px solid #000000;border-collapse:collapse;}");
sb.AppendLine(" .showtable tr{height:19px;}");
sb.AppendLine(" .showtable tb{border:1px solid #000000;border-collapse:collapse;font-size: 14px;}");

sb.AppendLine(" .showtable2,.showtable2 td,.showtable2 th{border:1px solid #000000;border-collapse:collapse;}");
sb.AppendLine(" .showtable2 tr{height:22px;}");
sb.AppendLine(" .showtable2 tb{border:1px solid #000000;border-collapse:collapse;font-size: 17px;}");

sb.AppendLine(" td{text-align:left;}");

//WORD页面设置
sb.AppendLine(" @page Section1");
sb.AppendLine(" {size:595.3pt 841.9pt;");
sb.AppendLine(" margin:72.0pt 70.9pt 72.0pt 70.9pt;");
sb.AppendLine(" mso-header-margin:42.55pt;");
sb.AppendLine(" mso-footer-margin:49.6pt;");
sb.AppendLine(" mso-paper-source:0;}");
sb.AppendLine(" div.Section1");
sb.AppendLine(" {page:Section1;}");
sb.AppendLine("</style>");

sb.AppendLine("<!--[if gte mso 9]>");
sb.AppendLine("<xml>");
sb.AppendLine(" <o:shapedefaults v:ext=\"edit\" spidmax=\"2050\"/>");
sb.AppendLine("</xml>");
sb.AppendLine("<![endif]-->");
sb.AppendLine("<!--[if gte mso 9]>");
sb.AppendLine("<xml>");
sb.AppendLine(" <o:shapelayout v:ext=\"edit\">");
sb.AppendLine(" <o:idmap v:ext=\"edit\" data=\"1\"/>");
sb.AppendLine(" </o:shapelayout>");
sb.AppendLine("</xml>");
sb.AppendLine("<![endif]-->");
sb.AppendLine("</head>");
//文档内容开始

sb.AppendLine("<body lang=ZH-CN style='tab-interval:21.0pt'>");
sb.AppendLine("<div class=Section1>"); //页面设置样式
sb.AppendLine(htmltext);
sb.AppendLine("</div>");
sb.AppendLine("</body>");
sb.AppendLine("</html>");


Encoding encoding = Encoding.GetEncoding("utf-8");//
StreamWriter sw = null;


string path = "/uploads/swfupload/" + fileName + ".doc";
string OutPutPath = HttpContext.Current.Server.MapPath(path);

if (System.IO.File.Exists(OutPutPath))
{
System.IO.File.Delete(OutPutPath);
}
sw = new StreamWriter(OutPutPath, false, encoding);
sw.Write(sb);
sw.Flush();
sw.Close();


这个代码生成word是没问题,显示也没问题,但是如果htmltext里有带url的图片的话,那打开这个word编辑保存的时候,word就会生成一个file的文件夹,造成那个word不再是一个单独的word了。必须要编辑后选择另存为来存一个doc文件覆盖它,可是客户觉得这样很不方便,他们习惯了直接保存。能不能在生成word的时候图片是做生成编码放入word中呢?就像htm的data:image/png;base64这样呢?高手指点一下
...全文
325 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenhaoying 2017-08-22
  • 打赏
  • 举报
回复
今天把图片去掉的试一下,发现还是会多一个.files文件夹出来,里面有colorschememapping.xml、filelist.xml、header.htm、themedata.thmx这4个文件,
Hello World, 2017-08-11
  • 打赏
  • 举报
回复
用aspose.word,直接写入html
chenhaoying 2017-08-11
  • 打赏
  • 举报
回复
引用 3 楼 apollokk 的回复:
这样生成的还是html格式的word,在本质上有区别,打开后另存,选择格式为doc或者docx,文件名另取一个。 可以看到文件大小不一样了,新的文件者word的
大小当然不一样了,因为原先的图片是连接,另存转换后word把图片放到里面了,增加了图片的大小。
Hello World, 2017-08-10
  • 打赏
  • 举报
回复
这样生成的还是html格式的word,在本质上有区别,打开后另存,选择格式为doc或者docx,文件名另取一个。 可以看到文件大小不一样了,新的文件者word的
chenhaoying 2017-08-10
  • 打赏
  • 举报
回复
是word内容有链接的图片,word为了避免断线时图片不显示,所以保存的时候的下载链接图片到file文件夹里,所以就多了这个文件夹。
Ying_yu1 2017-08-10
  • 打赏
  • 举报
回复
楼主你这应该不仅有图片更新保存后会产生file 文件夹,就一句话,更新保存后都会产生文件夹。

62,243

社区成员

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

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

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

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