У меня есть приложение .Net-Windows на С#. Мне нужно открыть Excel и обработать его. Как это сделать без использования библиотек Microsoft.Office.Interop.Excel?
Как прочитать файл excel на С# без использования библиотек Microsoft.Office.Interop.Excel
Ответ 1
var fileName = @"C:\ExcelFile.xlsx";
var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""; ;
using (var conn = new OleDbConnection(connectionString))
{
conn.Open();
var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] ";
var adapter = new OleDbDataAdapter(cmd);
var ds = new DataSet();
adapter.Fill(ds);
}
}
Ответ 2
Я настоятельно рекомендую CSharpJExcel для чтения файлов Excel 97-2003 (xls) и ExcelPackage для чтения файлов Excel 2007/2010 (формат Office Open XML, xlsx).
Они оба работают отлично. Они абсолютно не зависят ни от чего.
Пример с использованием CSharpJExcel:
Workbook workbook = Workbook.getWorkbook(new System.IO.FileInfo(fileName));
var sheet = workbook.getSheet(0);
...
var content = sheet.getCell(colIndex, rowIndex).getContents();
...
workbook.close();
Пример с использованием ExcelPackage:
using (ExcelPackage xlPackage = new ExcelPackage(existingFile))
{
// get the first worksheet in the workbook
ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[1];
int iCol = 2; // the column to read
// output the data in column 2
for (int iRow = 1; iRow < 6; iRow++)
Console.WriteLine("Cell({0},{1}).Value={2}", iRow, iCol,
worksheet.Cell(iRow, iCol).Value);
// output the formula in row 6
Console.WriteLine("Cell({0},{1}).Formula={2}", 6, iCol,
worksheet.Cell(6, iCol).Formula);
} // the using statement calls Dispose() which closes the package.
РЕДАКТИРОВАТЬ:
Есть другой проект, ExcelDataReader, который, похоже, может обрабатывать оба формата. Это также легко, как и другие, которые я упомянул.
Есть и другие библиотеки:
-
NPOI: Порт библиотеки Apache POI для.NET:
Очень мощный, бесплатный и с открытым исходным кодом. В дополнение к Excel (97-2010) он также поддерживает файлы Word и PowerPoint. -
ExcelLibrary:
Он поддерживает только файлы Excel 97-2003 (xls). -
EPPlus:
Расширение для ExcelPackage. Проще в использовании (наверное).
Ответ 3
Я бы настоятельно рекомендовал использовать OleDB, особенно если он будет запущен на сервере. Вероятнее всего, это будет стоить вам больше в долгосрочной перспективе - например, у нас было задание SSIS, вызывающее хранимую процедуру с OleDB, которое читает файл excel в sptroc и продолжает сбой SQL-блока! Я извлек материал OleDB из sproc, и он остановил сбой сервера.
Лучший метод, который я нашел, - это сделать это с помощью Office 2003 и файлов XML - в отношении Соображения для серверной автоматизации Office. Примечание: Office 2003 является минимальным требованием для этого:
Ref для чтения из Excel: http://www.roelvanlisdonk.nl/?p=924 (пожалуйста, сделайте больше исследований, чтобы найти другие примеры)
Ссылка для написания электронной таблицы Excel: http://weblogs.asp.net/jgaylord/archive/2008/08/11/use-linq-to-xml-to-generate-excel-documents.aspx
public void ReadExcelCellTest()
{
XDocument document = XDocument.Load(@"C:\BDATA\Cars.xml");
XNamespace workbookNameSpace = @"urn:schemas-microsoft-com:office:spreadsheet";
// Get worksheet
var query = from w in document.Elements(workbookNameSpace + "Workbook").Elements(workbookNameSpace + "Worksheet")
where w.Attribute(workbookNameSpace + "Name").Value.Equals("Settings")
select w;
List<XElement> foundWoksheets = query.ToList<XElement>();
if (foundWoksheets.Count() <= 0) { throw new ApplicationException("Worksheet Settings could not be found"); }
XElement worksheet = query.ToList<XElement>()[0];
// Get the row for "Seat"
query = from d in worksheet.Elements(workbookNameSpace + "Table").Elements(workbookNameSpace + "Row").Elements(workbookNameSpace + "Cell").Elements(workbookNameSpace + "Data")
where d.Value.Equals("Seat")
select d;
List<XElement> foundData = query.ToList<XElement>();
if (foundData.Count() <= 0) { throw new ApplicationException("Row 'Seat' could not be found"); }
XElement row = query.ToList<XElement>()[0].Parent.Parent;
// Get value cell of Etl_SPIImportLocation_ImportPath setting
XElement cell = row.Elements().ToList<XElement>()[1];
// Get the value "Leon"
string cellValue = cell.Elements(workbookNameSpace + "Data").ToList<XElement>()[0].Value;
Console.WriteLine(cellValue);
}
Ответ 4
Недавно я нашел эту библиотеку, которая преобразует файл рабочей книги Excel в DataSet: Excel Data Reader
Ответ 5
Если вам нужно открыть файлы XLS, а не файлы XLSX, http://npoi.codeplex.com/ - отличный выбор. Мы использовали его для хороших результатов в наших проектах.
Ответ 6
Посмотрите на GSpread.NET. Это также проект OpenSource, и он не требует установки Office. Вы можете работать с Google Spreadsheets, используя API из Microsoft Excel. Если вы хотите повторно использовать старый код для доступа к Google Spreadsheets, GSpread.NET - лучший способ. Вам нужно добавить несколько строк:
Set objExcel = CreateObject("GSpreadCOM.Application")
// Name - User name, any you like
// ClientIdAndSecret - `client_id|client_secret` format
// ScriptId - Google Apps script ID
app.MailLogon(Name, ClientIdAndSecret, ScriptId);
Дальнейший код не изменяется.
Ответ 7
Вы можете попробовать OleDB для чтения данных из файла excel. Пожалуйста, попробуйте как следует..
DataSet ds_Data = new DataSet();
OleDbConnection oleCon = new OleDbConnection();
string strExcelFile = @"C:\Test.xlsx";
oleCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelFile + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\"";;
string SpreadSheetName = "";
OleDbDataAdapter Adapter = new OleDbDataAdapter();
OleDbConnection conn = new OleDbConnection(sConnectionString);
string strQuery;
conn.Open();
int workSheetNumber = 0;
DataTable ExcelSheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
SpreadSheetName = ExcelSheets.Rows[workSheetNumber]["TABLE_NAME"].ToString();
strQuery = "select * from [" + SpreadSheetName + "] ";
OleDbCommand cmd = new OleDbCommand(strQuery, conn);
Adapter.SelectCommand = cmd;
DataSet dsExcel = new DataSet();
Adapter.Fill(dsExcel);
conn.Close();
Ответ 8
Я использовал Excel.dll библиотеку, которая:
- с открытым исходным кодом
- легкий
- быстро
- совместим с xls и xlsx
Документация доступна здесь: https://exceldatareader.codeplex.com/
Сильно рекомендуемый.
Ответ 9
Я просто искал решение и сталкивался Spreadsheetlight
который выглядит очень многообещающим. Его открытый источник и доступен как пакет nuget.
Ответ 10
Если вы не хотите использовать interop, вы можете попробовать OfficeWriter. В зависимости от того, сколько обработки вам действительно нужно делать в файле, это может быть слишком велико. Вы можете запросить бесплатную пробную версию. Там документально зарегистрированный api доступен на сайте документации.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я - один из инженеров, которые создали последнюю версию.
Ответ 11
Вы также можете делать то, что я делаю, и коммерческий контроль, подобный этому: http://www.syncfusion.com/products/reporting-edition/xlsio
Я боролся много лет, прежде чем закончил коммерческое решение. Сначала я попробовал подход OLEDB, который очень прост в использовании в моей среде разработки, но может стать рыцарем для развертывания. Затем я попробовал решения с открытым исходным кодом, но большинство из них устарели и имеют плохую поддержку.
Элементы управления xlsio из syncfusion - это те, которые я использую, и они довольны, но другие существуют. Если вы можете это удовлетворить, не стесняйтесь, это лучшее решение. Зачем? Поскольку он не имеет зависимости от системы и сразу поддерживает всю версию офиса. Среди других преимуществ, как, это очень быстро.
И нет, я не работаю для синфазии;)
Ответ 12
У меня есть Libreoffice calc в моей системе, у меня нет офиса MS. Но я хочу экспортировать данные, чтобы превзойти. Как экспортировать? заранее спасибо