Закрытое чтение XML в таблице через пустые строки - PullRequest
0 голосов
/ 08 июня 2018

У меня есть метод, который читает из электронной таблицы, чтобы создать аукцион для моего приложения.Я получаю исключение ниже, и мне было интересно, почему диапазон моего листа был установлен на это, а затем, как изменить диапазон, чтобы я мог прочитать остальную часть моего файла Excel.

public ActionResult Upload(UploadFile UploadFile)
    {
        if (ModelState.IsValid)
        {

            if (UploadFile.ExcelFile.ContentLength > 0)
            {
                if (UploadFile.ExcelFile.FileName.EndsWith(".xlsx") || UploadFile.ExcelFile.FileName.EndsWith(".xls"))
                {
                    XLWorkbook wb;
                    //incase if the file is corrupt
                    try
                    {
                        wb = new XLWorkbook(UploadFile.ExcelFile.InputStream);
                    }
                    catch (Exception ex)
                    {
                        ModelState.AddModelError(String.Empty, $"Check your file. {ex.Message}");
                        return View();
                    }
                    IXLWorksheet ws = null;
                    try//incase if the sheet you are looking for is not found
                    {
                        ws = wb.Worksheet("sheet1");

                    }
                    catch
                    {
                        ModelState.AddModelError(String.Empty, "Sheet not found");
                        return View();
                    }
                    var firstRowUsed = ws.FirstRowUsed();
                    var auctionRow = firstRowUsed.RowUsed().RowBelow();

                    //create auction
                    string auctionName = auctionRow.Cell(1).Value.ToString();
                    DateTimeOffset startDate = DateTimeOffset.Parse(auctionRow.Cell(2).Value.ToString());
                    DateTimeOffset endDate = DateTimeOffset.Parse(auctionRow.Cell(3).Value.ToString());
                    string folderName = auctionRow.Cell(4).Value.ToString();

                    Models.Auction auction = new Models.Auction(auctionName, startDate, endDate, folderName);
                    db.Auctions.Add(auction);


                    //find the next table
                    var nextRow = auctionRow.RowBelow();
                    while (nextRow.IsEmpty())
                    {
                        nextRow = nextRow.RowBelow();
                    }

                    const int catNameCol = 1;
                    var firstCatRow = nextRow.RowUsed();
                    var catRow = firstCatRow.RowBelow();

                    //get categories from ws table and add to the auction
                    while (!catRow.Cell(catNameCol).IsEmpty())
                    {
                        string catName = catRow.Cell(1).Value.ToString();
                        int seqNo = Convert.ToInt32(catRow.Cell(2).Value.ToString());
                        string fileName = catRow.Cell(3).Value.ToString();

                        Cat cat = new Cat(auction.AuctionId, catName, seqNo, fileName);
                        auction.Cats.Add(cat);

                        catRow = catRow.RowBelow();
                    }

                    var findNextRow = catRow.RowBelow();
                    while (findNextRow.IsEmpty())
                    {
                        findNextRow = findNextRow.RowBelow();
                    }
                    const int itemNameCol = 1;

                    var itemRow = findNextRow.RowUsed().RowBelow();
                    while (!itemRow.Cell(itemNameCol).IsEmpty())
                    {
                        string itemName = itemRow.Cell(1).Value.ToString();
                        string itemDesc = itemRow.Cell(2).Value.ToString();
                        string catName = itemRow.Cell(3).Value.ToString();
                        string modelNo = itemRow.Cell(4).Value.ToString();
                        decimal retailValue = Convert.ToDecimal(itemRow.Cell(5).Value.ToString());
                        string fileName = itemRow.Cell(6).Value.ToString();
                        decimal initialBid = Convert.ToDecimal(itemRow.Cell(7).Value.ToString());
                        decimal increment = Convert.ToDecimal(itemRow.Cell(8).Value.ToString());
                        Cat itemCat = null;

                        foreach (var cat in auction.Cats)
                        {
                            if (catName == cat.CatName.Trim())
                            {
                                itemCat = cat;
                            }
                        }

                        Item item = new Item(itemName, itemDesc, modelNo, retailValue, fileName, startDate, endDate, initialBid, increment, null, null, null, itemCat);
                        itemCat.Items.Add(item);

                        itemRow = itemRow.RowBelow();
                    }
                }
                else
                {
                    ModelState.AddModelError(String.Empty, "Only .xlsx and .xls files are allowed");
                    return View();
                }
            }
            else
            {
                ModelState.AddModelError(String.Empty, "Not a valid file");
                return View();
            }
        }
        db.SaveChanges();
        return View();
    }

Исключение: enter image description here Формат документа Excel: enter image description here Я действительно новичок в этом, поэтому дайте мне знать, если есть какой-то синтаксис, чтобы выполнить то, что я пытаюсь, и исправить это исключение,Также дайте мне знать, если есть что-то, что я могу изменить / улучшить.Спасибо, любезно

1 Ответ

0 голосов
/ 09 июня 2018

nextRow - это усеченная строка "C15: F15", и данные, которые вы ищете, больше этого диапазона.Я думаю, что здесь также есть ошибка ClosedXML.В вашем случае это помогает взять всю строку листа и затем использовать ячейки.Попробуйте следующее:

var firstCatRow = nextRow.WorksheetRow().RowUsed();
...