Word 和 Excel 是两种完全不同的文件类型,Word 文档是用来写文章、写信或者制作报告的,而 Excel 文档则是以表格的形式保存数据,制作图表或者进行数学运算等,不建议将复杂的 Word 文档转成 Excel 表格,因为 Excel 很难按照 Word 中原有的布局来呈现内容。
但是如果你的 Word 文档中大部分是由表格组成,并且你想要在 Excel 中分析表格数据的话,可以使用将 Word 转为 Excel,并且保持很好的可读性。在本文中,我们将演示如何使用 Spire. Doc for .NET 和 Spire.XLS for .NET 在 C# 中将 Word 转为 Excel。
安装 Spire.Doc for .NET 与 Spire.XLS for .NET
首先,您需要将 Spire.Doc for.NET 与 Spire.XLS for.NET 包含的 DLL 文件作为引用添加到您的 .NET 项目中。
Spire.Doc for.NET 的 DLL 文件可以从此链接下载,也可以通过 NuGet 安装。
PM> Install-Package Spire.DocSpire.XLS for.NET 的 DLL 文件可以从此链接下载,也可以通过 NuGet 安装。
PM> Install-Package Spire.XLS将 Word 文档转为 Excel 文档
实现这个功能时,使用 Spire.Doc for .NET 读取和提取 Word 文档中的内容,使用 Spire.XLS for .NET 创建 Excel 文档并在特定单元格中写入数据。为了使这个代码示例易于理解,创建了以下三个执行特定功能的自定义方法。
- ExportTableInExcel() - 将 Word 表格的数据导出到指定的 Excel 单元格。
- CopyContentInTable() - 从 Word 中的一个表格单元格复制内容到 Excel 单元格。
- CopyTextAndStyle() - 从 Word 段落复制带有格式的文本到 Excel 单元格。
以下步骤演示了如何使用 Spire.Doc for .NET 和 Spire.XLS for .NET 将整个 Word 文档的数据导出到 Excel 工作表中:
- 创建一个 Document 对象来加载 Word 文件。
- 创建一个 Worbook 对象并向其中添加一个名为 "WordToExcel" 的工作表。
- 遍历 Word 文档中的所有部分,遍历每个部分下的所有文档对象,然后确定文档对象是段落还是表格。
- 如果文档对象是一个段落,则使用 CopyTextAndStyle() 方法在 Excel 中的指定单元格写入段落。
- 如果文档对象是一个表格,则使用 ExportTableInExcel() 方法将 Word 中的表格数据导出到 Excel 单元格。
- 使用 Worksheet.AllocatedRange.AutoFitRows() 方法和 Worksheet.AllocatedRange.AutoFitColumns() 方法来自动调整 Excel 中的行高和列宽,以便单元格内的数据不会超出单元格的边界。
- 使用 Workbook.SaveToFile()方法将工作簿保存为 Excel 文件。
- C#
using Spire.Doc.Documents;
using Spire.Doc;
using Spire.Xls;
using Spire.Doc.Fields;
using System.Drawing;
namespace WordToExcel
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建一个Document对象
            Document doc = new Document();
            // 从指定路径加载Word文档
            doc.LoadFromFile(@"../../data/tableSample.docx");
            // 创建一个Workbook对象
            Workbook wb = new Workbook();
            // 清除工作簿中的所有工作表
            wb.Worksheets.Clear();
            // 在工作簿中创建一个名为"WordToExcel"的空工作表
            Worksheet worksheet = wb.CreateEmptySheet("WordToExcel");
            
            // 初始化行和列的计数器
            int row = 1;
            int column = 1;
            // 遍历文档中的每个Section
            foreach (Section section in doc.Sections)
            {
                // 遍历Section中的每个DocumentObject
                foreach (DocumentObject documentObject in section.Body.ChildObjects)
                {
                    // 如果当前DocumentObject是一个段落
                    if (documentObject is Paragraph)
                    {
                        // 获取当前单元格范围
                        CellRange cell = worksheet.Range[row, column];
                        
                        // 将DocumentObject转换为Paragraph类型
                        Paragraph paragraph = documentObject as Paragraph;
                        // 调用CopyTextAndStyle方法将段落文本和样式复制到单元格
                        CopyTextAndStyle(cell, paragraph);
                       
                        // 行计数器递增
                        row++;
                    }
                    // 如果当前DocumentObject是一个表格
                    if (documentObject is Table)
                    {
                        // 将DocumentObject转换为Table类型
                        Table table = documentObject as Table;
                        // 调用ExportTableInExcel方法将表格导出到Excel,并返回新的行数
                        int currentRow = ExportTableInExcel(worksheet, row, table);
                     
                        // 更新行计数器
                        row = currentRow;
                    }
                }
            }
            // 自动调整工作表中所有行的宽度
            worksheet.AllocatedRange.AutoFitRows();
            
            // 自动调整工作表中所有列的宽度
            worksheet.AllocatedRange.AutoFitColumns();
            // 设置工作表中所有单元格的文本自动换行
            worksheet.AllocatedRange.IsWrapText = true;
            // 将工作簿保存为Excel文件,版本为2013
            wb.SaveToFile(@"../../output/WordToExcel1.xlsx", ExcelVersion.Version2013);
        }
        // 定义一个私有静态方法,用于将表格导出到Excel工作表
        private static int ExportTableInExcel(Worksheet worksheet, int row, Table table)
        {
            // 定义一个单元格范围变量
            CellRange cell;
           
            // 定义一个列计数器变量
            int column;
           
            // 遍历表格的每一行
            foreach (TableRow tbRow in table.Rows)
            {
                // 初始化列计数器为1
                column = 1;
               
                // 遍历当前行的每一个单元格
                foreach (TableCell tbCell in tbRow.Cells)
                {
                    // 获取当前Word表格单元格对应的Excel单元格范围
                    cell = worksheet.Range[row, column];
                   
                    // 设置单元格边框样式
                    cell.BorderAround(LineStyleType.Thin, Color.Black);
                    // 调用自定义方法CopyContentInTable来复制单元格内容到Excel单元格
                    CopyContentInTable(tbCell, cell);
                    
                    // 列计数器递增
                    column++;
                }
               
                // 行计数器递增
                row++;
            }
            
            // 返回更新后的行计数器值
            return row;
        }
        // 定义一个私有静态方法,用于复制表格单元格的内容到Excel单元格
        private static void CopyContentInTable(TableCell tbCell, CellRange cell)
        {
            // 创建一个新的段落对象,用于存储复制的内容
            Paragraph newPara = new Paragraph(tbCell.Document);
            
            // 遍历表格单元格的子对象
            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);
        }
        // 定义一个私有静态方法,用于复制文本和样式到Excel单元格
        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;
                   
                    // 获取文本格式信息(字体名称、是否加粗、文本颜色、字体大小、文本内容、文本长度)
                    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;
                   
                    // 创建一个新的字体对象
                    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;
                   
                    // 将图片添加到工作表中的指定位置
                    cell.Worksheet.Pictures.Add(cell.Row, cell.Column, picture.Image);
                   
                    // 设置行高以适应图片高度
                    cell.Worksheet.SetRowHeightInPixels(cell.Row, 1, picture.Image.Height);
                }
            }
            
            // 根据段落的水平对齐方式设置单元格的水平对齐方式
            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;
            }
        }
    }
}
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
 



 
					



