news 2026/4/20 17:18:35

使用 C# 高质量实现 Word 转 Excel:完整保留文本、表格与样式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 C# 高质量实现 Word 转 Excel:完整保留文本、表格与样式

在企业办公和文档自动化场景中,Word 和 Excel 是最常用的两种文档格式。Word 更适合撰写说明性文本和排版复杂的内容,而 Excel 则擅长结构化数据处理、统计与分析。在实际开发中,我们经常会遇到这样的需求:将 Word 文档中的内容(包括段落、表格、样式甚至图片)转换为 Excel 文件,以便后续分析或存档

本文将介绍如何使用Spire.Doc for .NETSpire.XLS for .NET,通过 C# 实现一个较为完整的 Word 转 Excel 方案,并尽可能保留原有的文本样式、表格结构和图片内容。


实现思路概述

Word 文档的内容结构相对复杂,主要由以下几类对象组成:

  • 段落(Paragraph)
  • 表格(Table)
  • 文本范围(TextRange)
  • 图片(DocPicture)

而 Excel 的核心结构则是:

  • 工作簿(Workbook)
  • 工作表(Worksheet)
  • 单元格(CellRange)
  • 富文本(RichText)

因此,转换的基本思路是:

  1. 读取 Word 文档;
  2. 遍历文档中的 Section;
  3. 按顺序处理段落和表格;
  4. 将段落内容写入 Excel 单元格;
  5. 将 Word 表格逐行、逐列映射到 Excel;
  6. 复制文本样式、对齐方式和图片。

加载 Word 并创建 Excel 工作簿

程序首先创建 Document 对象并加载 Word 文件,然后创建一个 Workbook,并清除默认工作表,确保输出结果更加干净、可控。

Document doc = new Document(); doc.LoadFromFile(@"C:\Users\Administrator\Desktop\Invoice.docx"); Workbook wb = new Workbook(); wb.Worksheets.Clear(); Worksheet worksheet = wb.CreateEmptySheet("WordToExcel");

通过这种方式,我们可以确保 Word 的内容被统一写入到一个指定的工作表中。


遍历 Word 文档内容

Word 文档可能包含多个 Section,每个 Section 中又包含段落和表格。代码通过双层循环依次读取这些对象:

  • 如果是段落(Paragraph),直接写入 Excel 的单个单元格;
  • 如果是表格(Table),则调用专门的方法导出为多行多列。
