【问题标题】:How to get a Sheet by name in Open XML SDK for Excel如何在 Open XML SDK for Excel 中按名称获取工作表
【发布时间】:2019-10-04 02:57:58
【问题描述】:

我正在测试用 Open XML SDK 库在用 C# 编写的 ASP.Net MVC 应用程序中替换 EPPlus 库的可能性,因为 EPPlus 中有一个错误,我们无法使用启用宏的电子表格进行压缩。我喜欢 EPPlus 的一个想法是我可以使用它:

public ExcelWorksheet this[string Name] { get; }

按名称获取工作表。查看 Open XML SDK 中 Sheets 类的定义,没有类似的构造。

我已经有了标签名称。我需要获取相关的工作表,这样我就可以在每次需要工作表时对其进行编辑,而无需遍历所有工作表。

我发现的一切都是相反的,得到一个 Sheet 对象的名称。有没有办法通过 Open XML SDK 中的选项卡文本获取工作表?或者我应该下载源代码并将此功能添加到课程中吗?

【问题讨论】:

标签: c# excel openxml-sdk


【解决方案1】:

这个答案有我想要的 - How to retrieve Tab names from excel sheet using OpenXML我正在努力在我的应用程序中实施更改,然后将发布代码。我根据该答案将功能包装到通用实用程序类中。

实用程序类代码:

public static class OpenXMLUtilities
{
    public static void UpdateCell(SpreadsheetDocument spreadSheet, string sheetName, DataAccess.Domain.CellType cellType, string value, uint rowIndex, string columnName)
    {
        WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, sheetName);

        if (worksheetPart != null)
        {
            Cell cell = GetCell(worksheetPart.Worksheet, columnName, rowIndex);

            cell.CellValue = new CellValue(value);

            switch (cellType)
            {
                case DataAccess.Domain.CellType.BidLocation:
                case DataAccess.Domain.CellType.Constant:
                case DataAccess.Domain.CellType.Email:
                case DataAccess.Domain.CellType.General:
                case DataAccess.Domain.CellType.Industry:
                case DataAccess.Domain.CellType.Name:
                case DataAccess.Domain.CellType.ProposalNumber:
                case DataAccess.Domain.CellType.Department:
                case DataAccess.Domain.CellType.Money:
                case DataAccess.Domain.CellType.Phone:
                    cell.DataType = new EnumValue<CellValues>(CellValues.String);
                    break;
                case DataAccess.Domain.CellType.Date:
                    cell.DataType = new EnumValue<CellValues>(CellValues.Date);
                    break;
                case DataAccess.Domain.CellType.Float:
                case DataAccess.Domain.CellType.Integer:
                    cell.DataType = new EnumValue<CellValues>(CellValues.Number);
                    break;
                case DataAccess.Domain.CellType.YesNoOrBlank:
                case DataAccess.Domain.CellType.YesOrNo:
                    cell.DataType = new EnumValue<CellValues>(CellValues.Boolean);
                    break;
            }

            worksheetPart.Worksheet.Save();
        }
    }

    public static WorksheetPart GetWorksheetPartByName(SpreadsheetDocument document, string sheetName)
    {
        IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>().Where(s => s.Name == sheetName);

        if (sheets.Count() == 0)
        {
            // The specified worksheet does not exist.
            return null;
        }

        string relationshipId = sheets.First().Id.Value;
        WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(relationshipId);

        return worksheetPart;
    }

    private static Cell GetCell(Worksheet worksheet, string columnName, uint rowIndex)
    {
        Row row = GetRow(worksheet, rowIndex);

        if (row == null)
        {
            return null;
        }

        return row.Elements<Cell>().Where(c => string.Compare(c.CellReference.Value, columnName + rowIndex, true) == 0).First();
    }
    private static Row GetRow(Worksheet worksheet, uint rowIndex)
    {
        return worksheet.GetFirstChild<SheetData>().Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
    }

}

【讨论】:

  • 而这正是您对...说“不”而提出的重复帖子...
  • 我是个没有足够咖啡的白痴。我坦率地承认这一点。
【解决方案2】:

查找 EPPlus 源代码的 url https://github.com/JanKallman/EPPlus

【讨论】:

    【解决方案3】:

    您可以使用以下方法获取带有 sheetName 的 WorkSheet。

    public static Worksheet GetworksheetBySheetName(string sheetName)
     {
       using (SpreadsheetDocument document = SpreadsheetDocument.Open(@"C:\Users\Public\Documents\Sheet7.xlsx", true))
       {
         var workbookPart = document.WorkbookPart;
                    string relationshipId = workbookPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name.Equals(sheetName))?.Id;
    
         var worksheet = ((WorksheetPart)workbookPart.GetPartById(relationshipId)).Worksheet;
    
         return worksheet;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多