簡體   English   中英

使用EPPlus將excel文件導入數據庫

[英]import excel file to database using EPPlus

我很難理解什么應該是一個簡單的任務。 我現在正在使用 EPPlus 來幫助我完成這項任務。 但是,我處於無法跟蹤正在發生的事情的地步。 (根據下面的評論和谷歌搜索的天數)我正在嘗試讀取 excel 文件並將其傳遞給我的 EF 模型。 它在第 159 行出現故障,我試圖在其中輸入 excel 文件中的值,但一直顯示為 null。 但是,當查看第 159 行之后的值時,它們都具有正確的信息。 我什至不知道如何跟蹤這樣的錯誤。

卡車控制器.cs

    // POST: Trucks/Import
    [HttpPost]
    public ActionResult Import(FormCollection formCollection)
    {
        if (Request != null)
        {
            HttpPostedFileBase file = Request.Files["file"];


            if ((file != null) && (file.ContentLength > 0) && !string.IsNullOrEmpty(file.FileName))
            {
                file.SaveAs(Server.MapPath("~/" + "test.xlsx"));
                //string fileName = file.FileName;
              //  string fileContentType = file.ContentType;
                byte[] fileBytes = new byte[file.ContentLength];
               // var data = file.InputStream.Read(fileBytes, 0, Convert.ToInt32(file.ContentLength));
                var MyImport = new List<string>();
               MyImport = ImportDataRecords(new FileInfo(Server.MapPath("~/" ) + "test.xlsx"));
            }
        }
        return View("Import");
    }

    public List<string> ImportDataRecords(FileInfo file)
    {
        var resultMessages = new List<string>();
        var totalImported = 0;
        try
        {
            using (var excelPackage = new ExcelPackage(file))
            {
                string DeliveryColumn,
                    ItemNoColumn,
                    MaterialColumn,
                    MaterialDescriptionColumn,
                    DeliveryQtytoPickColumn,
                    PickedQuantityColumn,
                    SalesUoMColumn,
                    BatchPickedColumn,
                    BinNoColumn,
                    BagWeightColumn,
                    PalletNoColumn,
                    PalletStackingNoColumn,
                    StageNoColumn,
                    SubStopNoColumn,
                    PickStatusColumn,
                    PackStatusColumn,
                    SoldToColumn,
                    SoldToNameColumn,
                    ShipToNameColumn;

                if (!file.Name.EndsWith("xlsx"))
                {
                    resultMessages.Add("File selected is not an Excel file");
                    return resultMessages;
                }

                var worksheet = excelPackage.Workbook.Worksheets[1];
                if (worksheet == null)
                {
                    resultMessages.Add("File was empty");
                    return resultMessages;
                }

                using (var headers = worksheet.Cells[1, 1, 1, worksheet.Dimension.End.Column])
                {
                    var expectedHeaders = new[]
                    {
                        "Delivery", "Item No.", "Material", "Material Description", "Delivery Qty to Pick",
                        "Picked Quantity", "Sales UoM", "Batch Picked", "BIN No.", "Bag Weight", "Pallet No.",
                        "Pallet Stacking No", "Stage No", "Sub Stop No", "Pick Status", "Pack Status", "Sold-To",
                        "Sold-To Name", "Ship-To Name"
                    };
                    if (!expectedHeaders.All(e => headers.Any(h => h.Value.Equals(e))))
                    {
                        resultMessages.Add("Some columns are missing from the file");
                        return resultMessages;
                    }

                    DeliveryColumn = headers.First(h => h.Value.Equals("Delivery")).Address[0].ToString();
                    ItemNoColumn = headers.First(h => h.Value.Equals("Item No.")).Address[0].ToString();
                    MaterialColumn = headers.First(h => h.Value.Equals("Material")).Address[0].ToString();
                    MaterialDescriptionColumn = headers.First(h => h.Value.Equals("Material Description")).Address[0].ToString();
                    DeliveryQtytoPickColumn = headers.First(h => h.Value.Equals("Delivery Qty to Pick")).Address[0].ToString();
                    PickedQuantityColumn = headers.First(h => h.Value.Equals("Picked Quantity")).Address[0].ToString();
                    SalesUoMColumn = headers.First(h => h.Value.Equals("Sales UoM")).Address[0].ToString();
                    BatchPickedColumn = headers.First(h => h.Value.Equals("Batch Picked")).Address[0].ToString();
                    BinNoColumn = headers.First(h => h.Value.Equals("BIN No.")).Address[0].ToString();
                    BagWeightColumn = headers.First(h => h.Value.Equals("Bag Weight")).Address[0].ToString();
                    PalletNoColumn = headers.First(h => h.Value.Equals("Pallet No.")).Address[0].ToString();
                    PalletStackingNoColumn = headers.First(h => h.Value.Equals("Pallet Stacking No")).Address[0].ToString();
                    StageNoColumn = headers.First(h => h.Value.Equals("Stage No")).Address[0].ToString();
                    SubStopNoColumn = headers.First(h => h.Value.Equals("Sub Stop No")).Address[0].ToString();
                    PickStatusColumn = headers.First(h => h.Value.Equals("Pick Status")).Address[0].ToString();
                    PackStatusColumn = headers.First(h => h.Value.Equals("Pack Status")).Address[0].ToString();
                    SoldToColumn = headers.First(h => h.Value.Equals("Sold-To")).Address[0].ToString();
                    SoldToNameColumn = headers.First(h => h.Value.Equals("Sold-To Name")).Address[0].ToString();
                    ShipToNameColumn = headers.First(h => h.Value.Equals("Ship-To Name")).Address[0].ToString();

                    using (var context = new EPPlusTruckContext())
                    {

                        var lastRow = worksheet.Dimension.End.Row;
                        for (var row = 2; row <= lastRow; row++)
                        {
-----------Line 159-------------> var truck = new Truck()
                            {
                                Delivery = worksheet.Cells[DeliveryColumn + row].Value.ToString(),
                                ItemNo = worksheet.Cells[ItemNoColumn + row].Value.ToString(),
                                Material = worksheet.Cells[MaterialColumn + row].Value.ToString(),
                                MaterialDescription = worksheet.Cells[MaterialDescriptionColumn + row].Value.ToString(),
                                DeliveryQtyToPick = worksheet.Cells[DeliveryQtytoPickColumn + row].Value.ToString(),
                                PickedQuantity = worksheet.Cells[PickedQuantityColumn + row].Value.ToString(),
                                SalesUoM = worksheet.Cells[SalesUoMColumn + row].Value.ToString(),
                                BatchPicked = worksheet.Cells[BatchPickedColumn + row].Value.ToString(),
                                BinNo = worksheet.Cells[BinNoColumn + row].Value.ToString(),
                                BagWeight = worksheet.Cells[BagWeightColumn + row].Value.ToString(),
                                PalletNo = worksheet.Cells[PalletNoColumn + row].Value.ToString(),
                                PalletStackingNo = worksheet.Cells[PalletStackingNoColumn + row].Value.ToString(),
                                StageNo = worksheet.Cells[StageNoColumn + row].Value.ToString(),
                                SubStopNo = worksheet.Cells[SubStopNoColumn + row].Value.ToString(),
                                PickStatus = worksheet.Cells[PickStatusColumn + row].Value.ToString(),
                                PackStatus = worksheet.Cells[PackStatusColumn + row].Value.ToString(),
                                SoldTo = worksheet.Cells[SoldToColumn + row].Value.ToString(),
                                SoldToName = worksheet.Cells[SoldToNameColumn + row].Value.ToString(),
                                ShipToName = worksheet.Cells[ShipToNameColumn + row].Value.ToString(),
                            };

                                db.Trucks.Add(truck);

                            try
                            {
                                db.SaveChanges();
                                totalImported++;
                            }
                            catch (Exception ex)
                            {

                                resultMessages.Add(string.Format("Record on line#{0} failed: {1}\n", row, ex.Message));
                            }
                        }

                    }

                }
                resultMessages.Insert(0, string.Format("{0} records successfully imported.\n", totalImported));
                return resultMessages;
            }

        }
        catch (IOException ex)
        {
            resultMessages.Add("File still open. Please close Excel file before importing.");
            return resultMessages;
        }
    }

