karthikv101 Ответов: 2

это недопустимое имя. Убедитесь, что он не содержит недопустимых символов или знаков препинания и что он не слишком длинный.


когда я читал excel с помощью oledb, он успешно извлекал данные. Но когда имя листа содержит '#' , он не считывает данные.
Это дает следующую ошибку.
- это неподходящее имя. Убедитесь, что он не содержит недопустимых символов или знаков препинания и что он не слишком длинный.

[Правка - ОП-код от комментария]
Microsoft.Office.Interop.Excel.Application excelFileObject = new Microsoft.Office.Interop.Excel.Application(); 

 Microsoft.Office.Interop.Excel.Workbook workBookObject = null;
 workBookObject = excelFileObject.Workbooks.Open(File, 0, true, 5, "", "", false, 

 Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
 Microsoft.Office.Interop.Excel.Sheets sheets = workBookObject.Worksheets;
 Microsoft.Office.Interop.Excel.Worksheet sheet = null;

 String Con = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + File + ";Extended Properties="Excel 

 12.0;HDR=Yes;IMEX=2\"";
 OleDbConnection obj_Con = new OleDbConnection(Con);
 obj_Con.Open();

 string sheet_Name = "ABCD#EFGH";
 string query = String.Format("select * from [{0}$]", sheet_Name);
 OleDbCommand obj_CmdSelect = new OleDbCommand(query, obj_Con);
 OleDbDataAdapter obj_Adapter = new OleDbDataAdapter();
 obj_Adapter.SelectCommand = obj_CmdSelect;
 DataSet obj_Dataset = new DataSet();
 obj_Adapter.Fill(obj_Dataset, "Data"); /// Error occurs here

CHill60

Опубликуйте код, который вы используете для доступа к этому листу

karthikv101

Привет CHill60,

Спасибо за ваш ответ. Ниже приведен код

Microsoft.Офис.Взаимодействие.Превосходить.Приложение excelFileObject = новый Microsoft.Офис.Взаимодействие.Превосходить.Приложение();

Microsoft.Офис.Взаимодействие.Превосходить.Книги workBookObject = нуль;
workBookObject = excelFileObject.Рабочая тетрадь.Открыть(файл, 0, true, 5, "", "", false,

Microsoft.Офис.Взаимодействие.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
Microsoft.Офис.Взаимодействие.Превосходить.Листы листы = workBookObject.Рабочий лист;
Microsoft.Офис.Взаимодействие.Превосходить.Рабочий лист sheet = null;

Строка Кон = "Поставщика=Майкрософт.Туз.Oledb для.12.0;Файл Источника Данных=" ++ "; Дополнительные Свойства="В Excel

12.0;HDR=да;IMEX=2\"";
OleDbConnection obj_Con = новый OleDbConnection(Con);
obj_Con.Открыть();

string sheet_Name = "ABCD#EFGH";
string query = строка.Формат("select * from [{0}$]", sheet_Name);
Объект oledbcommand obj_CmdSelect = новый объект oledbcommand(запрос, obj_Con);
OleDbDataAdapter obj_Adapter = новый OleDbDataAdapter();
obj_Adapter.Команды selectcommand = obj_CmdSelect;
DataSet obj_Dataset = новый набор данных();
obj_Adapter.Fill(obj_Dataset, "Data"); /// здесь возникает ошибка

karthikv101

Кроме того, ошибка заключается в том, что " ABCD.EFGH - это недопустимое имя. Убедитесь, что он не содержит недопустимых символов или знаков препинания и что он не слишком длинный.

Похоже, OLEDB преобразует символ "#" в символ".".

2 Ответов

Рейтинг:
14

CHill60

Я не совсем понимаю, почему вы используете как interop, так и oleDb.

Поскольку у вас уже есть книга, открытая через interop, то продолжайте получать доступ к листам, используя это - у вас есть возможность ссылаться на них через их индекс [1], [2] и т. д. (т. е. игнорируя имя - имейте отдельный список имен листов, если они вам абсолютно нужны), или вы можете использовать foreach

Например: (непроверенный)

Microsoft.Office.Interop.Excel.Application excelFileObject = new Microsoft.Office.Interop.Excel.Application(); 
 
Microsoft.Office.Interop.Excel.Workbook workBookObject = null;
workBookObject = excelFileObject.Workbooks.Open(File, 0, true, 5, "", "", false, 
 
Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
Microsoft.Office.Interop.Excel.Sheets sheets = workBookObject.Worksheets;
 
DataSet oDS = new DataSet();

foreach (Microsoft.Office.Interop.Excel.Worksheet sheet in sheets)
{
    DataTable obj_Dataset = FillDataSetFromWorkSheet(sheet);
    oDS.Tables.Add(obj_Dataset);
}
с
private DataTable FillDataSetFromWorkSheet(Microsoft.Office.Interop.Excel.Worksheet sheet)
{
    var oDT = new DataTable();
    for (int colIndex = 0; colIndex < MaxCols; colIndex++)
        oDT.Columns.Add(string.Format("Column{0}", colIndex));

    for (int rowIndex = 1; rowIndex <= MaxRows; rowIndex++)
    {
        var row = oDT.NewRow();

        //Note Excel arrays are 1-based not 0-based
        for (int colIndex = 0; colIndex < MaxCols; colIndex++)
            row[colIndex] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)sheet.Cells[rowIndex, colIndex + 1]).Value2);

        oDT.Rows.Add(row);
    }
    return oDT;
}
Я только что это сделал MaxCols и MaxRows как константы, но вы можете получить их по мере необходимости.


