#c# #excel
Вопрос:
Ранее я использовал ExcelPackage
для считывания данных из файла .xlsx. Это работало нормально, но потом я понял, что ExcelPackage
это не работает со старым форматом .xls. Поэтому я перешел на использование OleDbConnection
вместо ExcelPackage
этого:
файл var = HttpContext.Current.Запрос.Файлы[0]; DataTable sheetData = новые данные(); строка connStr = "Поставщик=Microsoft.Jet.OLEDB.4.0;Источник данных=" файл.Имя файла "; Jet OLEDB:Тип двигателя=5;Расширенные свойства="Excel 8.0;""; использование (соединение OleDbConnection conn = новое соединение OleDbConnection(connStr)) { конн.Открыть(); DataTable dtSchema = продолжение.GetOleDbSchemaTable(OleDbSchemaGuid.Таблицы, новый объект[] { null, null, null, "ТАБЛИЦА" }); строковое имя листа = dtSchema.Строки[0].Поле("ИМЯ ТАБЛИЦЫ"); OleDbDataAdapter sheetAdapter = новый OleDbDataAdapter("выбрать * из [" Имя листа "]", продолжение); Адаптерный лист.Заполнить(данные листа); }
В основном просто пытаюсь прочитать первую электронную таблицу там. Но я получаю эту ошибку в исключении:
Cannot update. Database or object is read-only.
Что я делаю не так? Там скрыта какая-то операция обновления?
Комментарии:
1. Попробуйте закрыть файл excel, который вы читаете на C#
2. У вас открыт Excel, и случайно не этот конкретный файл?
3. У меня нет файла, открытого в Excel. Кристиан, что значит закрыть файл? Ведешь себя как сумасшедший?
4. Где находится файл excel? Это местное? Я получаю ошибку с опубликованным кодом, однако, должно быть, происходит что-то еще. Ошибка
Cannot update
кажется странной, если вы просто пытаетесь ПРОЧИТАТЬ файл.
Ответ №1:
Попробуйте это:
OleDbConnection connection;
OleDbCommand command;
OleDbDataReader dr;
string commandText = "SELECT * FROM [Sheet1$]";
string oledbConnectString = "Provider=Microsoft.ACE.OLEDB.12.0;"
@"Data Source=" filename ";"
"Extended Properties="Excel 12.0;HDR=YES";";
connection = new OleDbConnection(oledbConnectString);
command = new OleDbCommand(commandText, connection);
try
{
connection.Open();
dr = command.ExecuteReader();
while (dr.Read())
{
count ;
for (int i = 1; i < dr.VisibleFieldCount; i )
{
Console.Writeln("" dr[i].ToString());
}
}
connection.Close();
}
catch (Exception ex)
{
MessageBox.Show("" ex.Message);
connection.Close();
}
Комментарии:
1. Когда я пытаюсь это сделать, я получаю это:
The Microsoft Office Access database engine cannot open or write to the file ''. It is already opened exclusively by another user, or you need permission to view and write its data.
2. @Ryan итак, проблема в вашем файле. Пожалуйста, проверьте, используется ли он или у вас есть разрешение на его редактирование или нет 😀
Ответ №2:
Ниже приведен пример метода, который возвращает a DataSet
из указанного пути к файлу excel. Возвращаемый DataSet
файл должен содержать каждый лист Excel в книге как DataTable
в DataSet
. Похоже, это работает правильно, надеюсь, это может помочь.
private DataSet GetExcelDataSet(string path) {
string sheetName;
string ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" path
"; Jet OLEDB:Engine Type = 5; Extended Properties ="Excel 8.0;"";
DataSet ds = new DataSet();
using (OleDbConnection con = new OleDbConnection(ConnectionString)) {
using (OleDbCommand cmd = new OleDbCommand()) {
using (OleDbDataAdapter oda = new OleDbDataAdapter()) {
cmd.Connection = con;
con.Open();
DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
for (int i = 0; i < dtExcelSchema.Rows.Count; i ) {
sheetName = dtExcelSchema.Rows[i]["TABLE_NAME"].ToString();
DataTable dt = new DataTable(sheetName);
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM [" sheetName "]";
oda.SelectCommand = cmd;
oda.Fill(dt);
dt.TableName = sheetName;
ds.Tables.Add(dt);
}
}
}
}
return ds;
}