這里有一個簡單的例子:
參考資料: http ://sforsuresh.in/read-data-excel-sheet-insert-database-table-c/

public bool readXLS(string FilePath)
{
    FileInfo existingFile = new FileInfo(FilePath);
    using (ExcelPackage package = new ExcelPackage(existingFile))
    {
        //get the first worksheet in the workbook
        ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
        int colCount = worksheet.Dimension.End.Column;  //get Column Count
        int rowCount = worksheet.Dimension.End.Row;     //get row count
        string queryString = "INSERT INTO tableName VALUES";        //Here I am using "blind insert". You can specify the column names Blient inset is strongly not recommanded
        string eachVal = "";
        bool status;
        for (int row = 1; row <= rowCount; row++)
        {
            queryString += "(";
            for (int col = 1; col <= colCount; col++)
            {
                eachVal = worksheet.Cells[row, col].Value.ToString().Trim();
                queryString += "'" + eachVal + "',";
            }
            queryString = queryString.Remove(queryString.Length - 1, 1);    //removing last comma (,) from the string
            if (row % 1000 == 0)        //On every 1000 query will execute, as maximum of 1000 will be executed at a time. 
            {
                queryString += ")";
                status = this.runQuery(queryString);    //executing query
                if (status == false)
                    return status;
                queryString = "INSERT INTO tableName VALUES";
            }
            else
            {
                queryString += "),";
            }
        }
        queryString = queryString.Remove(queryString.Length - 1, 1);    //removing last comma (,) from the string
        status = this.runQuery(queryString);    //executing query
        return status;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM