C#高效實現(xiàn)Word轉(zhuǎn)Excel并完整保留文本,表格與樣式
在企業(yè)辦公和文檔自動化場景中,Word 和 Excel 是最常用的兩種文檔格式。Word 更適合撰寫說明性文本和排版復雜的內(nèi)容,而 Excel 則擅長結構化數(shù)據(jù)處理、統(tǒng)計與分析。在實際開發(fā)中,我們經(jīng)常會遇到這樣的需求: 將 Word 文檔中的內(nèi)容(包括段落、表格、樣式甚至圖片)轉(zhuǎn)換為 Excel 文件,以便后續(xù)分析或存檔 。
本文將介紹如何使用 Spire.Doc for .NET 和 Spire.XLS for .NET ,通過 C# 實現(xiàn)一個較為完整的 Word 轉(zhuǎn) Excel 方案,并盡可能保留原有的文本樣式、表格結構和圖片內(nèi)容。
實現(xiàn)思路概述
Word 文檔的內(nèi)容結構相對復雜,主要由以下幾類對象組成:
- 段落(Paragraph)
- 表格(Table)
- 文本范圍(TextRange)
- 圖片(DocPicture)
而 Excel 的核心結構則是:
- 工作簿(Workbook)
- 工作表(Worksheet)
- 單元格(CellRange)
- 富文本(RichText)
因此,轉(zhuǎn)換的基本思路是:
- 讀取 Word 文檔;
- 遍歷文檔中的 Section;
- 按順序處理段落和表格;
- 將段落內(nèi)容寫入 Excel 單元格;
- 將 Word 表格逐行、逐列映射到 Excel;
- 復制文本樣式、對齊方式和圖片。
加載 Word 并創(chuàng)建 Excel 工作簿
程序首先創(chuàng)建 Document 對象并加載 Word 文件,然后創(chuàng)建一個 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 的內(nèi)容被統(tǒng)一寫入到一個指定的工作表中。
遍歷 Word 文檔內(nèi)容
Word 文檔可能包含多個 Section,每個 Section 中又包含段落和表格。代碼通過雙層循環(huán)依次讀取這些對象:
- 如果是段落(Paragraph),直接寫入 Excel 的單個單元格;
- 如果是表格(Table),則調(diào)用專門的方法導出為多行多列。
foreach (Section section in doc.Sections)
{
foreach (DocumentObject documentObject in section.Body.ChildObjects)
{
if (documentObject is Paragraph)
{
// 寫入段落
}
if (documentObject is Table)
{
// 導出表格
}
}
}
這樣可以最大程度保持 Word 中原有內(nèi)容的順序。
導出 Word 表格到 Excel
對于 Word 表格,程序逐行遍歷 TableRow,再逐列遍歷 TableCell,并將內(nèi)容寫入 Excel 對應的單元格中。同時,為了讓 Excel 看起來更清晰,還為每個單元格添加了邊框:
cell.BorderAround(LineStyleType.Thin, Color.Black);
表格中的文本、換行符以及樣式都會被完整復制,確保數(shù)據(jù)的可讀性。
復制文本樣式與圖片
這是整個轉(zhuǎn)換過程中的核心部分。程序通過 RichText 對象,將 Word 中不同 TextRange 的字體名稱、字號、顏色、加粗狀態(tài)逐一映射到 Excel:
- 字體名稱(FontName)
- 字號(FontSize)
- 是否加粗(Bold)
- 字體顏色(TextColor)
同時,如果在段落中檢測到圖片(DocPicture),會直接將圖片插入到 Excel 對應的單元格位置,并根據(jù)圖片高度自動調(diào)整行高,從而避免圖片被遮擋。
對齊方式與格式優(yōu)化
為了進一步提升轉(zhuǎn)換質(zhì)量,代碼還處理了段落的對齊方式,將 Word 中的左對齊、居中、右對齊映射到 Excel 單元格樣式中。此外,在所有內(nèi)容寫入完成后,還統(tǒng)一執(zhí)行了以下操作:
- 自動調(diào)整行高和列寬
- 啟用單元格自動換行
這一步能顯著提升生成 Excel 文件的整體可讀性。
保存為 Excel 文件
最后,將生成的工作簿保存為 Excel 2013 格式文件:
wb.SaveToFile("WordToExcel.xlsx", ExcelVersion.Version2013);
至此,一個包含段落、表格、樣式和圖片的 Excel 文件就成功生成了。
完整示例代碼(C# 將 Word 轉(zhuǎn)換為 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)
{
// 創(chuàng)建 Document 對象
Document doc = new Document();
// 加載 Word 文檔
doc.LoadFromFile(@"C:\Users\Administrator\Desktop\Invoice.docx");
// 創(chuàng)建 Workbook 對象
Workbook wb = new Workbook();
// 移除默認工作表
wb.Worksheets.Clear();
// 創(chuàng)建一個名為“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;
// 將段落內(nèi)容及樣式復制到 Excel 單元格
CopyTextAndStyle(cell, paragraph);
row++;
}
// 如果對象是表格
if (documentObject is Table)
{
Table table = documentObject as Table;
// 將 Word 表格導出到 Excel
int currentRow = ExportTableInExcel(worksheet, row, table);
row = currentRow;
}
}
}
// 自動調(diào)整行高和列寬
worksheet.AllocatedRange.AutoFitRows();
worksheet.AllocatedRange.AutoFitColumns();
// 設置單元格自動換行
worksheet.AllocatedRange.IsWrapText = true;
// 保存為 Excel 文件
wb.SaveToFile("WordToExcel.xlsx", ExcelVersion.Version2013);
}
/// <summary>
/// 將 Word 表格數(shù)據(jù)導出到 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 表格單元格內(nèi)容到 Excel
CopyContentInTable(tbCell, cell);
column++;
}
row++;
}
return row;
}
/// <summary>
/// 將 Word 表格單元格中的內(nèi)容復制到 Excel 單元格
/// </summary>
private static void CopyContentInTable(TableCell tbCell, CellRange cell)
{
// 創(chuàng)建一個新的段落對象
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");
}
}
}
// 將合并后的段落內(nèi)容復制到 Excel
CopyTextAndStyle(cell, newPara);
}
/// <summary>
/// 復制段落的文本內(nèi)容和樣式到 Excel 單元格
/// </summary>
private static void CopyTextAndStyle(CellRange cell, Paragraph paragraph)
{
RichText richText = cell.RichText;
// 設置單元格文本內(nèi)容
richText.Text = paragraph.Text;
int startIndex = 0;
// 遍歷段落中的子對象
foreach (DocumentObject documentObject in paragraph.ChildObjects)
{
// 如果是文本內(nèi)容
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;
// 創(chuàng)建 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);
// 根據(jù)圖片高度調(diào)整行高
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 .NET 與 Spire.XLS for .NET ,我們可以使用 C# 高效地實現(xiàn) Word 到 Excel 的轉(zhuǎn)換,并且在轉(zhuǎn)換過程中:
- 保留文本內(nèi)容與順序
- 還原字體樣式和對齊方式
- 完整導出表格結構
- 支持圖片復制
這種方案非常適合用于 發(fā)票轉(zhuǎn)換、報表整理、文檔數(shù)據(jù)結構化處理 等場景。如果你正在開發(fā)文檔自動化或企業(yè)級辦公系統(tǒng),這種 Word 轉(zhuǎn) Excel 的實現(xiàn)方式將具有很高的實用價值。
以上就是C#高效實現(xiàn)Word轉(zhuǎn)Excel并完整保留文本,表格與樣式的詳細內(nèi)容,更多關于C# Word轉(zhuǎn)Excel的資料請關注腳本之家其它相關文章!
相關文章
C#實現(xiàn)Winform小數(shù)字鍵盤模擬器
本文主要介紹了C#實現(xiàn)Winform小數(shù)字鍵盤模擬器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
C# 三種方式實現(xiàn)Socket數(shù)據(jù)接收
這篇文章主要給大家分享三種實現(xiàn)C# 實現(xiàn)Socket數(shù)據(jù)接收的方式,接下倆小編就來為大家詳細介紹吧,需要的朋友可以參考一下2021-10-10
DevExpress GridControl實現(xiàn)根據(jù)RowIndex和VisibleColumnsIndex來獲取單元格
這篇文章主要介紹了DevExpress GridControl實現(xiàn)根據(jù)RowIndex和VisibleColumnsIndex來獲取單元格值,需要的朋友可以參考下2014-08-08

