c# excel 如何在已用范围内查找第一个单元格。
c# excel how to Find First Cell in a used range.
我可以使用 XlCellType.xlCellTypeLastCell
找到所用范围内的最后一个单元格。如何获得一行中的第一个单元格?
获取最后一个单元格位置的代码。
Excel.Range mergeCells = (Excel.Range)mergeSheet.Cells[6,1].EntireRow;
var rowRng = mergeCells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing);
var colPosition = rowRng.Column;
一种方法是获取 mergeCells.value
并循环递增计数器,直到我看到 null/empty 值。但我希望能在一行中得到这个。
有任何想法吗 ?
测试用例:
(1)
预期结果 colPosition = 1
(2)
预期结果 colPosition = 5
我强烈 (x10) 建议使用 ClosedXML 而不是 Microsoft 的 Excel 库(除非您使用的是旧的 xls 文件)。使用 ClosedXML,您将执行以下操作(这是直接从他们的网页上获取的):
立即从 NuGet 包中获取它。 Install-Package ClosedXML -Version 0.93.1
https://github.com/ClosedXML/ClosedXML/wiki/Finding-and-extracting-the-data
var wb = new XLWorkbook(northwinddataXlsx);
var ws = wb.Worksheet("Data");
// Look for the first row used
var firstRowUsed = ws.FirstRowUsed();
// Narrow down the row so that it only includes the used part
var categoryRow = firstRowUsed.RowUsed();
// Move to the next row (it now has the titles)
categoryRow = categoryRow.RowBelow();
// Get all categories
while (!categoryRow.Cell(coCategoryId).IsEmpty())
{
String categoryName = categoryRow.Cell(coCategoryName).GetString();
categories.Add(categoryName);
categoryRow = categoryRow.RowBelow();
}
这是一个使用 Excel Interop 库的解决方案(如问题中所标记)。下面的方法将 return 给定行中第一个单元格的基于 1 的列索引。它对你提供的测试用例以及我自己的一些测试用例都有效。请注意,如果您希望简单地使用已使用范围中的第一行 - 而不是提供的行,您可以使用 ActiveSheet.UsedRange.Rows[1].Row
.
找到第一个使用的行号
public static int FindFirstCellInExcelRow(string filePath, int rowNum)
{
Excel.Application xlApp = null;
Excel.Workbook wkBook = null;
Excel.Worksheet wkSheet = null;
Excel.Range range = null;
try
{
xlApp = new Excel.Application();
wkBook = xlApp.Workbooks.Open(filePath);
wkSheet = wkBook.ActiveSheet;
range = wkSheet.Cells[rowNum, 1].EntireRow;
if (range.Cells[1, 1].Value != null)
{
return range.Cells[1, 1].Column;
}
var result = range.Find(What: "*", After: range.Cells[1, 1], LookAt: Excel.XlLookAt.xlPart, LookIn: Excel.XlFindLookIn.xlValues, SearchOrder: Excel.XlSearchOrder.xlByColumns, SearchDirection: Excel.XlSearchDirection.xlNext, MatchByte: false, MatchCase: false);
int colIdx = result?.Column ?? 0; // return 0 if no cell in row contains value
return colIdx;
}
finally
{
wkBook.Close();
Marshal.ReleaseComObject(xlApp);
Marshal.ReleaseComObject(wkBook);
Marshal.ReleaseComObject(wkSheet);
Marshal.ReleaseComObject(range);
xlApp = null;
wkBook = null;
wkSheet = null;
range = null;
}
}
试试下面的代码片段,这将给出 excel 使用范围的第一行
Excel.Workbook xlWB = Globals.ThisAddIn.Application.ActiveWorkbook;
Excel.Worksheet xlWS = xlWB.ActiveSheet;
int firstRow = xlWS.UsedRange.Row;
我可以使用 XlCellType.xlCellTypeLastCell
找到所用范围内的最后一个单元格。如何获得一行中的第一个单元格?
获取最后一个单元格位置的代码。
Excel.Range mergeCells = (Excel.Range)mergeSheet.Cells[6,1].EntireRow;
var rowRng = mergeCells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing);
var colPosition = rowRng.Column;
一种方法是获取 mergeCells.value
并循环递增计数器,直到我看到 null/empty 值。但我希望能在一行中得到这个。
有任何想法吗 ?
测试用例:
(1)
预期结果 colPosition = 1
(2)
预期结果 colPosition = 5
我强烈 (x10) 建议使用 ClosedXML 而不是 Microsoft 的 Excel 库(除非您使用的是旧的 xls 文件)。使用 ClosedXML,您将执行以下操作(这是直接从他们的网页上获取的):
立即从 NuGet 包中获取它。 Install-Package ClosedXML -Version 0.93.1
https://github.com/ClosedXML/ClosedXML/wiki/Finding-and-extracting-the-data
var wb = new XLWorkbook(northwinddataXlsx);
var ws = wb.Worksheet("Data");
// Look for the first row used
var firstRowUsed = ws.FirstRowUsed();
// Narrow down the row so that it only includes the used part
var categoryRow = firstRowUsed.RowUsed();
// Move to the next row (it now has the titles)
categoryRow = categoryRow.RowBelow();
// Get all categories
while (!categoryRow.Cell(coCategoryId).IsEmpty())
{
String categoryName = categoryRow.Cell(coCategoryName).GetString();
categories.Add(categoryName);
categoryRow = categoryRow.RowBelow();
}
这是一个使用 Excel Interop 库的解决方案(如问题中所标记)。下面的方法将 return 给定行中第一个单元格的基于 1 的列索引。它对你提供的测试用例以及我自己的一些测试用例都有效。请注意,如果您希望简单地使用已使用范围中的第一行 - 而不是提供的行,您可以使用 ActiveSheet.UsedRange.Rows[1].Row
.
public static int FindFirstCellInExcelRow(string filePath, int rowNum)
{
Excel.Application xlApp = null;
Excel.Workbook wkBook = null;
Excel.Worksheet wkSheet = null;
Excel.Range range = null;
try
{
xlApp = new Excel.Application();
wkBook = xlApp.Workbooks.Open(filePath);
wkSheet = wkBook.ActiveSheet;
range = wkSheet.Cells[rowNum, 1].EntireRow;
if (range.Cells[1, 1].Value != null)
{
return range.Cells[1, 1].Column;
}
var result = range.Find(What: "*", After: range.Cells[1, 1], LookAt: Excel.XlLookAt.xlPart, LookIn: Excel.XlFindLookIn.xlValues, SearchOrder: Excel.XlSearchOrder.xlByColumns, SearchDirection: Excel.XlSearchDirection.xlNext, MatchByte: false, MatchCase: false);
int colIdx = result?.Column ?? 0; // return 0 if no cell in row contains value
return colIdx;
}
finally
{
wkBook.Close();
Marshal.ReleaseComObject(xlApp);
Marshal.ReleaseComObject(wkBook);
Marshal.ReleaseComObject(wkSheet);
Marshal.ReleaseComObject(range);
xlApp = null;
wkBook = null;
wkSheet = null;
range = null;
}
}
试试下面的代码片段,这将给出 excel 使用范围的第一行
Excel.Workbook xlWB = Globals.ThisAddIn.Application.ActiveWorkbook;
Excel.Worksheet xlWS = xlWB.ActiveSheet;
int firstRow = xlWS.UsedRange.Row;