foreach (Section section in doc.Sections) { foreach (DocumentObject documentObject in section.Body.ChildObjects) { if (documentObject is Paragraph) { // 写入段落 } if (documentObject is Table) { // 导出表格 } } }

这样可以最大程度保持 Word 中原有内容的顺序。


导出 Word 表格到 Excel

对于 Word 表格,程序逐行遍历 TableRow,再逐列遍历 TableCell,并将内容写入 Excel 对应的单元格中。同时,为了让 Excel 看起来更清晰,还为每个单元格添加了边框:

cell.BorderAround(LineStyleType.Thin, Color.Black);

表格中的文本、换行符以及样式都会被完整复制,确保数据的可读性。


复制文本样式与图片

这是整个转换过程中的核心部分。程序通过 RichText 对象,将 Word 中不同 TextRange 的字体名称、字号、颜色、加粗状态逐一映射到 Excel:

  • 字体名称(FontName)
  • 字号(FontSize)
  • 是否加粗(Bold)
  • 字体颜色(TextColor)

同时,如果在段落中检测到图片(DocPicture),会直接将图片插入到 Excel 对应的单元格位置,并根据图片高度自动调整行高,从而避免图片被遮挡。


对齐方式与格式优化

为了进一步提升转换质量,代码还处理了段落的对齐方式,将 Word 中的左对齐、居中、右对齐映射到 Excel 单元格样式中。此外,在所有内容写入完成后,还统一执行了以下操作:

  • 自动调整行高和列宽
  • 启用单元格自动换行

这一步能显著提升生成 Excel 文件的整体可读性。


保存为 Excel 文件

最后,将生成的工作簿保存为 Excel 2013 格式文件:

wb.SaveToFile("WordToExcel.xlsx", ExcelVersion.Version2013);

至此,一个包含段落、表格、样式和图片的 Excel 文件就成功生成了。

完整示例代码(C# 将 Word 转换为 Excel)

using Spire.Doc; using Spire.Doc.Documents; using Spire.Doc.Fields; using Spire.Xls; using System; using System.Drawing; namespace ConvertWordToExcel { class Program { static void Main(string[] args) { // 创建 Document 对象 Document doc = new Document(); // 加载 Word 文档 doc.LoadFromFile(@"C:\Users\Administrator\Desktop\Invoice.docx"); // 创建 Workbook 对象 Workbook wb = new Workbook(); // 移除默认工作表 wb.Worksheets.Clear(); // 创建一个名为“WordToExcel”的工作表 Worksheet worksheet = wb.CreateEmptySheet("WordToExcel"); int row = 1; int column = 1; // 遍历 Word 文档中的所有 Section foreach (Section section in doc.Sections) { // 遍历 Section 中的所有文档对象 foreach (DocumentObject documentObject in section.Body.ChildObjects) { // 如果对象是段落 if (documentObject is Paragraph) { CellRange cell = worksheet.Range[row, column]; Paragraph paragraph = documentObject as Paragraph; // 将段落内容及样式复制到 Excel 单元格 CopyTextAndStyle(cell, paragraph); row++; } // 如果对象是表格 if (documentObject is Table) { Table table = documentObject as Table; // 将 Word 表格导出到 Excel int currentRow = ExportTableInExcel(worksheet, row, table); row = currentRow; } } } // 自动调整行高和列宽 worksheet.AllocatedRange.AutoFitRows(); worksheet.AllocatedRange.AutoFitColumns(); // 设置单元格自动换行 worksheet.AllocatedRange.IsWrapText = true; // 保存为 Excel 文件 wb.SaveToFile("WordToExcel.xlsx", ExcelVersion.Version2013); } /// <summary> /// 将 Word 表格数据导出到 Excel /// </summary> private static int ExportTableInExcel(Worksheet worksheet, int row, Table table) { CellRange cell; int column; // 遍历表格中的每一行 foreach (TableRow tbRow in table.Rows) { column = 1; // 遍历当前行中的每一个单元格 foreach (TableCell tbCell in tbRow.Cells) { cell = worksheet.Range[row, column]; // 为 Excel 单元格添加边框 cell.BorderAround(LineStyleType.Thin, Color.Black); // 复制 Word 表格单元格内容到 Excel CopyContentInTable(tbCell, cell); column++; } row++; } return row; } /// <summary> /// 将 Word 表格单元格中的内容复制到 Excel 单元格 /// </summary> private static void CopyContentInTable(TableCell tbCell, CellRange cell) { // 创建一个新的段落对象 Paragraph newPara = new Paragraph(tbCell.Document); // 遍历 Word 表格单元格中的所有子对象 for (int i = 0; i < tbCell.ChildObjects.Count; i++) { DocumentObject documentObject = tbCell.ChildObjects[i]; if (documentObject is Paragraph) { Paragraph paragraph = documentObject as Paragraph; // 复制段落中的所有子对象(文本、图片等) foreach (DocumentObject cObj in paragraph.ChildObjects) { newPara.ChildObjects.Add(cObj.Clone()); } // 如果不是最后一个段落,则添加换行符 if (i < tbCell.ChildObjects.Count - 1) { newPara.AppendText("\n"); } } } // 将合并后的段落内容复制到 Excel CopyTextAndStyle(cell, newPara); } /// <summary> /// 复制段落的文本内容和样式到 Excel 单元格 /// </summary> private static void CopyTextAndStyle(CellRange cell, Paragraph paragraph) { RichText richText = cell.RichText; // 设置单元格文本内容 richText.Text = paragraph.Text; int startIndex = 0; // 遍历段落中的子对象 foreach (DocumentObject documentObject in paragraph.ChildObjects) { // 如果是文本内容 if (documentObject is TextRange) { TextRange textRange = documentObject as TextRange; // 获取 Word 文本样式 string fontName = textRange.CharacterFormat.FontName; bool isBold = textRange.CharacterFormat.Bold; Color textColor = textRange.CharacterFormat.TextColor; float fontSize = textRange.CharacterFormat.FontSize; string textRangeText = textRange.Text; int strLength = textRangeText.Length; // 创建 Excel 字体 ExcelFont font = cell.Worksheet.Workbook.CreateFont(); font.Color = textColor; font.IsBold = isBold; font.Size = fontSize; font.FontName = fontName; // 应用字体样式到指定文本范围 int endIndex = startIndex + strLength; richText.SetFont(startIndex, endIndex, font); startIndex += strLength; } // 如果是图片 if (documentObject is DocPicture) { DocPicture picture = documentObject as DocPicture; // 将图片插入到 Excel 单元格 cell.Worksheet.Pictures.Add(cell.Row, cell.Column, picture.Image); // 根据图片高度调整行高 cell.Worksheet.SetRowHeightInPixels(cell.Row, 1, picture.Image.Height); } } // 设置 Excel 单元格的水平对齐方式 switch (paragraph.Format.HorizontalAlignment) { case HorizontalAlignment.Left: cell.Style.HorizontalAlignment = HorizontalAlignType.Left; break; case HorizontalAlignment.Center: cell.Style.HorizontalAlignment = HorizontalAlignType.Center; break; case HorizontalAlignment.Right: cell.Style.HorizontalAlignment = HorizontalAlignType.Right; break; } } } }

总结

通过本文示例可以看出,借助Spire.Doc for .NETSpire.XLS for .NET,我们可以使用 C# 高效地实现 Word 到 Excel 的转换,并且在转换过程中:

  • 保留文本内容与顺序
  • 还原字体样式和对齐方式
  • 完整导出表格结构
  • 支持图片复制

这种方案非常适合用于发票转换、报表整理、文档数据结构化处理等场景。如果你正在开发文档自动化或企业级办公系统,这种 Word 转 Excel 的实现方式将具有很高的实用价值。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 2:59:19

华为OD机试双机位C卷 - 采样过滤 (C++ Python JAVA JS GO)

采样过滤 2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 200分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录&#xff5c;机考题库 算法考点详解 题目描述 在做物理实验时&#xff0c;为了计算物体移动的速率&#xff0c;通过相机等工…

作者头像 李华
网站建设 2026/4/18 9:56:36

LC.230 | 二叉搜索树中第 K 小的元素 | 树 | 中序遍历计数

输入&#xff1a; 二叉搜索树根节点 root&#xff0c;整数 k&#xff08;从 1 开始计数&#xff09;。 要求&#xff1a; 返回 BST 中第 k 小的元素。 输出&#xff1a; 一个整数&#xff08;第 k 小的节点值&#xff09;。思路&#xff1a; BST 中序遍历 的经典应用&#xff…

作者头像 李华
网站建设 2026/4/18 10:36:00

基于Springboot企业进销存管理系统【附源码+文档】

&#x1f495;&#x1f495;作者&#xff1a; 米罗学长 &#x1f495;&#x1f495;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&#…

作者头像 李华
网站建设 2026/4/19 3:18:58

基于Springboot社区物资申报系统【附源码+文档】

&#x1f495;&#x1f495;作者&#xff1a; 米罗学长 &#x1f495;&#x1f495;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&#…

作者头像 李华
网站建设 2026/4/18 14:30:21

低功耗设备中LCD显示屏串行接口优化方案

让LCD屏更省电&#xff1a;串行接口的实战优化策略你有没有遇到过这样的情况&#xff1f;设备明明已经进入了低功耗模式&#xff0c;但电流表上的读数就是下不去——一查&#xff0c;原来是LCD显示屏还在“偷偷”耗电。在可穿戴设备、智能传感器或远程医疗终端这类电池供电的产…

作者头像 李华
网站建设 2026/4/20 7:39:51

论文AI改写工具排行榜:8个平台一键降重与智能创作

目前市面上有多款AI论文辅助工具在降重、降低AIGC检测率以及论文写作方面表现突出&#xff0c;通过对8个主流平台的实测数据与用户反馈进行综合评估&#xff0c;这些工具在生成效率、内容准确性和操作便捷性等方面各具优势&#xff0c;为学术研究者提供了从初稿撰写到重复率优化…

作者头像 李华