openxml获取sheet所有的数据二维数组

此代码假定您已经安装了OpenXML SDK,并且您有一个.xlsx文件的路径。\n\n请注意,续写的代码将获取指定工作表中的所有数据,包括空单元格,并将它们存储在一个二维数组中。如果工作表中有多个行和列,数组的大小将与工作表中的行数和列数相匹配。\n\n```csharp\nusing DocumentFormat.OpenXml.Packaging;\nusing DocumentFormat.OpenXml.Spreadsheet;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\npublic class ExcelReader\n{\n public static string[,] GetAllSheetData(string filePath, string sheetName)\n {\n // 打开Excel文件\n using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))\n {\n // 获取工作表\n WorkbookPart workbookPart = document.WorkbookPart;\n Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == sheetName);\n if (sheet == null)\n {\n throw new ArgumentException($\"Sheet {sheetName} not found.\", nameof(sheetName));\n }\n\n // 获取工作表数据\n WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);\n SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();\n var rows = sheetData.Descendants<Row>();\n\n // 获取最大行数和列数\n int rowCount = rows.Count();\n int colCount = rows.Max(r => r.Elements<Cell>().Count());\n\n // 创建二维数组\n string[,] dataArray = new string[rowCount, colCount];\n\n // 遍历所有行\n for (int i = 0; i < rowCount; i++)\n {\n var row = rows.ElementAt(i);\n var cells = row.Elements<Cell>().ToArray();\n\n // 遍历所有列\n for (int j = 0; j < colCount; j++)\n {\n // 如果单元格不存在,则将其视为空\n if (j >= cells.Length || cells[j].CellValue == null)\n {\n dataArray[i, j] = string.Empty;\n }\n else\n {\n string value = cells[j].CellValue.InnerText;\n\n // 假设值是一个共享字符串\n if (cells[j].DataType != null && cells[j].DataType.Value == CellValues.SharedString)\n {\n var stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();\n if (stringTable != null)\n {\n value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;\n }\n }\n dataArray[i, j] = value;\n }\n }\n }\n return dataArray;\n }\n }\n}\n```\n\n在这段代码中,我们首先使用`SpreadsheetDocument.Open`方法打开Excel文件。然后,我们查找具有指定名称的工作表,并获取工作表中的所有行和列。我们计算出最大的行数和列数,以便创建一个适当大小的二维字符串数组。接着,我们遍历所有的行和列,将每个单元格的数据读取到数组中。\n\n如果单元格的数据是共享字符串(即,字符串存在于工作簿的共享字符串表中),我们会检索共享字符串表并获取实际的字符串值。\n\n现在,您可以通过调用`ExcelReader.GetAllSheetData`方法并传递Excel文件的路径和工作表的名称来获取工作表中的所有数据。

cs 复制代码
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        string filePath = "YourExcelFile.xlsx"; // 替换为您的Excel文件路径

        // 调用方法获取工作表数据
        string[][] sheetData = ReadExcelFile(filePath, "Sheet1");

        // 打印数据
        foreach (var row in sheetData)
        {
            Console.WriteLine(string.Join("\t", row));
        }
    }

    static string[][] ReadExcelFile(string filePath, string sheetName)
    {
        List<string[]> sheetData = new List<string[]>();

        using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))
        {
            WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
            Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == sheetName);

            if (sheet != null)
            {
                WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);

                // 获取工作表中的所有行
                IEnumerable<Row> rows = worksheetPart.Worksheet.Descendants<Row>();

                foreach (Row row in rows)
                {
                    // 获取行中的所有单元格
                    IEnumerable<Cell> cells = row.Elements<Cell>();

                    // 将单元格值添加到数组
                    string[] rowData = cells.Select(cell => GetCellValue(workbookPart, cell)).ToArray();
                    sheetData.Add(rowData);
                }
            }
        }

        return sheetData.ToArray();
    }

    static string GetCellValue(WorkbookPart workbookPart, Cell cell)
    {
        if (cell.DataType != null && cell.DataType == CellValues.SharedString)
        {
            // 如果单元格类型为共享字符串,则获取共享字符串的值
            SharedStringTablePart sharedStringTablePart = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
            if (sharedStringTablePart != null)
            {
                int sharedStringIndex = int.Parse(cell.InnerText);
                return sharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(sharedStringIndex).InnerText;
            }
        }

        // 否则直接获取单元格的值
        return cell.InnerText;
    }
}
相关推荐
、昔年1 小时前
前端univer创建、编辑excel
前端·excel·univer
bin91532 小时前
前端JavaScript导出excel,并用excel分析数据,使用SheetJS导出excel
前端·javascript·excel
虚假程序设计2 小时前
pythonnet python图像 C# .NET图像 互转
开发语言·人工智能·python·opencv·c#·.net
我是苏苏3 小时前
Web开发:ABP框架3——入门级别的接口增删改查实现原理
c#·web开发·abp
Zhen (Evan) Wang3 小时前
.NET 6 API + Dapper + SQL Server 2014
数据库·c#·.net
VB.Net3 小时前
EmguCV学习笔记 VB.Net 12.3 OCR
opencv·计算机视觉·c#·ocr·图像·vb.net·emgucv
俊哥V3 小时前
[备忘]测算.net中对象所占用的内存
c#·.net·内存
闻缺陷则喜何志丹3 小时前
HObject复制耗时试用
c#·指针·halcon·key·图形图形·用时·非安全代码
friklogff4 小时前
【C#生态园】从数据分析到机器学习:掌握C#统计学库的核心功能
机器学习·数据分析·c#
我命由我123454 小时前
GPIO 理解(基本功能、模拟案例)
linux·运维·服务器·c语言·c++·嵌入式硬件·c#