首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用OpenXml和c#从区域中获取所有行/单元格值

使用OpenXml和C#从区域中获取所有行/单元格值的步骤如下:

  1. 首先,确保已经安装了OpenXml SDK。可以通过NuGet包管理器来安装OpenXml SDK。
  2. 在C#代码中,引入以下命名空间:
代码语言:txt
复制
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
  1. 创建一个方法来获取区域中的所有行/单元格值:
代码语言:txt
复制
public static List<List<string>> GetValuesFromRange(string filePath, string sheetName, string range)
{
    List<List<string>> values = new List<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);
            Worksheet worksheet = worksheetPart.Worksheet;
            SheetData sheetData = worksheet.GetFirstChild<SheetData>();

            string[] rangeParts = range.Split(':');
            string startCellReference = rangeParts[0];
            string endCellReference = rangeParts[1];

            IEnumerable<Cell> cells = sheetData.Descendants<Cell>()
                .Where(c => string.Compare(c.CellReference.Value, startCellReference) >= 0 &&
                            string.Compare(c.CellReference.Value, endCellReference) <= 0);

            foreach (Cell cell in cells)
            {
                string cellValue = GetCellValue(cell, workbookPart);
                string cellReference = cell.CellReference.Value;

                int rowIndex = GetRowIndex(cellReference);
                int columnIndex = GetColumnIndex(cellReference);

                if (values.Count <= rowIndex)
                {
                    values.Add(new List<string>());
                }

                while (values[rowIndex].Count < columnIndex)
                {
                    values[rowIndex].Add("");
                }

                values[rowIndex].Add(cellValue);
            }
        }
    }

    return values;
}
  1. 创建一个辅助方法来获取单元格的值:
代码语言:txt
复制
private static string GetCellValue(Cell cell, WorkbookPart workbookPart)
{
    string cellValue = "";

    if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
    {
        SharedStringTablePart sharedStringTablePart = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
        if (sharedStringTablePart != null)
        {
            SharedStringItem sharedStringItem = sharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(cell.CellValue.Text));
            if (sharedStringItem != null)
            {
                cellValue = sharedStringItem.Text.Text;
            }
        }
    }
    else
    {
        cellValue = cell.CellValue?.Text ?? "";
    }

    return cellValue;
}
  1. 创建辅助方法来获取单元格的行索引:
代码语言:txt
复制
private static int GetRowIndex(string cellReference)
{
    string rowIndex = Regex.Replace(cellReference, "[^0-9]+", "");
    return int.Parse(rowIndex) - 1;
}
  1. 创建辅助方法来获取单元格的列索引:
代码语言:txt
复制
private static int GetColumnIndex(string cellReference)
{
    string columnName = Regex.Replace(cellReference, "[^A-Z]+", "");
    int columnIndex = 0;
    int factor = 1;

    for (int i = columnName.Length - 1; i >= 0; i--)
    {
        columnIndex += (columnName[i] - 'A' + 1) * factor;
        factor *= 26;
    }

    return columnIndex - 1;
}
  1. 调用上述方法来获取区域中的所有行/单元格值:
代码语言:txt
复制
string filePath = "路径/文件名.xlsx";
string sheetName = "工作表名称";
string range = "起始单元格:结束单元格";

List<List<string>> values = GetValuesFromRange(filePath, sheetName, range);

foreach (List<string> row in values)
{
    foreach (string cellValue in row)
    {
        Console.Write(cellValue + "\t");
    }
    Console.WriteLine();
}

以上代码将打开指定的Excel文件,选择指定的工作表和区域,并将区域中的所有行/单元格值存储在一个二维列表中。然后,可以根据需要对这些值进行进一步处理或输出。

注意:在使用OpenXml SDK时,需要确保Excel文件的格式是OpenXml格式(.xlsx)。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# dotnet 使用 OpenXml 解析 PPT 元素的坐标宽度高度

本文将告诉大家如何 PPT 里面解析出通用元素的 x y 的,以及元素的宽度高度的 在开始之前请看 C# dotnet 使用 OpenXml 解析 PPT 文件 在拿到 slidePart.Slide.CommonSlideData.ShapeTree...里面的元素,几乎所有元素都存在坐标宽度高度,这里的元素我称为通用元素,也就是不是特定的如形状、图片元素 此时的元素应该是继承 OpenXmlElement 类,在这个类里面可以通过 GetFirstChild...; 拿到 Transform2D 可以再获取 Offset 也就是 a:off 拿到 x y 的大小 var offset = transform2D.GetFirstChild...y 单位是 Emu 上面的类是我自己定义的,有可以抄的代码,请看 C# dontet Office Open XML Unit Converter 我定义了像素转换的代码 可以通过 Extents...也就是 a:ext 获取元素的宽度高度,请看代码 var extents = transform2D.GetFirstChild();

