繁体   English   中英

OpenXML,SAX和只需读取Xlsx文件

[英]OpenXML, SAX, and Simply Reading an Xlsx file

我一直在努力寻找如何使用OpenXml读取大型xlsx文件的解决方案。 我试过微软示例,没有运气。 我只需要将Excel文件读入c#的DataTable中即可。 我不关心数据表中的值类型,所有内容都可以存储为字符串值。

到目前为止,我发现的样本并未保留电子表格的结构,仅返回单元格的值。

有任何想法吗?

开放的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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM