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

相关文章

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片