C#高效实现Word转Excel并完整保留文本,表格与样式
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>实现思路概述</li><li>加载 Word 并创建 Excel 工作簿</li><li>遍历 Word 文档内容</li><li>导出 Word 表格到 Excel</li><li>复制文本样式与图片</li><li>对齐方式与格式优化</li><li>保存为 Excel 文件</li><li>完整示例代码(C# 将 Word 转换为 Excel)</li><li>总结</li></ul></div><p>在企业办公和文档自动化场景中,Word 和 Excel 是最常用的两种文档格式。Word 更适合撰写说明性文本和排版复杂的内容,而 Excel 则擅长结构化数据处理、统计与分析。在实际开发中,我们经常会遇到这样的需求: <strong>将 Word 文档中的内容(包括段落、表格、样式甚至图片)转换为 Excel 文件,以便后续分析或存档</strong> 。</p><p>本文将介绍如何使用 <strong>Spire.Doc for .NET</strong> 和 <strong>Spire.XLS for .NET</strong> ,通过 C# 实现一个较为完整的 Word 转 Excel 方案,并尽可能保留原有的文本样式、表格结构和图片内容。</p>
<p class="maodian"></p><h2>实现思路概述</h2>
<p>Word 文档的内容结构相对复杂,主要由以下几类对象组成:</p>
<ul><li>段落(Paragraph)</li><li>表格(Table)</li><li>文本范围(TextRange)</li><li>图片(DocPicture)</li></ul>
<p>而 Excel 的核心结构则是:</p>
<ul><li>工作簿(Workbook)</li><li>工作表(Worksheet)</li><li>单元格(CellRange)</li><li>富文本(RichText)</li></ul>
<p>因此,转换的基本思路是:</p>
<ul><li>读取 Word 文档;</li><li>遍历文档中的 Section;</li><li>按顺序处理段落和表格;</li><li>将段落内容写入 Excel 单元格;</li><li>将 Word 表格逐行、逐列映射到 Excel;</li><li>复制文本样式、对齐方式和图片。</li></ul>
<p class="maodian"></p><h2>加载 Word 并创建 Excel 工作簿</h2>
<p>程序首先创建 Document 对象并加载 Word 文件,然后创建一个 Workbook,并清除默认工作表,确保输出结果更加干净、可控。</p>
<div class="jb51code"><pre class="brush:csharp;">Document doc = new Document();
doc.LoadFromFile(@"C:\Users\Administrator\Desktop\Invoice.docx");
Workbook wb = new Workbook();
wb.Worksheets.Clear();
Worksheet worksheet = wb.CreateEmptySheet("WordToExcel");
</pre></div>
<p>通过这种方式,我们可以确保 Word 的内容被统一写入到一个指定的工作表中。</p>
<p class="maodian"></p><h2>遍历 Word 文档内容</h2>
<p>Word 文档可能包含多个 Section,每个 Section 中又包含段落和表格。代码通过双层循环依次读取这些对象:</p>
<ul><li>如果是段落(Paragraph),直接写入 Excel 的单个单元格;</li><li>如果是表格(Table),则调用专门的方法导出为多行多列。</li></ul>
<div class="jb51code"><pre class="brush:csharp;">foreach (Section section in doc.Sections)
{
foreach (DocumentObject documentObject in section.Body.ChildObjects)
{
if (documentObject is Paragraph)
{
// 写入段落
}
if (documentObject is Table)
{
// 导出表格
}
}
}
</pre></div>
<p>这样可以最大程度保持 Word 中原有内容的顺序。</p>
<p class="maodian"></p><h2>导出 Word 表格到 Excel</h2>
<p>对于 Word 表格,程序逐行遍历 TableRow,再逐列遍历 TableCell,并将内容写入 Excel 对应的单元格中。同时,为了让 Excel 看起来更清晰,还为每个单元格添加了边框:</p>
<div class="jb51code"><pre class="brush:csharp;">cell.BorderAround(LineStyleType.Thin, Color.Black);
</pre></div>
<p>表格中的文本、换行符以及样式都会被完整复制,确保数据的可读性。</p>
<p class="maodian"></p><h2>复制文本样式与图片</h2>
<p>这是整个转换过程中的核心部分。程序通过 RichText 对象,将 Word 中不同 TextRange 的字体名称、字号、颜色、加粗状态逐一映射到 Excel:</p>
<ul><li>字体名称(FontName)</li><li>字号(FontSize)</li><li>是否加粗(Bold)</li><li>字体颜色(TextColor)</li></ul>
<p>同时,如果在段落中检测到图片(DocPicture),会直接将图片插入到 Excel 对应的单元格位置,并根据图片高度自动调整行高,从而避免图片被遮挡。</p>
<p class="maodian"></p><h2>对齐方式与格式优化</h2>
<p>为了进一步提升转换质量,代码还处理了段落的对齐方式,将 Word 中的左对齐、居中、右对齐映射到 Excel 单元格样式中。此外,在所有内容写入完成后,还统一执行了以下操作:</p>
<ul><li>自动调整行高和列宽</li><li>启用单元格自动换行</li></ul>
<p>这一步能显著提升生成 Excel 文件的整体可读性。</p>
<p class="maodian"></p><h2>保存为 Excel 文件</h2>
<p>最后,将生成的工作簿保存为 Excel 2013 格式文件:</p>
<div class="jb51code"><pre class="brush:csharp;">wb.SaveToFile("WordToExcel.xlsx", ExcelVersion.Version2013);
</pre></div>
<p>至此,一个包含段落、表格、样式和图片的 Excel 文件就成功生成了。</p>
<p class="maodian"></p><h2>完整示例代码(C# 将 Word 转换为 Excel)</h2>
<div class="jb51code"><pre class="brush:csharp;">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;
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;
// 为 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;
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;
}
}
}
}
</pre></div>
<p class="maodian"></p><h2>总结</h2>
<p>通过本文示例可以看出,借助 <strong>Spire.Doc for .NET</strong> 与 <strong>Spire.XLS for .NET</strong> ,我们可以使用 C# 高效地实现 Word 到 Excel 的转换,并且在转换过程中:</p>
<ul><li>保留文本内容与顺序</li><li>还原字体样式和对齐方式</li><li>完整导出表格结构</li><li>支持图片复制</li></ul>
<p>这种方案非常适合用于 <strong>发票转换、报表整理、文档数据结构化处理</strong> 等场景。如果你正在开发文档自动化或企业级办公系统,这种 Word 转 Excel 的实现方式将具有很高的实用价值。</p>
<p>以上就是C#高效实现Word转Excel并完整保留文本,表格与样式的详细内容,更多关于C# Word转Excel的资料请关注琼殿技术社区其它相关文章!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式</li><li>C#/VB.NET 将Word与Excel文档转化为Text</li><li>C#将Word或Excel文档转换为Html文件</li><li>C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例</li><li>word ppt excel文档转换成pdf的C#实现代码</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]