2012-10-11 104 views
2

我一直在努力尋找解決方案,以便如何使用OpenXml讀取大型xlsx文件。我已經試過微軟樣本,但沒有運氣。我只需要在c#中將一個excel文件讀入一個DataTable。我不關心數據表中的值類型,所有內容都可以作爲字符串值存儲。OpenXML,SAX和簡單讀取Xlsx文件

我迄今發現的樣本不保留電子表格的結構,只返回單元格的值。

任何想法?

回答

1

開放的xml SDK可能有點難以理解。不過,我發現使用http://simpleooxml.codeplex.com/這個代碼plex項目很有用。它在sdk上添加了一個薄層,以便更輕鬆地通過excel文件解析並處理樣式。

然後你可以使用類似與他們的工作表讀者下面通過遞歸搶你想

System.IO.MemoryStream ms = Utility.StreamToMemory(xslxTemplate); 
using (SpreadsheetDocument document = SpreadsheetDocument.Open(ms, true)) 
{ 
    IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>(); 
    if (sheets.Count() == 0) 
    { 
     // The specified worksheet does not exist. 
     return null; 
    } 
    string relationshipId = sheets.First().Id.Value; 
    WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(relationshipId); 
    string myval =WorksheetReader.GetCell("A", 0, worksheetPart).CellValue.InnerText; 
    // Put in a loop to go through contents of document 
} 
+0

謝謝,我肯定會試試看。 – Mark

+0

我需要能夠通過SAX方法讀取excel文件。 simpleooxml支持嗎? – Mark

+0

我認爲它會正常工作。 simpleooxml實際上只是普通物品的薄薄一層。我只是將整個項目包括在內,並在需要時跳入並對底層進行任何調整。它在大多數情況下返回原始XML對象。至少它應該指向正確的方向。 –

0

值可以得到DataTable中這樣說:

using (SpreadsheetDocument spreadsheet = SpreadsheetDocument.Open(fileName, false)) 
{ 
    DataTable data = ToDataTable(spreadsheet, "Employees"); 
} 

這個方法會讀Excel表格數據爲DataTable

public DataTable ToDataTable(SpreadsheetDocument spreadsheet, string worksheetName) 
{ 
    var workbookPart = spreadsheet.WorkbookPart; 

    var sheet = workbookPart 
     .Workbook 
     .Descendants<Sheet>() 
     .FirstOrDefault(s => s.Name == worksheetName); 

    var worksheetPart = sheet == null 
     ? null 
     : workbookPart.GetPartById(sheet.Id) as WorksheetPart; 

    var dataTable = new DataTable(); 

    if (worksheetPart != null) 
    { 
     var sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>(); 

     foreach (Row row in sheetData.Descendants<Row>()) 
     { 
      var values = row 
       .Descendants<Cell>() 
       .Select(cell => 
       { 
        var value = cell.CellValue.InnerXml; 
        if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString) 
        { 
         value = workbookPart 
          .SharedStringTablePart 
          .SharedStringTable 
          .ChildElements[int.Parse(value)] 
          .InnerText; 
        } 
        return (object)value; 
       }) 
       .ToArray(); 

      dataTable.Rows.Add(values); 
     } 
    } 

    return dataTable; 
}