前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# dotnet WPF 使用 OpenXml 解析 Excel 文件

C# dotnet WPF 使用 OpenXml 解析 Excel 文件

作者头像
林德熙
发布2020-04-08 15:51:03
1.2K0
发布2020-04-08 15:51:03
举报
文章被收录于专栏:林德熙的博客

在 2013 微软开源了 OpenXml 解析库,在微软的 Excel 文档,使用的文档格式就是国际规范的 OpenXml 格式。这个格式有很多版本,详细请看百度。因为表格文稿使用的是 OpenXml 在 .NET 开发可以非常简单将 Excel 文档进行解析,大概只需要两句话

本文通过一个简单的 WPF 程序告诉大家如何解析,这个简单的 WPF 程序简单到仅有一个按钮,在点击按钮时自动解析 Excel 文档的内容

用 OpenXML 能做什么?其实可以做的东西很多,例如在 WPF 或 UWP 或 Xamarin 等里面使用 OpenXML 解析读取 Excel 文件内容,读取 PPT 和 Word 等文档的内容,只要符合 OpenXML 格式就能进行读取

通过 NuGet 安装 Openxml 库,这个库支持跨平台,因为只是解析数据

然后在按钮点击的代码里面添加下面代码解析

代码语言:javascript
复制
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (SpreadsheetDocument doc = SpreadsheetDocument.Open(fs, false))
                {

                }
            }

大概这样就解析完成了,上面代码的 fileName 就是传入的文件,如下面代码

代码语言:javascript
复制
            string fileName = @"f:\lindexi\FurlalloganarBerkojelfarwiwa.xlsx";

在 Excel 里面有多个标签,下面代码是获取第一个标签

代码语言:javascript
复制
                    WorkbookPart workbookPart = doc.WorkbookPart;
                    SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
                    SharedStringTable sst = sstpart.SharedStringTable;

                    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
                    Worksheet sheet = worksheetPart.Worksheet;

如果读取格子里面内容,可以使用下面代码

代码语言:javascript
复制
                    var cells = sheet.Descendants<Cell>();
                    var rows = sheet.Descendants<Row>();

                    Debug.WriteLine("Row count = {0}", rows.LongCount());
                    Debug.WriteLine("Cell count = {0}", cells.LongCount());

                    // One way: go through each cell in the sheet
                    foreach (Cell cell in cells)
                    {
                        if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
                        {
                            int ssid = int.Parse(cell.CellValue.Text);
                            string str = sst.ChildElements[ssid].InnerText;
                            Debug.WriteLine("Shared string {0}: {1}", ssid, str);
                        }
                        else if (cell.CellValue != null)
                        {
                            Debug.WriteLine("Cell contents: {0}", cell.CellValue.Text);
                        }
                    }

                    // Or... via each row
                    foreach (Row row in rows)
                    {
                        foreach (Cell c in row.Elements<Cell>())
                        {
                            if ((c.DataType != null) && (c.DataType == CellValues.SharedString))
                            {
                                int ssid = int.Parse(c.CellValue.Text);
                                string str = sst.ChildElements[ssid].InnerText;
                                Debug.WriteLine("Shared string {0}: {1}", ssid, str);
                            }
                            else if (c.CellValue != null)
                            {
                                Debug.WriteLine("Cell contents: {0}", c.CellValue.Text);
                            }
                        }
                    }

如果想要了解解析的每个对象的内容,我推荐在对应的代码添加断点,如想要了解 row 的值等,可以如下图添加一个断点,然后通过局部变量窗口就可以看到每个变量的值

代码放在 github 欢迎小伙伴访问

如何添加断点请看 VisualStudio 断点调试详解

除了使用 OpenXML SDK 这个免费的库之外,还可以使用 EPPlus 这个收费或 LGPL 的库

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

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

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

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

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