你能读Excel xlsx行像数据库行使用OpenXML吗?



昨天我几乎失去了理智,因为这应该是多么容易和现实之间的脱节。工作簿正在使用共享字符串;我确实找到了一种获取单元格值的方法但如果我能获得单元格中显示的内容而不是跳圈,那就更好了。更重要的是,我需要获取每一行的A、B和C列的值,但如果值为空,它会将其视为单元格不存在!您可以在foreach Row语句中填充伪代码吗?如果有一种方法可以直接获得值,那就更好了,但是您可以假设我有一个方法可以完成所有的字符串表查找。

try
{
using (SpreadsheetDocument doc = SpreadsheetDocument.Open("C:\temp\sitemap.xlsx", false))
{
WorkbookPart workbookPart = doc.WorkbookPart;
Sheets thesheetcollection = workbookPart.Workbook.GetFirstChild<Sheets>();
StringBuilder excelResult = new StringBuilder();
foreach (Sheet thesheet in thesheetcollection)
{
excelResult.AppendLine("Excel Sheet Name : " + thesheet.Name);
excelResult.AppendLine("----------------------------------------------- ");
Worksheet theWorksheet = ((WorksheetPart)workbookPart.GetPartById(thesheet.Id)).Worksheet;
SheetData thesheetdata = (SheetData)theWorksheet.GetFirstChild<SheetData>();
foreach (Row thecurrentrow in thesheetdata)
{
// Help needed here
var val1 = thecurrentrow[0].InnerText; // Col A
var val2 = thecurrentrow[1].InnerText; // Col B
var val3 = thecurrentrow[2].InnerText; // Col C
}
excelResult.Append("");
Console.WriteLine(excelResult.ToString());
Console.ReadLine();
}
}
}
catch (Exception)
{
}

您需要构建所有单元格地址,然后检查具有该地址的单元格是否存在。这样的:

private void ReadExcel()
{
for (int rowIdx = 1; rowIdx < 100; rowIdx++)
{
for (int colIdx = 1; colIdx < 30; colIdx++)
{
string cellAdress = $"{GetExcelColumnName(colIdx)}{rowIdx}";
DocumentFormat.OpenXml.Spreadsheet.Cell cell = theWorksheet.Descendants<DocumentFormat.OpenXml.Spreadsheet.Cell>().FirstOrDefault(c => c.CellReference == cellAdress);
// if cell == null the cell has no value
}
}
}
private static string GetExcelColumnName(int columnNumber)
{
int dividend = columnNumber;
string columnName = string.Empty;
int modulo;
while (dividend > 0)
{
modulo = (dividend - 1) % 26;
columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
dividend = (dividend - modulo) / 26;
}
return columnName;
}

最新更新