1.6K10
  • 根据标准word模板生成word文档类库(开源)

    类库操作ooxml方面使用的是OpenXML SDK,所以需要.framework 3.0及以上版本的支持。   今天贴上来的是第二版,第一版做得太粗糙了就不贴了,虽然第二版仍存在很多待改进的地方。...)的Tbl属性(类型为TblStructureInfo)表示表格单元格类型的填充域对象(默认为null代表该填充域非表格单元格类型),可通过Tbl[rowIndex,cellIndex]的方式获取表格的单元格...方法填充到填充域中。...Rows: 集合 方法如下: AddRow: 填充 RowStructureInfo: 表格单元格类型的填充域的表格类 属性如下: Index: 该行在模板表格中的索引(只读)...(大于或等于该单元格实体在行实体中的索引)(只读) ColSpan: 合并列数目(默认为1,即是不合并)(只读) RowSpan: 合并行数目(默认为1,即是不合并)(只读) Tips: 单元格中的提示内容

    2.4K60

    dotnet OpenXML 幻灯片 PPTX 的 Slide Id 页面序号的关系

    使用 OpenXML SDK 进行 Office 文档的解析时,对幻灯片 PPTX 文档的页面解析也许会遇到页面顺序的问题,本文告诉大家在 Office 文档里面页面的序号和顺序之间的关系以及如何读取页面序号...在开始之前,我期望你是了解一些 PPT 解析的相关知识的,入门级博客请看 C# dotnet 使用 OpenXml 解析 PPT 文件 在 C# dotnet 使用 OpenXml 解析 PPT 文件...这篇博客中没有详细告诉大家页面顺序的问题,但是按照 C# dotnet 使用 OpenXml 解析 PPT 文件 这篇博客的写法就是能拿到对的页面顺序 在 ECMA 376 标准中说明,在 Presentation.xml...文档将会记录页面的顺序页面的 Id ,也就是 Slide Id ,代码大概如下 </p...试试使用 COM 的方式,或者创建一个 VSTO 插件,试试使用下面代码获取 var application = new Application(); var

    73710

    dotnet OpenXML 利用合并表格单元格在 PPT 文档插入不可见的额外版权信息

    本文告诉大家如何利用 Office 对于 OpenXML 支持的特性,在 PPT 的表格里面,通过合并单元格存放一些额外的信息,这些信息对用户来说是不可见的,但是进行拷贝表格等的时候,可以保存此信息内容...在开始之前,期望大家已了解很多 OpenXML 知识,详细请看 Office 使用 OpenXML SDK 解析文档博客目录 在 PPT 的表格里面,采用了 RowSpan 用来表示单元格跨行,对应的在下一单元格将会被标记...例如我对第一第一个单元格设置合并单元格,合并行,那么在第二的第一列的单元格将被标记 vMerge="1" 表示被合并,如下面表格 在 Office 读取 OpenXML 文档,将无视 vMerge...="1" 的存在,也就是此属性只是给开发者看的而已,无论是否存在都不会影响到单元格的合并 但事实上,依然可以在标记了 vMerge="1" 的单元格上面添加内容,例如以下有删减的 OpenXML 文档...github gitee 欢迎访问 可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码 git init

    97210

    dotnet OpenXML 解析 PPT 页面元素文档格式

    本文告诉大家在 OpenXML 里面的 PPT 页面 Slide 的元素文档格式 是否小伙伴还记得如何使用 OpenXML SDK 获取一份 PPTX 文件的某一个页面?...如果不记得,请看 C# dotnet 使用 OpenXml 解析 PPT 文件 如下是一个简单的 PPTX 的 Slide 页面 ? 大概的主结构如下 ?...虽然 ShapeTree 命名是形状,但实际上所有元素都可以当成形状使用 例如在 ShapeTree 里面放一个文本,文本本身就是 DocumentFormat.OpenXml.Presentation.Shape...shape 添加断点就可以看到断点进入 在 VS 的帮助下,其实咱可以不理会PPT文档本身,直接使用 OpenXML 解析完成的,这样做的优势在于不需要频繁去找文档。...其他的业务都是根据业务本身数据拿出来进行处理,例如进行渲染或者修改等

    1.1K20

    dotnet OpenXml SDK 形状填充渐变色的主题色

    在 Office 文档的一些有趣的设计,颜色画刷是可以继承的,这个继承包括了属性的继承。... 而这个样式要的属性是 idx 属性,表示属于主题的哪个样式 那么在 OpenXML SDK 里面如何获取主题,如果是在 Slide 页面的元素可以通过下面的代码获取主题...FormatScheme 的 FillStyleList 拿到指定的元素,注意这里的 idx 使用的是 1 开始的下标。...但是 FillStyleList 的数组是 C# 的数组,下标是 0 开始 // FillReference reference, FormatScheme formatScheme if (...如果形状自己定义了就使用形状定义的 请看下图就知道如何获取 大部分的存在继承关系联系的都在 OpenXML SDK 里面写出来关系了,只有这些比较边角的功能需要自己实现 而渐变色的各个属性的行为请看

    45110

    dotnet OpenXML 文本 BodyProperties 的 FontScale 与文本字号缩放

    ,先使用 C# dotnet 使用 OpenXml 解析 PPT 文件 的方法读取测试的文档。... ECMA 376 文档可以了解 FontScale 属性的单位是千倍百分比,可使用 Office Open XML 的测量单位 提供的 dotnetCampus.OpenXMLUnitConverter...库的 Percentage 类型作为单位 获取文本框属性,可以使用以下代码 var shapeProperties = shape.ShapeProperties!...Office 的 PPT 相同 本文所有代码测试文件放在github gitee 欢迎访问 可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码...github.com/lindexi/lindexi_gd.git 获取代码之后,进入 Pptx 文件夹 更多请看 Office 使用 OpenXML SDK 解析文档博客目录 本文会经常更新

    64930

    Spread for Windows Forms快速入门(14)---文件操作

    通过使用相应的代码,你可以将整个控件,某个特定的表单,或者某个特定单元格域中的数据保存为几种不同的文件类型或者流。类似的,你可以允许用户对某几种文件类型进行文件操作。...表头会被输出为冻结的或者列。 ExcelOpenFlags或者ExcelSaveFlags枚举类型中的文档缓存选项允许用户打开,编辑,以及在不丢失高级文件内容格式的情况下保存文件。...当你执行保存操作时,控件中所有表单 就会被保存成为文件或者流。如果你选择保存格式,那么被保存的数据就会包括格式化的字符,例如货币符号以及其他 诸如同样被保存的单元格类型信息。...只要提供要打开文件的路径和文件名以及其他有关信息,使用FpSpread类的OpenExcel方法之一可以打开Excel文件中所有的表单。...你可以使用 ExcelOpenFlags 枚举类型指定附加的打开选项。如果只有导入数据,这个枚举类型允许你决定冻结的列或者如何被导入,并决定其他可选方面。

    2.7K60

    Excel高级筛选完全指南

    示例1:提取唯一 可以使用Excel高级筛选数据集中快速提取唯一记录(或者,移除重复)。如下图1所示的数据集。...图4 注意:使用高级筛选获取唯一列表时,确保选择了标题,否则,它会将第一视为标题。 示例2:在Excel高级筛选中使用条件 使用Excel高级筛选可以使用复杂的条件筛选数据。...如下图5所示,想要快速获取销售额大于5000且地区为US的所有记录。 图5 下面是如何使用Excel高级筛选根据指定条件筛选记录: 1.使用具有复杂条件的Excel高级筛选时,第一步是指定条件。...在本例中,由于要获取US销售额超过5000的所有记录,因此在Region下面的单元格中输入“US”,在sales下面的单元格内输入>5000。这将用作高级筛选中的输入,以获取筛选后的数据。...图7 3.选择原始数据集(注意,包括标题)。 4.单击功能“数据”选项卡“排序筛选”组中的“高级”命令按钮,打开“高级筛选”对话框。

    3.1K30

    dotnet OpenXML 读取形状轮廓线条样式序号超过主题样式列表数

    OpenXML 中,默认的形状可以通过指定 LineReference 让形状使用文档主题里面的样式。...文档主题里面包含多个样式,在形状里面指定样式通过的是序号的方法,如果在形状里面指定的序号超过了主题的数量,那么将会使用最后一项样式 开始之前,我准备了这份课件,我将课件代码都放在 GitHub 上可以在本文最后找到链接...C# dotnet 使用 OpenXml 解析 PPT 文件 博客的方法打开这份课件,可以使用如下代码读取到使用的 LineReference 样式 using (var presentationDocument...view=openxml-2.8.1 lineStyle--; } 以上的细节是 a:lnRef 指定的 idx 是序号,而序号是 1 开始的,...Outline 就是形状线条在主题样式的 本文所有代码放在 github gitee 欢迎小伙伴访问 更多请看 Office 使用 OpenXML SDK 解析文档博客目录

    51120

    dotnet OpenXML WPF 解析实现 PPT 文本描边效果

    本文是使用 WPF 做个 PowerPoint 系列的博客,本文来告诉大家如何解析 PPT 里面的文本描边效果,在 WPF 应用中绘制出来,实现像素级相同 背景知识 在开始之前,期望你了解了 PPT 解析的入门知识...如对 PPT 解析了解很少,请参阅 C# dotnet 使用 OpenXml 解析 PPT 文件 在 PPT 里面可以给文本的某些文字设置描边效果,描边效果 OpenXML 层上是不属于特效的,只是属于边框属性...> 咱所关注基本只有粗细颜色,获取方法分别如下 var outlineWidth = new Emu(outline.Width!....PPT 一样的界面 代码 本文所有代码测试文件放在github gitee 欢迎访问 可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码...github.com/lindexi/lindexi_gd.git 获取代码之后,进入 Pptx 文件夹 参考 WPF 文字描边 更多请看 Office 使用 OpenXML SDK 解析文档博客目录

    96920

    VLOOKUP很难理解?或许你就差这一个神器

    table_array (必需)VLOOKUP 在其中搜索lookup_value 返回单元格区域。可以使用命名区域或表,并且可以使用参数中的名称而不是单元格引用。...查找浙江省的景点是什么 首先以静态查找为例,编写VLOOKUP查找函数:C14:I19 表区域中查找D8单元格中浙江省的景点所在的列4,并且是精确查找。...=INDEX(C14:C19,7-C8) C13:I13域中的数组--名称,按照F7的数值,查找出目标名称得到需要的列数据。 =INDEX(C13:I13,F7) ?...【开始】--【条件格式】--【新建规则】--选择【使用公式确定要使用格式的单元格】,并在【为符合此公式的设置格式】中填写公式。 下面演示突出显示D13:I13域内的格式为例。...可以关注公众号并回复【VLOOKUP动态图解】获取文件。 ? 利用数据验证设置下拉选项 除了使用数值控制钮选择目标查找,还可以通过设置下拉选框选择目标查找

    8K60

    EXCEL VBA语句集300

    (35) Cells.Clear ‘清除工作表中所有单元格的内容 (36) ActiveCell.Offset(1,0).Select ‘活动单元格下移一,同理,可下移一列 (37) Range...周围是一个或多个空行或列 (39) ActiveWindow.RangeSelection.Value=XX ‘将XX输入到所选单元格域中 (40) ActiveWindow.RangeSelection.Count...(“Data1”),Range(“Data2”)) ‘返回Data1Data2域的交叉区域 (52) Range(“Data”).Count ‘单元格区域Data中的单元格数 Range(“...(54) Selection.Areas.Count ‘选中的单元格区域所包含的区域数 (55) ActiveSheet.UsedRange.Row ‘获取单元格域中使用的第一的行号 ...,vbYesNo)vbYes Then Exit Sub ‘返回不为“是”,则退出 (82) Config=vbYesNo+vbQuestion+vbDefaultButton2 ‘使用常量的组合

    1.8K40

    年度考核如何实现排名?

    案例:按分数大到小对学生进行排名 在C2单元格输入公式: =rank(B2,$B$2:$B$11,0) 然后向下填充公式,即可求得所有学生的排名。...$11,B3) countif($B$2:$B$11,B4)  …… 意思是,统计B2单元格在B2:B11域中出现的次数;统计B3单元的在B2:B11域中出现的次数;统计B4单元格在B2:...B11域中出现的次数…… 第三步:($B$2:$B$11>$B2)/countif($B$2:$B$11,$B$2:$B$11) 第一步得到的是逻辑,第二步得到的是每个数值出现的次数,逻辑在参与运算的时候...3.如何用数据透视表实现排名? 在数据区域任意一单元格单击,插入数据透视表 把“姓名”拖到,把“分数”拖到,连续拖两次。...排名可以使用rank函数来实现,默认的排名不符合使用习惯,可以使用sumproductcountif函数的结合或者借助数据透视表来实现排名。

    80200

    精通Excel数组公式14:使用INDEX函数OFFSET函数创建动态单元格区域

    通过指定参数row_num为空或0,告诉Excel返回所选列的所有。 同理,想要获取整行,则需要指定参数row_num的代表行号,将参数column_num指定为空或0。...这告诉Excel需要返回所选所有列。 ?...图2:对于不同数据类型查找最后一 在图2所示的公式[2]至[6]中,展示了一种近似查找的技术:当要查找的单元格域中的任何都大且执行近似匹配(即MATCH函数的第3个参数为空)时,将总是获取列表中最后一个相对位置...INDEXMATCH函数:获取单元格域中的最后一项 下图3图4展示了如何使用MATCHINDEX函数在单元格域中查找最后一项。 ? 图3:当有4条记录时查找单元格域中的最后一项 ?...此时,你在图5的数据区域中添加或删除记录,创建的动态单元格区域会自动更新。 下面是创建动态单元格区域公式的关键点: 1.足够的以容纳所有潜在数据。

    9K11

    dotnet OpenXML 解析 PPT 图表 面积图入门

    本文告诉大家如何使用 OpenXML 解析 PPT 的图表,以面积图为入门例子告诉大家 OpenXML 的存储 在 PPT 里面,有强大的图表功能,可以联动 Excel 展示数据。...对于默认面积图来说,纵坐标属于一个运行时属性,不会存放在 OpenXML 文档里面,需要根据每个系列的数值的最大最小以及配置,计算出来纵坐标的内容,本文不会涉及具体的坐标轴计算方法 数据系列...,各个系列的系列名称系列数据 下面将告诉大家如何根据 OpenXML SDK 提供的方法读取到图表的内容 读取图表 在开始之前,还请大家先了解 OpenXml 读取 PPT 的基础。...本文将在 C# dotnet 使用 OpenXml 解析 PPT 文件 的基础上进行开发 先读取 PPT 文档 var file = new FileInfo("Test.pptx...将在后续博客告诉大家这些内容行为,请看 Office 使用 OpenXML SDK 解析文档博客目录 代码 本文以上的测试文件代码放在github gitee 欢迎访问 可以通过如下方式获取本文的源代码

    93730

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

    本文告诉大家如何读取 Excel 里面的信息拿到当前激活选择的工作表 在开始之前,期望大家了解如何使用 OpenXML 读取 Excel 文件,如果对此还不了解,请看 C# dotnet WPF 使用...先打开咱的一个测试使用的 Excel 文件,如下面代码,接下来将使用此测试文件作为例子告诉大家如何拿到激活选择的工作表 FileInfo file = new("Test.xlsx...Elements().ElementAt((int)activeTabIndex); 刚好这个序号是 0 开始的,获取的方法十分简单,通过 Sheet 即可拿到对应工作表,代码如下...TabSelected}"); 如果一个 Excel 表格的激活是在第二个工作表,但是选择的是第一个工作表,那么表现如下 本文以上的测试文件代码放在github gitee 欢迎访问 可以通过如下方式获取本文的源代码...,进入 Xlsx 文件夹 更多请看 Office 使用 OpenXML SDK 解析文档博客目录 ----

    99110

    C# dotnet 使用 OpenXml 解析 PPT 里面的视频

    本文告诉大家如何 PPTX 文件里面解析出视频 我期望看到本文的小伙伴是了解 OpenXML 的,如果想要解析 Office 的文档,我推荐使用使用 OpenXML SDK 这个开源的库,更多入门级博客请看...C# dotnet 使用 OpenXml 解析 PPT 文件 我做了一个简单的 PPT 文件,这个文件里面只有一页,这一页上面有一个视频。...presentationPart.SlideParts.FirstOrDefault(); // 忽略代码 } 上面代码是打开解析文件,我拿到第一页,而获取页面的元素需要了解一点是...PPT 将所有元素存放 ShapeTree 而视频是不存在元素的,在 PPT 里面用 Picture 存放视频 <p:cnvpr id=...ApplicationNonVisualDrawingProperties .GetFirstChild(); 而视频用的是 r:link 拿到对应的资源,在 PPT 里面,用 GetPartById 获取

    66120

    Excel小技巧64:快速删除数据区域中的空行

    当然,我们可以一手动删除这些空行,但是如果数据量很大且空行较多时,这样的操作费时费力。 ? 图1 我们可以使用下面2种方法来快速删除数据区域中的空行。 方法1:使用定位条件 1....单击功能“开始”选项卡“编辑”组中的“查找选择——定位条件”命令,弹出“定位条件”对话框。 3. 在“定位条件”对话框中,选取“空”按钮,如下图2所示。 ?...图2 此时,Excel会选择数据区域中的空单元格,如下图3所示。 ? 图3 4. 单击功能“开始”选项卡“单元格”组中的“删除”命令,结果如下图4所示。 ?...单击功能“开始”选项卡“单元格”组中的“删除”命令,结果如下图8所示。 ? 图8 可以看到,数据区域中的空行全部被删除了且空单元格没有受到影响。...欢迎到知识星球:完美Excel社群,进行技术交流提问,获取更多电子资料。 ?

    1.3K20
    领券