Пример #1
0
        private bool CanAddThisRow(IEnumerable <Cell> row, DataTableDelimiter delimiter, DataTable dt)
        {
            switch (delimiter.RowEscapeMode)
            {
            case DataTableDelimiter.EnumEscapeMode.FirstCellIsEmpty:
                var cell = (row.First().CellValue as CellValue)?.InnerText;
                return(!String.IsNullOrEmpty(cell));

            case DataTableDelimiter.EnumEscapeMode.MaximumRowNUmberAchieved:
                return(dt.Rows.Count < delimiter.MaxRowNumber);

            default:
                throw new NotImplementedException();
            }
        }
Пример #2
0
        /// <summary>
        /// extracts the dataset from table stored inside sheet name
        /// </summary>
        /// <param name="sheetName"></param>
        /// <param name="delimiter">Deleimiter to read properly the sheet</param>
        /// <returns></returns>
        public ExcelContentEditor ReadTableFromSheet(string sheetName, DataTableDelimiter delimiter)
        {
            if (this._Data != null)
            {
                throw new InvalidOperationException($"Unable to read  file: override pre-existent data is forbidden!");
            }
            if (String.IsNullOrEmpty(sheetName))
            {
                throw new ArgumentNullException(nameof(sheetName));
            }
            if (delimiter == null)
            {
                throw new ArgumentNullException(nameof(delimiter));
            }

            DataTable dt = new DataTable();

            using (MemoryStream stream = new MemoryStream())
            {
                // copy source file
                stream.Write(_DocumentContent, 0, (int)_DocumentContent.Length);
                //start editing
                using (SpreadsheetDocument doc = SpreadsheetDocument.Open(stream, true))
                {
                    //Read the first Sheet from Excel file.
                    Sheet sheet = doc.WorkbookPart.Workbook.Sheets.ChildElements.OfType <Sheet>().Single(x => x.Name == sheetName);

                    //Get the Worksheet instance.
                    Worksheet worksheet = (doc.WorkbookPart.GetPartById(sheet.Id.Value) as WorksheetPart).Worksheet;

                    //Fetch all the rows present in the Worksheet.
                    IEnumerable <Row> rows = worksheet.GetFirstChild <SheetData>().Descendants <Row>();

                    //Loop through the Worksheet rows.
                    foreach (Row row in rows)
                    {
                        int rowIndex = Array.IndexOf(rows.ToArray(), row);
                        if (rowIndex < delimiter.StartRowIndex)
                        {
                            continue;
                        }

                        //Use the first row to add columns to DataTable.
                        if (rowIndex == delimiter.StartRowIndex)
                        {
                            CreateColumnSchema(row.Descendants <Cell>(), doc, dt, delimiter.MaxColumnNumber);
                        }
                        else
                        {
                            //Add rows to DataTable.
                            var cells = row.Descendants <Cell>();
                            if (!CanAddThisRow(cells, delimiter, dt))
                            {
                                break;
                            }

                            dt.Rows.Add();
                            int i = 0;
                            foreach (Cell cell in cells)
                            {
                                // check on maximum side
                                if (i == dt.Columns.Count)
                                {
                                    break;
                                }

                                // fill the dataset
                                var targetColumn = dt.Columns[i];
                                dt.Rows[dt.Rows.Count - 1][i] = GetValue(doc, cell);
                                i++;
                            }
                        }
                    }
                }
            }

            this._Data = dt;
            return(this);
        }