前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >dotnet OpenXML 获取 Excel 表格当前激活选择的工作表

dotnet OpenXML 获取 Excel 表格当前激活选择的工作表

作者头像
林德熙
发布2021-11-15 16:07:22
发布2021-11-15 16:07:22
1K00
代码可运行
举报
文章被收录于专栏:林德熙的博客林德熙的博客
运行总次数:0
代码可运行

本文告诉大家如何读取 Excel 里面的信息拿到当前激活选择的工作表

在开始之前,期望大家了解如何使用 OpenXML 读取 Excel 文件,如果对此还不了解,请看 C# dotnet WPF 使用 OpenXml 解析 Excel 文件

在 OpenXML 里面,可以通过 ActiveTab 属性拿到当前激活的工作表的序号。先打开咱的一个测试使用的 Excel 文件,如下面代码,接下来将使用此测试文件作为例子告诉大家如何拿到激活选择的工作表

代码语言:javascript
代码运行次数:0
运行
复制
            FileInfo file = new("Test.xlsx");
            using var stream = file.OpenRead();
            SpreadsheetDocument spreadsheet = SpreadsheetDocument.Open(stream, false);

以上的测试文件可以在本文最后拿到

通过 OpenXML SDK 的定义,可以了解到 ActiveTab 放在 WorkbookView 里面,新版本的 SDK 加了可空,可以方便让咱了解某些属性是否一定是必须的。刚好这就不是一个必须的属性,通过 ECMA 376 文档可以了解到,如果没有定义,那就是序号为 0 的工作表被激活。获取的代码如下

代码语言:javascript
代码运行次数:0
运行
复制
            var workbookPart = spreadsheet.WorkbookPart;
            Workbook workbook = workbookPart!.Workbook;
            var workbookView = workbook.BookViews?.GetFirstChild<WorkbookView>();
            var activeTabIndex = workbookView?.ActiveTab?.Value;
            Console.WriteLine($"当前激活的工作表序号:{activeTabIndex}");
            Debug.Assert(activeTabIndex != null);

拿到激活的工作表序号之后,可以通过序号拿到对应的工作表。这里有一个坑就是不能通过 WorksheetParts 的顺序去获取,如下面代码拿到的不一定是期望的工作表

代码语言:javascript
代码运行次数:0
运行
复制
            // 下面的获取方法是错误的,不能通过 WorksheetParts 的序号获取,原因是这里的顺序是依靠 workbook.xml.rels 文件里面存放的顺序决定的
            var worksheetPart = workbookPart.WorksheetParts.ElementAt((int)activeTabIndex);

原因就是这里的顺序是依靠 workbook.xml.rels 文件里面存放的顺序决定的。正确的获取方法是先拿到 workbook.xml 的 Sheets 属性,这个属性就是工作表的顺序

代码语言:javascript
代码运行次数:0
运行
复制
            var sheets = workbook.Sheets;
            // 序号从0开始
            var sheet = sheets!.Elements<Sheet>().ElementAt((int)activeTabIndex);

刚好这个序号是从 0 开始的,获取的方法十分简单,通过 Sheet 即可拿到对应工作表,代码如下

代码语言:javascript
代码运行次数:0
运行
复制
            var worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id!.Value!);
            var worksheet = worksheetPart.Worksheet;

以上就是获取激活的工作表的方法。如果想要拿到选择的工作表,尽管大部分的 Excel 文件,当前激活的工作表就是被选择的工作表,不过通过下面代码可以再次判断当前激活的工作表是否是选择的

代码语言:javascript
代码运行次数:0
运行
复制
            // 在工作表里面,也有一个属性表示当前是被选择的
            // 默认在 Excel 的行为就是被选择而且被激活
            var sheetViews = worksheet.SheetViews;
            var sheetView = sheetViews!.GetFirstChild<SheetView>();
            Console.WriteLine($"当前工作表被选择:{sheetView!.TabSelected}");

如果一个 Excel 表格的激活是在第二个工作表,但是选择的是第一个工作表,那么表现如下

本文以上的测试文件和代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

代码语言:javascript
代码运行次数:0
运行
复制
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin a3ccca2c3afb34ff1d21d83c77a90a8b41a1f35d

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源

代码语言:javascript
代码运行次数:0
运行
复制
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git

获取代码之后,进入 Xlsx 文件夹

更多请看 Office 使用 OpenXML SDK 解析文档博客目录


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档