我一直在努力尋找解決方案,以便如何使用OpenXml讀取大型xlsx文件。我已經試過微軟樣本,但沒有運氣。我只需要在c#中將一個excel文件讀入一個DataTable。我不關心數據表中的值類型,所有內容都可以作爲字符串值存儲。OpenXML,SAX和簡單讀取Xlsx文件
我迄今發現的樣本不保留電子表格的結構,只返回單元格的值。
任何想法?
我一直在努力尋找解決方案,以便如何使用OpenXml讀取大型xlsx文件。我已經試過微軟樣本,但沒有運氣。我只需要在c#中將一個excel文件讀入一個DataTable。我不關心數據表中的值類型,所有內容都可以作爲字符串值存儲。OpenXML,SAX和簡單讀取Xlsx文件
我迄今發現的樣本不保留電子表格的結構,只返回單元格的值。
任何想法?
開放的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
}
值可以得到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;
}
謝謝,我肯定會試試看。 – Mark
我需要能夠通過SAX方法讀取excel文件。 simpleooxml支持嗎? – Mark
我認爲它會正常工作。 simpleooxml實際上只是普通物品的薄薄一層。我只是將整個項目包括在內,並在需要時跳入並對底層進行任何調整。它在大多數情況下返回原始XML對象。至少它應該指向正確的方向。 –