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

2024-01-16 23:20

本文主要是介绍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文件的路径和工作表的名称来获取工作表中的所有数据。

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

这篇关于openxml获取sheet所有的数据二维数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/614247

相关文章

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA