Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用OpenXml power工具将Docx转换为html,无需格式化_C#_Openxml_Openxml Sdk - Fatal编程技术网

C# 使用OpenXml power工具将Docx转换为html,无需格式化

C# 使用OpenXml power工具将Docx转换为html,无需格式化,c#,openxml,openxml-sdk,C#,Openxml,Openxml Sdk,我在项目中使用OpenXml Power tools将文档(docx)转换为html, 使用此sdk已经提供的代码,它以html形式生成一个优雅的副本。(Github链接:) 然而,从html标记来看,html已经嵌入了样式 有没有办法关闭此功能并使用简单的和标记 我想知道这种嵌入式样式,因为格式将由引导处理 嵌入式样式如下所示: <p dir="ltr" style="font-family: Calibri;font-size: 11pt;line-height: 115.0%;ma

我在项目中使用OpenXml Power tools将文档(docx)转换为html, 使用此sdk已经提供的代码,它以html形式生成一个优雅的副本。(Github链接:)

然而,从html标记来看,html已经嵌入了样式

有没有办法关闭此功能并使用简单的
标记

我想知道这种嵌入式样式,因为格式将由引导处理

嵌入式样式如下所示:

 <p dir="ltr" style="font-family: Calibri;font-size: 11pt;line-height: 115.0%;margin-bottom: 0;margin-left: 0;margin-right: 0;margin-top: 0;">
 <span xml:space="preserve" style="font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"> </span>
 </p>

如您所见,如果您想要直接复制,这是很好的,但是如果您想要自己控制样式,这是不行的

在C代码中,我已经做了以下调整:

  • 额外的CSS被注释掉了
  • 制造类是假的
  • CssClassPrefix已注释掉

非常感谢。

我已经用小Y312的提示解决了这个问题

使用下面的示例时,可以将生成的html字符串加载到html敏捷包中,如下所示

HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlString);
然后查找属性(样式和任何其他属性)并删除它们

var styles = htmlDoc.DocumentNode.SelectNodes("//@style");                    
if (styles != null)
{
foreach (var item in styles)
{
item.Attributes["style"].Remove();
}
}
然后保存文件

var fileName = Path.Combine(outputDirectory,"index.html");
htmlDoc.Save(new FileStream(fileName,FileMode.Create,FileAccess.ReadWrite));
还有其他方法可以做到这一点,但似乎是可以接受的解决办法

编辑:

在对这里发布的两个答案进行了一些实验之后,我发现这个实现工作得最好,因为它对图像没有问题

 var body = htmlDoc.DocumentNode.SelectSingleNode("//body");
 var tags = body.SelectNodes("//*");
 if (tags != null)
 {
  foreach (var tag in tags){
      if (!tag.OuterHtml.Contains("img"))
      {
       tag.Attributes.RemoveAll();
      }
    }
  }

理论上,您也可以将其用于表格,但是,根据您想要的样式,您始终可以去掉由电动工具生成的属性,并用自己的属性替换这些属性。

如果您还可以使用
XmlReader
XmlWriter
获得基本html。不过,这可能有点过分,因为只保留标记本身及其文本内容

public static class HtmlHelper
{
    /// <summary>
    /// Keep only the openning and closing tag, and text content from the html
    /// </summary>
    public static string CleanUp(string html)
    {
        var output = new StringBuilder();
        using (var reader = XmlReader.Create(new StringReader(html)))
        {
            var settings = new XmlWriterSettings() { Indent = true, OmitXmlDeclaration = true };
            using (var writer = XmlWriter.Create(output, settings))
            {
                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {
                        case XmlNodeType.Element:
                            writer.WriteStartElement(reader.Name);
                            break;
                        case XmlNodeType.Text:
                            writer.WriteString(reader.Value);
                            break;
                        case XmlNodeType.EndElement:
                            writer.WriteFullEndElement();
                            break;
                    }
                }
            }
        }

        return output.ToString();
    }
}
公共静态类HtmlHelper
{
/// 
///仅保留html中的打开和关闭标记以及文本内容
/// 
公共静态字符串清理(字符串html)
{
var输出=新的StringBuilder();
使用(var reader=XmlReader.Create(newstringreader(html)))
{
var settings=newXMLWriterSettings(){Indent=true,ommitXMLDeclaration=true};
使用(var writer=XmlWriter.Create(输出、设置))
{
while(reader.Read())
{
开关(reader.NodeType)
{
case XmlNodeType.Element:
writer.writeStart元素(reader.Name);
打破
案例XmlNodeType.Text:
writer.WriteString(reader.Value);
打破
案例XmlNodeType.EndElement:
writer.writeFileLendElement();
打破
}
}
}
}
返回output.ToString();
}
}
结果输出:

<p>
  <span></span>
</p>


您还可以解析生成的html并删除所有属性。这将是一个极好的主意。非常感谢。