私はOpenXmlで大きなxlsxファイルを読み取る方法の解決策を見つけるのに苦労してきました。私は運がなくてマイクロソフトのサンプルを試しました。ExcelファイルをC#のDataTableに読み込む必要があります。私はデータテーブルの値型には関係ありません。すべてを文字列値として格納できます。
私がこれまでに見つけたサンプルは、スプレッドシートの構造を保持せず、セルの値のみを返します。
何か案は?
open xml SDKは、理解するのが少し難しい場合があります。ただし、 http://simpleooxml.codeplex.com/このコードプレックスプロジェクトを使用すると便利であることがわかりました。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;
}