使用 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,并清除默认工作表,确保输出结果更加干净、可控。

cs 复制代码
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),则调用专门的方法导出为多行多列。
cs 复制代码
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 看起来更清晰,还为每个单元格添加了边框:

cs 复制代码
cell.BorderAround(LineStyleType.Thin, Color.Black);

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


复制文本样式与图片

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

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

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


对齐方式与格式优化

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

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

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


保存为 Excel 文件

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

cs 复制代码
wb.SaveToFile("WordToExcel.xlsx", ExcelVersion.Version2013);

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

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

cs 复制代码
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 的实现方式将具有很高的实用价值。

相关推荐
weixin_537217063 小时前
注册会计师资源合集
经验分享
宝宝单机sop18 小时前
证券从业资源合集
经验分享
智者知已应修善业1 天前
【蓝桥杯龟兔赛跑】2024-2-12
c语言·c++·经验分享·笔记·算法·职场和发展·蓝桥杯
学工科的皮皮志^_^1 天前
光模块学习
经验分享·笔记·嵌入式硬件·学习
金海境科技1 天前
【服务器数据恢复】政务云虚拟化平台故障导致民生服务中断数据恢复案例
经验分享
TeleostNaCl1 天前
探析并解决小明投影仪因内置 DoT 服务而无法访问 openwrt.lan 等本地域名的问题
经验分享·智能路由器·电视盒子·智能电视·tv·电视·智能tv
宝宝单机sop1 天前
公考资源合集(第二辑)
经验分享
跟YY哥学Jira1 天前
2026 Atlassian 认证体系重大变革:全面拥抱云时代与 AI 战略
人工智能·经验分享·项目管理·atlassian·认证·jira
做cv的小昊2 天前
【TJU】信息检索与分析课程笔记和练习(1)认识文献
经验分享·笔记·学习·搜索引擎·全文检索