您的方法对我来说似乎行得通-因为它确实“进入了循环”。不过,您也可以尝试以下操作:
void Main()
{
string fileName = @"c:\path\to\my\file.xlsx";
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (SpreadsheetDocument doc = SpreadsheetDocument.Open(fs, false))
{
WorkbookPart workbookPart = doc.WorkbookPart;
SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
SharedStringTable sst = sstpart.SharedStringTable;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
Worksheet sheet = worksheetPart.Worksheet;
var cells = sheet.Descendants<Cell>();
var rows = sheet.Descendants<Row>();
Console.WriteLine("Row count = {0}", rows.LongCount());
Console.WriteLine("Cell count = {0}", cells.LongCount());
// One way: go through each cell in the sheet
foreach (Cell cell in cells)
{
if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
{
int ssid = int.Parse(cell.CellValue.Text);
string str = sst.ChildElements[ssid].InnerText;
Console.WriteLine("Shared string {0}: {1}", ssid, str);
}
else if (cell.CellValue != null)
{
Console.WriteLine("Cell contents: {0}", cell.CellValue.Text);
}
}
// Or... via each row
foreach (Row row in rows)
{
foreach (Cell c in row.Elements<Cell>())
{
if ((c.DataType != null) && (c.DataType == CellValues.SharedString))
{
int ssid = int.Parse(c.CellValue.Text);
string str = sst.ChildElements[ssid].InnerText;
Console.WriteLine("Shared string {0}: {1}", ssid, str);
}
else if (c.CellValue != null)
{
Console.WriteLine("Cell contents: {0}", c.CellValue.Text);
}
}
}
}
}
}
我使用文件流方法来打开工作簿,因为它允许您使用共享访问权限来打开它- 这样您就可以同时在Excel中打开工作簿。如果工作簿在其他位置打开,则Spreadsheet.Open(…方法将不起作用。
也许这就是为什么您的代码无法正常工作的原因。
还要注意,在适当的地方使用SharedStringTable来获取单元格文本。
由于该帖子仍在获得投票,我还应该指出,在许多情况下,使用ClosedXML操作/阅读/编辑工作簿可能会容易得多。这些文档示例非常易于使用,根据我的有限经验,编码非常简单。请注意,它尚未(尚未)实现可能是或不是问题的所有Excel函数(例如INDEX和MATCH)。[不是我想无论如何都要尝试处理OpenXML中的INDEX和MATCH。]