Ошибка при импорте файла Excel в сетку - PullRequest
0 голосов
/ 30 августа 2018

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

 protected void uploadLinkButton_Click(object sender, EventArgs e)
        {
            string name = "Items";
            string path = Server.MapPath(StyleOperationsFileUpload.FileName);
            string Constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=2;'";
            OleDbConnection OleCon = new OleDbConnection(Constr);
            OleDbCommand OleCom = new OleDbCommand("Select * From [" + name + "$]", OleCon);
            OleCon.Open();

            OleDbDataAdapter OleAdapObj = new OleDbDataAdapter(OleCom);
            DataTable DatTabObj = new DataTable();
            OleAdap.Fill(DatTab);
            UploadGridView.DataSource = DatTab;
            UploadGridView.DataBind();
        }

Ошибка, как показано ниже

ядру базы данных Microsoft Access не удалось найти объект 'Элементы $'. Убедитесь, что объект существует, и что вы пишете его имя и имя пути правильно. Если «Items $» не является локальным объектом, проверьте подключение к сети или обратитесь к администратору сервера.

Полная трассировка стека и ошибка, как показано ниже

System.Data.OleDb.OleDbException was unhandled by user code
  ErrorCode=-2147217865
  HResult=-2147217865
  Message=The Microsoft Access database engine could not find the object 'Items$'. Make sure the object exists and that you spell its name and the path name correctly. If 'Items$' is not a local object, check your network connection or contact the server administrator.
  Source=Microsoft Access Database Engine
  StackTrace:
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
       at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
       at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
       at StyleOperations.Operations.uploadLinkButton_Click(Object sender, EventArgs e) in D:\Developments\On Going Developments\StyleOperations\StyleOperations\StyleOperations\Operations.aspx.cs:line 145
       at System.Web.UI.WebControls.LinkButton.OnClick(EventArgs e)
       at System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument)
       at System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
       at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
       at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  InnerException: 

Пожалуйста, помогите мне решить эту проблему. Заранее спасибо.

Ниже приведен формат файла Excel. Имя файла Excel: Лист1

| 1 |DESCRIPTION|  SMV   |SEQ NO
| 2 |   Des1    |  1.2   | 1
| 3 |   Des2    |  2.5   | 2
| 4 |   Des3    |  5.8   | 3
| 5 |   Des4    |  4.2   | 4

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Во всяком случае, я нашел ответ на это. @JanAndersen Спасибо за вашу помощь. Ниже мой код. Сейчас работает нормально. :)

  using ClosedXML.Excel;
 protected void uploadLinkButton_Click(object sender, EventArgs e)
    {
        try
        {
            string FileName = Path.GetFileName(StyleOperationsFileUpload.PostedFile.FileName);
            string FolderPath = Server.MapPath("~/Downloads/" + FileName);
            StyleOperationsFileUpload.SaveAs(FolderPath);

            using (XLWorkbook workbook = new XLWorkbook(FolderPath))
            {
                IXLWorksheet worksheet = workbook.Worksheet(1);
                DataTable DatTab = new DataTable();
                bool FirstRow = true;
                foreach (IXLRow row in worksheet.Rows())
                {
                    if (FirstRow)
                    {
                        foreach (IXLCell cell in row.Cells())
                        {
                            DatTab.Columns.Add(cell.Value.ToString());
                        }
                        FirstRow = false;
                    }
                    else
                    {

                        DatTab.Rows.Add();

                        int i = 0;
                        foreach (IXLCell cell in row.Cells())
                        {
                            DatTab.Rows[DatTab.Rows.Count - 1][i] = cell.Value.ToString();
                            i++;
                        }

                    }

                }

                UploadGridView.DataSource = DatTab;
                UploadGridView.DataBind();
            }
            SaveLinkButton.Enabled = true;
        }
        catch (Exception ex)
        {
            Response.Write("<script>alert('Please Restart the system: " + ex + "')</script>");
        }

    }
0 голосов
/ 31 августа 2018

Просто убедитесь, что мы находимся на той же странице, более или менее.

Я исправил несколько ошибок, которые в любом случае остановили бы вас.

The filename and Sheet

// The name of the EXCEL-SHEET in the Excel File.
string name = "Items$";
// The Pathname of the Excel File
string path = Server.MapPath(StyleOperationsFileUpload.FileName);
// Getting the Extension to check whether it's old or new Office file.
string Extension = Path.GetExtension(path).ToLower();
// Default ConStr for "new" Excel (> 2003)
string ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=2'";
if (Extension.Trim() == ".xls")
{
    // ConStr for old Excel 97-2003 Project
    ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'";
}
OleDbConnection OleCon = new OleDbConnection(ConStr);
if (OleCon.State == ConnectionState.Closed)
{
    OleCon.Open();
}
// It seems that there might be some confusion about what that Sheet is called, so I would suggest checking up on what's in there.. 
bool doThatThing = false;
DataTable xTables = OleCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
foreach (DataRow xTable in xTables.Rows)
{
    // SheetsInFile:
    //sheetsInFile.Text += xTable["TABLE_NAME"].ToString();
    if (name == xTable["TABLE_NAME"].ToString())
        doThatThing = true;
}
if (doThatThing)
{
    OleDbCommand OleCom = new OleDbCommand("Select * From [" + name + "]", OleCon);
    OleDbDataAdapter OleAdapObj = new OleDbDataAdapter(OleCom);
    DataTable DatTabObj = new DataTable();
    OleAdapObj.Fill(DatTabObj);
    UploadGridView.DataSource = DatTabObj;
    UploadGridView.DataBind();
}
// Don't forget to close Connection
OleCon.Close();

Возможно, добавьте это к себе и включите sheetInFile в код позади.

<asp:Label ID="sheetsInFile" runat="server"></asp:Label>

--- Редактировать ---

Теперь, когда у вас есть сортированный путь к папке, он может с этим работать.

string ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Folderpath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=2'";
if (Extension.Trim() == ".xls")
{
    // ConStr for Excel 97-2003 Project
    ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Folderpath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'";
}
OleDbConnection OleCon = new OleDbConnection(ConStr);
if (OleCon.State == ConnectionState.Closed)
{
    OleCon.Open();
}
// If you know there is only going to be one Sheet
// - with a variable name, that you can't rememeber...
name = OleCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString();
OleDbCommand OleCom = new OleDbCommand("Select * From [" + name + "]", OleCon);
OleDbDataAdapter OleAdapObj = new OleDbDataAdapter(OleCom);
DataTable DatTabObj = new DataTable();
OleAdapObj.Fill(DatTabObj);
UploadGridView.DataSource = DatTabObj;
UploadGridView.DataBind();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...