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

news/2024/7/21 6:05:37 标签: c#, excel

此代码假定您已经安装了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文件的路径和工作表的名称来获取工作表中的所有数据。

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;
    }
}


http://www.niftyadmin.cn/n/5331404.html

相关文章

Python 语法糖

一、基本概念 语法糖&#xff0c;可以理解为&#xff1a;“甜蜜” 的便捷语法。 它是编程语言为程序提供的更简洁、更易读的语法实现的语法结构&#xff0c;它并不影响语言的功能&#xff0c;仅仅是一种更便捷的书写方式。 这就像你制作蛋糕时&#xff0c;使用现代烤箱而不是…

深度强化学习的变道策略:Harmonious Lane Changing via Deep Reinforcement Learning

偏理论&#xff0c;假设情况不易发生 摘要 多智能体强化学习的换道策略&#xff0c;不同的智能体在每一轮学习后交换策略&#xff0c;达到零和博弈。 和谐驾驶仅依赖于单个车辆有限的感知结果来平衡整体和个体效率&#xff0c;奖励机制结合个人效率和整体效率的和谐。 Ⅰ. 简…

第36期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

k-means算法思想和代码实现

import random import pandas as pd import numpy as np import matplotlib.pyplot as plt import time# 计算欧拉距离 def getDistance(dataSet, centroids, k):clalist []for data in dataSet:diff np.tile(data, (k, 1)) - centroids # 相减 (np.tile(a,(2,1))就是把a先…

网络/信息安全(黑客)——2024自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

C语言:底层剖析——函数栈帧的创建和销毁

一、究竟什么是函数栈帧 C语言的使用是面向过程的&#xff0c; 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以了。所以C语言的程序都是以函数作为基本单位的&#xff0c;如果能够深入理解…

交换机_05VLAN

一、VLAN技术的引入 VLAN&#xff08;Virtual Lan&#xff09;主要应用在交换机上 一台交换机默认情况下连接一个广播域&#xff0c;因为默认情况下所有的接口都是属于同一个vlan的&#xff0c;默认vlan1&#xff0c;所以是在同一个广播域中。 结合交换机工作原理&#xff0…

Qt根据单价计算总价与进制转换

1.相关说明 二进制、十进制、十六进制间的相互转换 2.界面绘制 3.相关主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete …