2017-04-26 45 views
1

我想通過使用Openxml創建Word文檔,並且當Openxml不能以我需要的方式理解Html標記時出現問題。Openxml - 如何轉換HTML與樣式?

在我的測試項目(看它是如何工作的話)我做第二件事:

using (var package = WordprocessingDocument.Create(filename, WordprocessingDocumentType.Document)) 
{ 
    package.AddMainDocumentPart(); 

    var mainPart = package.MainDocumentPart; 
    mainPart.Document = new Document(); 
    var body = new Body(); 

    var sectionProp = new SectionProperties(); 
    var pageSetup = new PageMargin() { Top = 1701, Left= 1134, Right = 1134, Bottom = 850 }; 
    sectionProp.Append(pageSetup); 

    body.Append(sectionProp); 

    var converter = new HtmlConverter(mainPart); 

    var para = converter.Parse(@"<b>Testing Html</b><b>Testing Html2</b>"); 

    var runProp = new RunProperties(); 
    runProp.Append(new Bold(), new FontSize() {Val = "32"}); 

    var paragProp = new ParagraphProperties(); 
    var justif = new Justification() {Val = JustificationValues.Center}; 
    paragProp.Append(justif); 

    body.Append(new Paragraph(paragProp, new Run(runProp, new Text("<b>Testing</b>"))), para[0]);  
    mainPart.Document.Append(body); 
} 

System.Diagnostics.Process.Start(filename); 

我得到它的那Html2Openxml HTML文本轉換成一堆段落,,但是,對於問題我,因爲我也需要給它增加一些樣式

我是否需要發送一些樣式與HTML(我應該這樣做,只是樣式=「」無處不在或它可以理解一些擴展的CSS?)它轉換正確,或有辦法以某種方式給轉換的段落樣式?

回答

1

根據我的經驗,Word不處理鏈接的樣式表,例如。而且,我甚至必須找到它們,並用一個好的RegularExpress刪除它們,因爲這些標籤在Word文檔中仍然存在一些負面的視覺效果。

當導出到Word時,我使用HttpWebRequest來運行我的樣式表,並將它們的響應流式傳輸到StringBuilder,將所有內容放置在樣式標記中,然後使用string.Replace替換標記中的一些佔位符文本(該佔位符文本僅在我處於「打印到Word」模式時顯示)。下面,「pageSource」是我抓取的OnRender事件的HtmlTextWriter文本,而不是去瀏覽器(然後我從那裏通過string.Replace和Regex.Replace等操作HTML)。您可能需要或不需要CookieContainer和Cookie foreach循環,具體取決於您的站點安全性(令牌)以及其他Cookie的使用情況。

public string PutOurStylesInBlockForWordExport(string pageSource, string webRoot) 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.AppendLine(@"<style type=""text/css"">"); 

     HttpWebRequest req = WebRequest.Create(webRoot + "Styles/reset.css") as HttpWebRequest; 
     HttpWebRequest req2 = WebRequest.Create(webRoot + "Styles/style.css") as HttpWebRequest; 
     CookieContainer cc = new CookieContainer(); 
     req.CookieContainer = cc; 
     req2.CookieContainer = cc; 
     var cookies = HttpContext.Current.Request.Cookies; 
     foreach (string key in cookies.AllKeys) 
     { 
      Cookie c = new Cookie(cookies[key].Name, cookies[key].Value); 
      Uri root = new Uri(webRoot); 
      req.CookieContainer.Add(root, c); 
      req2.CookieContainer.Add(root, c); 
     } 

     System.Net.WebResponse resp = req.GetResponse(); 
     using (System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream())) 
     { 
      sb.Append(sr.ReadToEnd().Trim()); 
     } 

     System.Net.WebResponse resp2 = req2.GetResponse(); 
     using (System.IO.StreamReader sr = new System.IO.StreamReader(resp2.GetResponseStream())) 
     { 
      sb.Append(sr.ReadToEnd().Trim()); 
     } 

     sb.AppendLine(@"</style>"); 
     return sb.ToString(); 
    }