簡體   English   中英

在Excel文件中搜索字符串,並在C#中使用OpenXML返回搜索到的單元格的rowindex和columnindex

[英]Search string in excel file and return searched cell's rowindex and columnindex using OpenXML in C#

我想在excel文件中搜索字符串,我曾經在程序中使用Microsoft.Office.Interop.Excel,並且效果很好。 我在下面使用此代碼:

 findRange1 = range1.Find("apple", LookAt: Excel.XlLookAt.xlWhole);

但是,在服務器端使用interop excel時遇到了問題。 然后我使用OpenXML更改程序。 我也想使用OpenXML進行搜索。 如何在OpenXML中做到這一點?

1)將您的excel文檔.xlsxxls導入到OpenXMl SpreadsheetDocument中。

public WorkbookPart ImportExcel()
    {
        try
        {
            string path = @"your path to excel document";

            using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                MemoryStream m_ms = new MemoryStream();
                fs.CopyTo(m_ms);

                SpreadsheetDocument m_Doc = SpreadsheetDocument.Open(m_ms, false);

                return m_Doc.WorkbookPart;
            }
        }
        catch (Exception ex)
        {
            System.Diagnostics.Trace.TraceError(ex.Message + ex.StackTrace);
        }
        return null;
    }

2)創建使用特定搜索條件以[row, column]形式獲取索引的方法。

public string GetIndexBySearch(string search)
        {

            WorkbookPart workbookPart = ImportExcel();
            var sheets = workbookPart.Workbook.Descendants<Sheet>();
            Sheet sheet = sheets.Where(x => x.Name.Value == "you sheet name in excel document").FirstOrDefault();

            string index = string.Empty;

            if (sheet != null)
            {
                var worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);
                var rows = worksheetPart.Worksheet.Descendants<Row>().ToList();

                // Remove the header row
                rows.RemoveAt(0);

                foreach (var row in rows)
                {
                    var cellss = row.Elements<Cell>().ToList();

                    foreach (var cell in cellss)
                    {
                        var value = cell.InnerText;
                        var stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
                        value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
                        bool isFound = value.Trim().ToLower().Contains(search.Trim().ToLower());

                        if (isFound)
                        {
                            index = $"[{row.RowIndex}, {GetColumnIndex(cell.CellReference)}]";
                            return index;
                        }

                    }
                }
            }

            return index;
        }

3)最后,此方法通過傳遞列名為您提供列索引。

private static int? GetColumnIndex(string cellReference)
    {
        if (string.IsNullOrEmpty(cellReference))
        {
            return null;
        }

        string columnReference = Regex.Replace(cellReference.ToUpper(), @"[\d]", string.Empty);

        int columnNumber = -1;
        int mulitplier = 1;

        foreach (char c in columnReference.ToCharArray().Reverse())
        {
            columnNumber += mulitplier * ((int)c - 64);

            mulitplier = mulitplier * 26;
        }

        return columnNumber + 1;
    }

4)考慮到以上所有三種方法都在稱為MyClass同一類中。 然后您將使用GetIndexBySearch類的

MyClass c = new MyClass();
string index = c.GetIndexBySearch("AFL");

輸出:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM