OpenXML讀取Excel數據以及處理Excel大文件


讀取Excel大文件,這是根據官方讀取大文件的方法改寫的,可以讀取到指定worksheet的值,但是這個方式有缺點,Excel表格本身不能有空單元格,否則讀取的時候自動會跳過這個單元格

public virtual void ReadExcelFileDOM(string fileName, string worksheet = "")
        {
            try { using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false)) { WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart; WorksheetPart worksheetPart = workbookPart.WorksheetParts.First(); SheetData sheetData = new SheetData(); Sheet theSheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == worksheet).FirstOrDefault(); if (theSheet != null) { sheetData = ((WorksheetPart)workbookPart.GetPartById(theSheet.Id)).Worksheet.GetFirstChild<SheetData>(); } int irow = 0; foreach (DocumentFormat.OpenXml.Spreadsheet.Row r in sheetData.Elements<DocumentFormat.OpenXml.Spreadsheet.Row>()) { irow = irow + 1; AppGloab.SysLogger.Info("Worksheet Row:" + irow); int icoloum = 0; foreach (DocumentFormat.OpenXml.Spreadsheet.Cell c in r.Elements<DocumentFormat.OpenXml.Spreadsheet.Cell>()) { icoloum = icoloum + 1; AppGloab.SysLogger.Info("Worksheet Row:" + irow + ", Column:" + icoloum); string value = null; if (c.InnerText.Length > 0) { value = c.InnerText; if (c.DataType != null) { switch (c.DataType.Value) { case CellValues.SharedString: var stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>() .FirstOrDefault(); if (stringTable != null) { value = stringTable.SharedStringTable .ElementAt(int.Parse(value)).InnerText; } break; case CellValues.Boolean: switch (value) { case "0": value = "FALSE"; break; default: value = "TRUE"; break; } break; }
                      Console.WriteLine(value); } } } } } } catch (Exception ex) { AppGloab.SysLogger.Error(ex); } }

 

讀取一個單元格的值,這個是官方的寫法

public string GetCellValue(string fileName, string sheetName, string addressName)
        {
            string value = null;
            try
            {
                using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
                {
                    WorkbookPart wbPart = document.WorkbookPart;

                    Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault();

                    if (theSheet == null)
                    {
                        throw new ArgumentException("sheetName" + sheetName);
                    }

                    WorksheetPart wsPart =
                        (WorksheetPart)(wbPart.GetPartById(theSheet.Id));

                    DocumentFormat.OpenXml.Spreadsheet.Cell theCell = wsPart.Worksheet.Descendants<DocumentFormat.OpenXml.Spreadsheet.Cell>().
                      Where(c => c.CellReference == addressName).FirstOrDefault();

                    if (theCell != null && theCell.InnerText.Length > 0)
                    {
                        value = theCell.InnerText;

                        if (theCell.DataType != null)
                        {
                            switch (theCell.DataType.Value)
                            {
                                case CellValues.SharedString:

                                    var stringTable =
                                        wbPart.GetPartsOfType<SharedStringTablePart>()
                                        .FirstOrDefault();

                                    if (stringTable != null)
                                    {
                                        value =
                                            stringTable.SharedStringTable
                                            .ElementAt(int.Parse(value)).InnerText;
                                    }
                                    else
                                    {
                                        value = null;
                                    }
                                    break;

                                case CellValues.Boolean:
                                    switch (value)
                                    {
                                        case "0":
                                            value = "FALSE";
                                            break;
                                        default:
                                            value = "TRUE";
                                            break;
                                    }
                                    break;
                            }
                        }
                    }
                    else
                    {
                        value = null;
                    }
                }
            }
            catch (Exception ex)
            {
                value = null;
                AppGloab.SysLogger.Error(ex);
            }

            return value;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM