从excel文件打开xml读取

我想在我的项目中实现openXml sdk 2.5。 我在这个环节做了一切事情

using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using System.IO.Packaging; static void Main(string[] args) { String fileName = @"C:\OPENXML\BigData.xlsx"; // Comment one of the following lines to test the method separately. ReadExcelFileDOM(fileName); // DOM //ReadExcelFileSAX(fileName); // SAX } // The DOM approach. // Note that the code below works only for cells that contain numeric values. // static void ReadExcelFileDOM(string fileName) { using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false)) { WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart; WorksheetPart worksheetPart = workbookPart.WorksheetParts.First(); SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First(); string text; int rowCount= sheetData.Elements<Row>().Count(); foreach (Row r in sheetData.Elements<Row>()) { foreach (Cell c in r.Elements<Cell>()) { text = c.CellValue.Text; Console.Write(text + " "); } } Console.WriteLine(); Console.ReadKey(); } } 

但我没有得到任何一行。 它没有进入循环。 注意:我还设置了openXml sdk 2.5我的电脑

而我发现下面的代码这是数值的工作。对于string值它写0 1 2 …

  private static void Main(string[] args) { var filePath = @"C:/OPENXML/BigData.xlsx"; using (var document = SpreadsheetDocument.Open(filePath, false)) { var workbookPart = document.WorkbookPart; var workbook = workbookPart.Workbook; var sheets = workbook.Descendants<Sheet>(); foreach (var sheet in sheets) { var worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id); var sharedStringPart = workbookPart.SharedStringTablePart; //var values = sharedStringPart.SharedStringTable.Elements<SharedStringItem>().ToArray(); string text; var rows = worksheetPart.Worksheet.Descendants<Row>(); foreach (var row in rows) { Console.WriteLine(); int count = row.Elements<Cell>().Count(); foreach (Cell c in row.Elements<Cell>()) { text = c.CellValue.InnerText; Console.Write(text + " "); } } } } Console.ReadLine(); } 

你的方法似乎对我来说很好,因为它“进入了循环”。 不过,你也可以尝试如下的东西:

 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); } } } } } } 

我使用filestream方法打开工作簿,因为这样可以使用共享访问来打开工作簿,以便可以同时在Excel中打开工作簿。 如果工作簿在别处打开,Spreadsheet.Open(…方法将不起作用。

也许这就是为什么你的代码不工作。

另请注意,在适当的情况下使用SharedStringTable来获取单元格文本。

我和OP有同样的问题,上面的答案不适合我。

我认为这是问题:当您在Excel中创build文档(不是以编程方式)时,默认情况下有3个工作表,而具有Sheet1行数据的WorksheetParts是最后一个WorksheetParts元素,而不是第一个。

我想通过在Visual Studio中放置一个watch.WorkbookPart.WorksheetParts监视器,展开结果,然后查看所有子元素,直到findHasChildren = true的SheetData对象。

尝试这个:

 // open the document read-only SpreadSheetDocument document = SpreadsheetDocument.Open(filePath, false); SharedStringTable sharedStringTable = document.WorkbookPart.SharedStringTablePart.SharedStringTable; string cellValue = null; foreach (WorksheetPart worksheetPart in document.WorkbookPart.WorksheetParts) { foreach (SheetData sheetData in worksheetPart.Worksheet.Elements<SheetData>()) { if (sheetData.HasChildren) { foreach (Row row in sheetData.Elements<Row>()) { foreach (Cell cell in row.Elements<Cell>()) { cellValue = cell.InnerText; if (cell.DataType == CellValues.SharedString) { Console.WriteLine("cell val: " + sharedStringTable.ElementAt(Int32.Parse(cellValue)).InnerText); } else { Console.WriteLine("cell val: " + cellValue); } } } } } } document.Close();