karthikv101

@Chill60, отлично.. он отлично работает с помощью взаимодействия. Но есть ли какой-нибудь способ читать через Oledb?

CHill60

Я продолжал экспериментировать после того, как опубликовал это, пытаясь использовать DataReader вместо DataAdaptor, но получил ту же проблему. Я даже поиграл с получением схемы рабочей книги и проработал ее, но не преуспел.
Я думал, что есть способ перебирать каждый лист, но я думаю, что это, должно быть, просто использовало interop. Я тоже кое-что искал, но не смог найти никакой альтернативы (но это не значит, что ее нет!)

Member 13577557

excel в gridview

я попробовал этот код


        //Coneection String by default empty  
        string ConStr = "";
        //Extantion of the file upload control saving into ext because   
        //there are two types of extation .xls and .xlsx of Excel   
        string ext = Path.GetExtension(FileUpload1.FileName).ToLower();
        //getting the path of the file   
        string path = Server.MapPath("~/Upload/" + FileUpload1.FileName);
        //saving the file inside the MyFolder of the server  
        FileUpload1.SaveAs(path);
        Label1 = FileUpload1.FileName + "\'s Data showing into the GridView";
        //checking that extantion is .xls or .xlsx  
        if (ext.Trim() == ".xls")
        {
            //connection string for that file which extantion is .xls  
            ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
        }
        else if (ext.Trim() == ".xlsx")
        {
            //connection string for that file which extantion is .xlsx  
            ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
        }
        //making query  
        string sheet_Name = "ABCD#EFGH";
        string query = String.Format("select * from [{0}$]", sheet_Name);
        //Providing connection  
        OleDbConnection conn = new OleDbConnection(ConStr);
        //checking that connection state is closed or not if closed the   
        //open the connection  
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }
        //create command object  
        OleDbCommand cmd = new OleDbCommand(query, conn);
        // create a data adapter and get the data into dataadapter  
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        DataSet ds = new DataSet();
        //fill the Excel data to data set  
        da.Fill(ds);
        //set data source of the grid view  
        viewuser_details.DataSource = ds.Tables[0];
        //binding the gridview  
        viewuser_details.DataBind();
        //close the connection  
        conn.Close();  
  



но это не работает ошибка есть

'ABCD.EFGH$' is not a valid name.  Make sure that it does not include invalid characters or punctuation and that it is not too long.


что я делаю???????

CHill60

Уберите полный стоп из названия листа - пунктуация не допускается

Рейтинг:
1

joshi akhilesh

Сначала убедитесь, что имя не содержит специального символа, такого как#, & etc bcz it conflict, когда оно содержит какой-то конкретный символ, я не уверен в списке символов.

если это возможно дайте ограничение при проверке имени или расширения файла на первом шаге например получение данных с листа нет like

private static Excel.Workbook MyBook = null;
private static Excel.Application MyApp = null;
private static Excel.Worksheet MySheet = null;



MyApp = new Excel.Application();
MyBook = MyApp.Workbooks.Open(DB_PATH);
MySheet = (Excel.Worksheet)MyBook.Sheets[1];


karthikv101

@Joshi, но обязательно читать данные и с этого листа.

joshi akhilesh

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

karthikv101

Без специального характера он работает нормально. Но файл идет с символом "#" с другого конца.