为什么无法使用XML SDK 2.0 C读取早于2013年的excel文件版本#

时间:2015-02-26 02:48:41

标签: c# openxml-sdk

所以我写了一些基本上尝试使用XML SDK读取excel文件的代码。这是我在Visual Studio 2010上用C#编写的代码。我把代码放在底部,但基本上我遇到的问题是它会读取任何2013版本的excel文件。任何早于2013年的Excel版本都不会读取。更特别的是,当excel版本比2013年更早时,该程序不会进入foreach循环。任何想法为什么?

    static void ReadExcelFile(string fileName)
    {
        //open the file
        using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(fileName, true))
        {
            //workbook part captcure
            WorkbookPart workbookPart = myDoc.WorkbookPart;

            //then access to the worksheet part
            WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();

            //find sheet data
            SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();


            foreach (Row r in sheetData.Elements<Row>())
            {

                foreach (Cell c in r.Elements<Cell>())
                {
                    string text = c.CellValue.Text;

                    Console.WriteLine(text); 
                }
            }
            Console.ReadKey();
        }
    }

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题。在这里,我提供了一个自解释代码示例。

我已经使用Excel 2010版本对此进行了测试。在我看来,MSDN声明您的版本仅适用于Excel 2013,仅适用于单元格包含数字的情况。在给定的示例中,我不是使用LINQ来获取元素,而是手动遍历各个部分。

//open the file
using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(path, true))
{
     //Get workbookpart
     WorkbookPart workbookPart = myDoc.WorkbookPart;

     // Extract the workbook part
     var stringtable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();

    //then access to the worksheet part
    IEnumerable<WorksheetPart> worksheetPart = workbookPart.WorksheetParts;

    foreach (WorksheetPart WSP in worksheetPart)
    {
        //find sheet data
        IEnumerable<SheetData> sheetData = WSP.Worksheet.Elements<SheetData>();

       foreach (SheetData SD in sheetData)
       {
            foreach (Row row in SD.Elements<Row>())
            {
                // For each cell we need to identify type
                foreach (Cell cell in row.Elements<Cell>())
                {
                    if (cell.DataType == null && cell.CellValue != null)
                    {
                         // Check for pure numbers
                         Console.WriteLine(cell.CellValue.Text);
                    }
                     else if (cell.DataType.Value == CellValues.Boolean)
                    {
                         // Booleans
                         Console.WriteLine(cell.CellValue.Text);
                     }
                    else if (cell.CellValue != null)
                    {
                         // A shared string
                         if (stringtable != null)
                         {
                          // Cell value holds the shared string location
                          Console.WriteLine(stringtable.SharedStringTable.ElementAt(int.Parse(cell.CellValue.Text)).InnerText);
                         }
                     }
                     else { 
                           Console.WriteLine("A broken book");
                     }
                 }
            }
        }
   }