在 C# 中使用 OpenXML 在 excel 文件中搜索字符串并 return 搜索单元格的行索引和列索引
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);
但是,我在服务器端使用互操作 excel 时遇到了问题。我使用 OpenXML 更改我的程序。我也想使用 OpenXML 进行搜索。如何在 OpenXML 中实现?
1) 将您的 excel 文档 .xlsx
或 xls
导入到 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) 考虑到以上 3 种方法都在同一个 class 中,称为 MyClass
。然后你会用GetIndexBySearch
like
MyClass c = new MyClass();
string index = c.GetIndexBySearch("AFL");
输出:
我想在 excel 文件中搜索字符串,我以前在我的程序中使用 Microsoft.Office.Interop.Excel 并且它工作得很好。我在下面使用此代码:
findRange1 = range1.Find("apple", LookAt: Excel.XlLookAt.xlWhole);
但是,我在服务器端使用互操作 excel 时遇到了问题。我使用 OpenXML 更改我的程序。我也想使用 OpenXML 进行搜索。如何在 OpenXML 中实现?
1) 将您的 excel 文档 .xlsx
或 xls
导入到 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) 考虑到以上 3 种方法都在同一个 class 中,称为 MyClass
。然后你会用GetIndexBySearch
like
MyClass c = new MyClass();
string index = c.GetIndexBySearch("AFL");
输出: