openxml html to word,C# Net 使用 openxml 提取word中的文本和图片并转为Html

article/2025/10/25 4:06:05

C# Net Core openxml 提取 提出 取 word  文本  图片 Html Text Drawing

C# Net Core openxml 提取 提出 取 word  文本  图片 Html Text Drawing

注:只支持内嵌,不支持公式

------------------------------------------------

---------------文章最后为效果------------

------------------------------------------------

加入包:OpenXml

创建文件:Read.cs

复制下面全部代码到文件 Read.cs

using DocumentFormat.OpenXml;

using DocumentFormat.OpenXml.Packaging;

using DocumentFormat.OpenXml.Wordprocessing;

using System;

using System.Collections.Generic;

using System.IO;

using System.Text;

using System.Xml;

using System.Xml.Xsl;

namespace YCBX.Office.WordXml

{

public class WordRead

{

public static ListReadToHtml(string wordPathStr)

{

return ReadToHtml(new FileStream(wordPathStr, FileMode.Open));

}

public static ListReadToHtml(Stream wordStream)

{

using (WordprocessingDocument doc = WordprocessingDocument.Open(wordStream, false))

{

//XmlWriterSettings settings = new XmlWriterSettings() { OmitXmlDeclaration = true, ConformanceLevel = ConformanceLevel.Auto,DoNotEscapeUriAttributes=true};

ListparagraphHtmls = new List();

MainDocumentPart mainPart = doc.MainDocumentPart;

Body body = doc.MainDocumentPart.Document.Body;

//段落

foreach (var paragraph in body.Elements())

{

StringBuilder paragraphHtml = new StringBuilder();

//块

foreach (var run in paragraph.ChildElements)

{

if (run is Run)

{

foreach (OpenXmlElement openXmlElement in run.Elements())

{

//软回车

if (openXmlElement is Break br)

{

paragraphHtmls.Add(paragraphHtml.ToString());

paragraphHtml = new StringBuilder();

}

//文字块

else if (openXmlElement is Text text)

{

paragraphHtml.Append(text.Text);

}

//图像块

else if (openXmlElement is Drawing drawing)

{

//得到图像的内嵌ID(外嵌没做处理)

var inline = drawing.Inline;

var extent = inline.Extent;

var pic = inline.Graphic.GraphicData.GetFirstChild();

var embed = pic.BlipFill.Blip.Embed.Value;

//得到图像流

var part = mainPart.GetPartById(embed);

var stream = part.GetStream();

//流转2进制

byte[] bytes = new byte[stream.Length];

stream.Read(bytes, 0, bytes.Length);

//2进制转base64

string imgHtml = $"";

paragraphHtml.Append(imgHtml);

}

}

}

//else if(run is DocumentFormat.OpenXml.Math.OfficeMath math)

//{

//    var x = new XmlDocument();

//    x.LoadXml(math.OuterXml);

//    using var ms = ConvertToMatchMl(x, settings);

//    paragraphHtml.Append(ConvertToLatex(settings, ms));

//}

}

paragraphHtmls.Add(paragraphHtml.ToString());

}

return paragraphHtmls;

}

}

// 合并文档

/public static void Combine(string finalFile, Listfiles)

{

if (files.Count 

{

return;

}

File.Copy(files[0], finalFile, true);

using (WordprocessingDocument doc = WordprocessingDocument.Open(finalFile, true))

{

Body b = doc.MainDocumentPart.Document.Body;

for (int i = 1; i 

{

using (WordprocessingDocument doc1 = WordprocessingDocument.Open(files[i], true))

{

foreach (var inst in doc1.MainDocumentPart.Document.Body.Elements())

{

b.Append(inst.CloneNode(true));

}

}

}

}

}

private string ConvertToLatex(XmlWriterSettings settings, Stream ms)

{

var latexTransform = new XslCompiledTransform();

latexTransform.Load(Path.Combine(AppContext.BaseDirectory, "xsltml", "mmltex.xsl"), new XsltSettings(true,true),new XmlUrlResolver() );

using var la = new MemoryStream();

latexTransform.Transform(new XmlTextReader(ms), XmlWriter.Create(la, settings));

la.Seek(0, SeekOrigin.Begin);

StreamReader sr = new StreamReader(la, Encoding.UTF8);

return sr.ReadToEnd();

}

private Stream ConvertToMatchMl(XmlDocument xmlDocument, XmlWriterSettings settings)

{

var ms = new MemoryStream();

var xslTransform = new XslCompiledTransform();

xslTransform.Load(Path.Combine(AppContext.BaseDirectory, "xsltml", "OMML2MML.XSL"));

xslTransform.Transform(xmlDocument, XmlWriter.Create(ms, settings));

ms.Seek(0, SeekOrigin.Begin);

return ms;

}

}

}

创建文件:ImageExtent.cs

复制下面全部代码到文件 ImageExtent.csusing System;

using System.Collections.Generic;

using System.Text;

namespace YCBX.Office.WordXml

{

// 图像长度单位转换

///public class ImageExtent

{

private const decimal CM_TO_PX = 96M;

private const decimal INCH_TO_CM = 2.54M;

// 厘米到EMU(English Metric Unit)

///private const decimal CM_TO_EMU = 360000M;

// EMU(English Metric Unit) 到像素(px)

//public static decimal EMU_TO_PX(decimal EMU)

{

return EMU / CM_TO_EMU / INCH_TO_CM * CM_TO_PX;

}

}

}

调用方法:var sss = new Read().ParagraphHtmlAll("1.docx");

word文件中为:

867abcd4086c0e7d91faedc7cb7f23e4.png

创建一个test.html,将代码放在中,查看效果为:

a21434c35a787d05cf16e803be960706.png

完成


http://chatgpt.dhexx.cn/article/gVacwOET.shtml

相关文章

dotnet OpenXML 文本删除线解析方法

本文来告诉大家如何解析读取在 OpenXML 里面存放的文本删除线,本文使用 PowerPoint 作为例子来告诉大家如何读取然后在 WPF 应用里面显示 在开始之前,期望大家已了解如何在 dotnet 应用里面读取 PPT 文件,如果还不了解读取方法,请…

java openxml 操作 word,openxml word转成xml

word2007无法打开Office Open XML 文档 由于种种原因,如程序安装错误、注册表被修改,或系统被病毒侵害等。 有时候会造成WORD 2007无法打开.DOC文档的问题,常规的处理办法(右键选择“打开方式”)无效。 可以试试如下的方法 :1.打开…

java openxml word_C#采用OpenXml实现给word文档添加文字

本文实例讲述了C#采用OpenXml实现给word文档添加文字的方法,分享给大家供大家参考。具体方法如下: 一般来说,使用OpenXml给word文档添加文字,每个模块都有自己对于的属性以及内容,要设置样式就先声明属性对象&#xff…

vsto c# openxml操作excel

word ppt excel 后缀加rar 都可以解压看到资源文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using Syst…

java openxml word_OpenXml读取word内容的实例

OpenXml读取word内容注意事项 1、使用OpenXml读取word内容,word后缀必须是".docx";如果word后缀是".doc"需要转成".docx"后,才可以读取; 2、需要引入相关dll;"WindowsBase.dll&quo…

C# + OpenXML 生成 Word 文档(VS2015)

本文是 Open XML SDK 的入门文章,将逐步讲解如何生成一个下面这样的 Word 文档: 有关 Open XML SDK 的详细内容,请参阅这个链接:欢迎使用 Open XML SDK 2.5 for Office 创建示例程序 启动 Visual Studio 2015,新建一…

c# openxml Excel部分学习之路

c# openxml Excel部分学习之路 Openxml学习工具 Openxml学习工具 Open XML SDK 2.5 Productivity Tool,使用本工具可以对比原文档和进行更改后的文档发生的变化,便于我们能够理解我们对文档所作的操作带来了什么改变。 比如我们新建了两个Excel文件在新…

mysql openxml_OpenXML SDK2.0初窥

让我们直奔主题吧! 下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyIdC6E744E5-36E9-45F5-8D8C-331DF206E0D0 官方论坛:http://social.msdn.microsoft.com/Forums/en-US/oxmlsdk/threads 其它资源:http://msdn.microsoft.com/en-us/librar 让我们直奔主题吧…

dotnet OpenXML PPT 动画框架入门

本文将从 OpenXML 方面聊 PPT 的动画框架,本文是属于编程方面而不是 PPT 动画制作教程 开始之前,还请掌握一些基础知识,如阅读以下博客 C# dotnet 使用 OpenXml 解析 PPT 文件Office 文档解析 文档格式和协议dotnet OpenXML 解析 PPT 页面元…

java openxml word_【转】【OpenXml】OpenXml操作Word的一些操作总结

OpenXml相对于用MS提供的COM组件来生成WORD,有如下优势: 1.相对于MS 的COM组件,因为版本带来的不兼容问题,及各种会生成WORD半途会崩溃的问题. 2.对比填满一张30多页的WORD来说(包含图,表等),用COM组件来生成会占用20秒,Openxml1秒. 3.MS Word软件太贵了,你的客户装的是开源WOR…

java openxml 操作 word_OpenXML操作word

OpenXML概述 项目中经常需要操作word,之前的方式是采用COM接口,这个接口很不稳定,经常报错。现在开始采用OpenXML。OpenXML(OOXML)是微软在Office 2007中提出的一种新的文档格式,Office 2007中的Word、Excel、PowerPoint默认均采用OpenXML格式 。 OpenXml相对于用MS提供的C…

openXMl

openXMl注意点 一、基础标签 w:pStyle 定义样式ID w:keepNext :段落是否在一个页面上 w:keepLines :此元素指定在页面视图中呈现该文档时,尽可能将该段落的所有行维护在单个页面上 w:widowControl :这个元素指定消费者是否应该通…

OpenXML库(office文档读写库)的安装

本体安装 OpenXml库是由微软维护的一个开源的Office文档读写库,其与其他类似用途的库的比较可以看到这篇文章。 在C#中使用OpenXml非常简单,只需要使用NuGet安装其程序包即可,流程如下(NuGet这东西真的是个神器啊!):…

java e.getmessage() null_Java e.getMessage 错误信息为null

解决方案:用e.printStackTrace() e.getMessage()为null也很正常,NullPointException的getMessage()就为null 我在抛出Exception时也可以直接 throw new MyException(); 这样getMessage()返回的就是null了 这几天做的项目,测试小组说测出来的…

java中getmessage函数_PeekMessage、GetMessage的区别

在Windows编程中经常使用这两个函数来处理消息,它们之间的区别就是GetMessage是阻塞的,PeekMessage是非阻塞的。 GetMessage原型如下:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax); PeekMessage原型如下&a…

java e.getmessage() null,Java 求助! 为什么我拿不到错误信息,e.getMessage()

Java 求助! 为什么我拿不到错误信息,e.getMessage() Java 求助! 为什么我拿不到错误信息,e.getMessage() 我明明打印了错误信息的啊? e.getMessage() 是空,为什么? 一声声带着惊讶,带着恐慌,带着质疑,带着无奈的话语,从某个角落里传出。 议论纷纷...... 似乎拿不到异…

Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别常见的几种异常

Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别 一、概述 在java异常体系中,要打印异常信息,可以通过:e.getMessage() 、 e.toString() e.printStackTrace() 等方法打印出 一些 异常信息。已知的是这些方法都可以打…

GetMessage以及消息循环说明

GetMessage以及消息循环说明 在创建窗口、显示窗口、更新窗口后,我们需要编写一个消息循环,不断地从消息队列中取出消息,并进行响应。要从消息队列中取出消息,我们需要调用GetMessage()函数,该函数的原型声明如下&…

redis使用配置文件的方式启动

文章目录 为什么用配置文件启动呢使用配置文件启动1.创建配置文件2.修改配置文件里面的参数3.以配置文件的方式启动4.查看日志文件 为什么用配置文件启动呢 因为在企业项目中不会只有单个redis实例,每个redis的config配置都可以能不一样,所以这个时候就需…

.NET Core使用Redis

环境Windows 首先安装Redis 1、下载最新版redis,选择.zip则是免安装的版本 下载地址:https://github.com/MicrosoftArchive/redis/releases 2、解压到指定目录,并运行cmd命令 3、在该文件夹下运行命令:redis-server.exe redis.…