C#使用OpenXml读取Word、PPT、Excel文档内容

DocumentFormat.OpenXml是微软官方推出的一个操作Excel、Word、PPT文件的开源组件,因此它是免费的。以下是一些关于DocumentFormat.OpenXml的详细信息:

  1. 开源性质:DocumentFormat.OpenXml是一个开源项目,这意味着其源代码是公开的,并且允许开发者自由地使用、修改和分发。
  2. 功能:DocumentFormat.OpenXml提供了对Excel、Word、PPT等Office文档的底层操作能力,允许开发者以编程的方式对这些文档进行创建、编辑和修改。
  3. 版本:DocumentFormat.OpenXml有多个版本,其中最新的稳定版本是3.0.2。
  4. 性能与特点:虽然DocumentFormat.OpenXml提供了底层的操作能力,但使用它可能会比较复杂,因为它涉及到更多的底层细节和顺序限制。此外,由于其底层操作的特性,它并不总是能提供最高的性能。然而,对于那些需要精确控制文档结构和格式的开发者来说,DocumentFormat.OpenXml可能是一个不错的选择。

下面只做简单的对这几种格式的文件读取显示

使用NuGet搜索添加引用

DocumentFormat.OpenXml

运行调试代码(ppt或者word改下类名)

List<string> list = MyExcelByOpenXml.Read(@"E:\资料\文档\xxx.xlsx");
if (list != null)
{
    for (int i = 0; i < list.Count; i++)
        Console.WriteLine(list[i]);
}

读取Excel

using System;
using System.Collections.Generic;
using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

public class MyExcelByOpenXml
{
    public static List<string> Read(string filePath)
    {
        List<string> list = new List<string>();
        using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))
        {
            // 获取工作表集合
            WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
            Sheets sheets = workbookPart.Workbook.Descendants<Sheets>().FirstOrDefault();

            foreach (Sheet sheet in sheets.Elements<Sheet>())
            {
                // 获取工作表内容
                WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);

                // 获取工作表中的单元格
                var cells = worksheetPart.Worksheet.Descendants<Cell>();

                foreach (var cell in cells)
                {
                    // 获取单元格的值
                    string cellValue = GetCellValue(cell, workbookPart);
                    if (cellValue != null && cellValue != "")
                        list.Add(cellValue);
                    Console.WriteLine(cellValue);
                }
            }
        }
        return list;
    }
    private static string GetCellValue(Cell cell, WorkbookPart workbookPart)
    {
        string value = string.Empty;

        if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
        {
            int sharedStringIndex = int.Parse(cell.InnerText);
            value = workbookPart.SharedStringTablePart.SharedStringTable.ChildElements[sharedStringIndex].InnerText;
        }
        else if (cell.CellValue != null)
        {
            value = cell.CellValue.Text;
        }

        return value;
    }
}

读取Word

using System;
using System.Collections.Generic;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

class MyWord
{
    // 读取所有内容,以段落分割
    public static List<string> Read(string fileName)
    {
        try
        {
            List<string> list = new List<string>();
            // 打开现有的Word文档
            using (WordprocessingDocument doc = WordprocessingDocument.Open(fileName, false))
            {
                // 获取文档的主体部分
                Body body = doc.MainDocumentPart.Document.Body;
                // 遍历所有段落并输出文本
                foreach (Paragraph para in body.Elements<Paragraph>())
                {
                    if (para.InnerText != null || para.InnerText != "")
                    {
                        list.Add(para.InnerText);
                        Console.WriteLine(para.InnerText);
                    }
                }
            }
            return list;
        }
        catch (Exception ex)
        {
            Console.WriteLine("读取Word失败:" + ex.Message);
            return null;
        }
    }
}

读取PPT

using System;
using System.Collections.Generic;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;

class MyPPT
{
    // 读取所有内容,以段落分割
    public static List<string> Read(string fileName)
    {
        try
        {
            List<string> list = new List<string>();
            // 打开现有的ppt文档
            using (PresentationDocument ppt = PresentationDocument.Open(fileName, false))
            {
                // 获取文档的主体部分
                foreach (SlideId slideId in ppt.PresentationPart.Presentation.SlideIdList.Elements<SlideId>())
                {
                    // 获取幻灯片内容
                    SlidePart slidePart = (SlidePart)ppt.PresentationPart.GetPartById(slideId.RelationshipId);

                    // 获取幻灯片中的文本框
                    var textBoxes = slidePart.Slide.Descendants<DocumentFormat.OpenXml.Drawing.Text>();

                    foreach (var textBox in textBoxes)
                    {
                        Console.WriteLine(textBox.Text);
                        list.Add(textBox.Text);
                    }
                }
            }
            return list;
        }
        catch (Exception ex)
        {
            Console.WriteLine("读取Word失败:" + ex.Message);
            return null;
        }
    }
}

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用C#OpenXML SDK来读取Word文档中指定书签标记的图表。以下是大致的步骤: 1. 导入OpenXML SDK的命名空间。例如:`using DocumentFormat.OpenXml.Packaging;`和`using DocumentFormat.OpenXml.Wordprocessing;`。 2. 打开Word文档,并使用`WordprocessingDocument`类加载文档。例如:`WordprocessingDocument doc = WordprocessingDocument.Open("document.docx", true);`。 3. 获取文档中的书签标记。可以使用`BookmarkStart`和`BookmarkEnd`元素来识别书签标记。例如,使用以下代码获取名为“bookmark1”的书签标记: ```csharp BookmarkStart bookmarkStart = doc.MainDocumentPart.Document.Body.Descendants<BookmarkStart>().Where(b => b.Name == "bookmark1").FirstOrDefault(); BookmarkEnd bookmarkEnd = doc.MainDocumentPart.Document.Body.Descendants<BookmarkEnd>().Where(b => b.Id.Value == bookmarkStart.Id.Value).FirstOrDefault(); ``` 4. 使用书签标记的位置信息,获取书签标记所在的段落和图表。例如,使用以下代码获取名为“bookmark1”的书签标记所在的段落和图表: ```csharp Paragraph paragraph = bookmarkStart.Parent as Paragraph; Drawing drawing = paragraph.Elements<Drawing>().FirstOrDefault(); ChartReference chartReference = drawing.Inline.Graphic.GraphicData.Descendants<ChartReference>().FirstOrDefault(); ``` 5. 获取图表数据,并使用相应的库(如OpenXML SDK、Excel Interop或EPPlus)进行分析和处理。例如,使用以下代码获取图表数据: ```csharp ChartPart chartPart = (ChartPart)doc.MainDocumentPart.GetPartById(chartReference.Id); OpenXmlReader reader = OpenXmlReader.Create(chartPart); while (reader.Read()) { if (reader.ElementType == typeof(SeriesText)) { string seriesText = reader.GetText(); // 处理图表数据 } } ``` 请注意,这只是一个简单的示例,实际情况可能需要根据具体的文档和需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值