如何使用 OpenXml 和 C# 从范围中获取所有 rows/cell 值
How to get all rows/cell values from a range with OpenXml and c#
我正在使用带有 OpenXml 的 c# 来尝试从 Excel 工作簿中读取一些单元格值。
我有定义 sheet 和我需要提取的单元格范围的字符串,例如
'Master Products'!$Q:$AD"
我正在从我的 Workbookpart 实例中的 DefinedName 获取上述字符串。
如何使用 OpenXml 获取此范围内描述的单元格值?
您可以创建自定义方法来遍历范围并读取单元格值。我会按照以下方式进行:
static void Main(string[] args)
{
int rowStart = 4;
string colStart = "Q";
int rowEnd = 89;
string colEnd = "AD";
string currentRow = colStart;
// make sure rowStart < rowEnd && colStart < colEnd
using (document = SpreadsheetDocument.Open(filePath, true))
{
WorkbookPart wbPart = document.WorkbookPart;
Worksheet sheet = wbPart.WorksheetParts.First().Worksheet;
while(currentRow != GetNextColumn(colEnd))
{
for (int i = rowStart; i <= rowEnd; i++)
{
Cell cell = GetCell(sheet, currentRow, i);
}
currentRow = GetNextColumn(currentRow);
}
}
Console.Read();
}
获取单元格值的方法:
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();
}
获取行的方法:
// Given a worksheet and a row index, return the row.
private static Row GetRow(Worksheet worksheet, uint rowIndex)
{
return worksheet.GetFirstChild<SheetData>().
Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
}
获取下一列的方法:
static string GetNextColumn(string col)
{
char[] charArr = col.ToCharArray();
var cur = Convert.ToChar((int) charArr[charArr.Length - 1]);
if (cur == 'Z')
{
if (charArr.Length == 1)
{
return "AA";
}
else
{
char[] newArray = charArr.Take(charArr.Length - 1).ToArray();
var ret = GetNextColumn(new string(newArray));
return ret + "A";
}
}
charArr[charArr.Length - 1] = Convert.ToChar((int)charArr[charArr.Length - 1] + 1);
return new string(charArr);
}
我正在使用带有 OpenXml 的 c# 来尝试从 Excel 工作簿中读取一些单元格值。
我有定义 sheet 和我需要提取的单元格范围的字符串,例如
'Master Products'!$Q:$AD"
我正在从我的 Workbookpart 实例中的 DefinedName 获取上述字符串。
如何使用 OpenXml 获取此范围内描述的单元格值?
您可以创建自定义方法来遍历范围并读取单元格值。我会按照以下方式进行:
static void Main(string[] args)
{
int rowStart = 4;
string colStart = "Q";
int rowEnd = 89;
string colEnd = "AD";
string currentRow = colStart;
// make sure rowStart < rowEnd && colStart < colEnd
using (document = SpreadsheetDocument.Open(filePath, true))
{
WorkbookPart wbPart = document.WorkbookPart;
Worksheet sheet = wbPart.WorksheetParts.First().Worksheet;
while(currentRow != GetNextColumn(colEnd))
{
for (int i = rowStart; i <= rowEnd; i++)
{
Cell cell = GetCell(sheet, currentRow, i);
}
currentRow = GetNextColumn(currentRow);
}
}
Console.Read();
}
获取单元格值的方法:
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();
}
获取行的方法:
// Given a worksheet and a row index, return the row.
private static Row GetRow(Worksheet worksheet, uint rowIndex)
{
return worksheet.GetFirstChild<SheetData>().
Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
}
获取下一列的方法:
static string GetNextColumn(string col)
{
char[] charArr = col.ToCharArray();
var cur = Convert.ToChar((int) charArr[charArr.Length - 1]);
if (cur == 'Z')
{
if (charArr.Length == 1)
{
return "AA";
}
else
{
char[] newArray = charArr.Take(charArr.Length - 1).ToArray();
var ret = GetNextColumn(new string(newArray));
return ret + "A";
}
}
charArr[charArr.Length - 1] = Convert.ToChar((int)charArr[charArr.Length - 1] + 1);
return new string(charArr);
}