Чтение файлов Excel в виде серверного процесса
Я пытаюсь найти подходящий способ прочитать содержимое файла Excel в операционной системе NT. У меня есть многочисленные проблемы с использованием Excel API, а затем наткнулся на официальный Microsoft on Office Automation, в котором говорится, что Excel API не подходит для автоматизации Excel, Виды, которые я видел, были похожи на те, которые описаны в этой статье.
Есть ли другой способ, которым я могу читать файл Excel (xls, xlsx, xlsm) на сервере (без пользовательского интерфейса) таким образом, чтобы он не подвергался тем же типам проблем с потоком/безопасностью/лицензией, Excel API?
Ответы
Ответ 1
Было несколько библиотек, которые были выделены разными пользователями, которые позволяли бы выполнять требуемую функциональность. Я перечислил их здесь, и некоторые из них были оценены, поэтому, где это необходимо, я попытался записать интересные комментарии для их сравнения. Детали, которые я включил, полностью основаны на мнениях, однако любая из этих библиотек, вероятно, достигнет требуемой цели.
SpreadsheetGear.Net
(Не оценивалось из-за высокой стоимости покупки)
Aspose.Cells
(Оценено коллегией. Появилось достаточно просто для реализации, производительность сопоставима с Excel Interop).
GemBox
(Не оценивалось)
Службы Excel
(Кажется, он будет включен только в SharePoint 2007)
Excel Mapper
(Не оценил, потому что для этого требуются строго типизированные объекты для импорта, в которые не соответствовало моему требованию).
SmartXls
(Не оценил, потому что для этого требуются строго типизированные объекты для импорта, в которые не соответствовало моему требованию).
ActiveXls
(Достаточно простой в использовании, отсутствие свойств вызывает вопросы, предпочтение отдается методам тривиальных действий. Несмотря на то, что заявка на 1M записей была выполнена более дешевым FlexCel, решили, что руководство по справочной системе /API практически бесполезно.)
Koogra
(Не оценивалось из-за отсутствия документов/информации)
FileHelpers
(Не оценивалось)
Flexcel
(найденное решение с наименьшими затратами, хорошая производительность и простота реализации с непосредственной близостью к структуре Excel Interop. Также получил быстрый ответ на технический вопрос из поддержки. Возможно, мой выбор группы.)
SyncFusion BackOffice
(Средняя стоимость и разумная структура). К сожалению, при запуске модульных тестов было больше проблем с реализацией и непоследовательными результатами. Также получен ряд ошибок "Попытка прочитать защищенную память", что не поощряло меня к чисто управляемой библиотеке.)
Ответ 2
Я использовал ADO.NET для получения данных из xls раньше. Я не уверен, что все типы документов Excel будут поддерживаться, но проверьте Чтение и запись таблиц Excel с использованием ADO.NET С# DbProviderFactory
Вот какой код из вопроса SO.
Я смог читать и писать, чтобы не обойтись без установки Office или сторонних инструментов.
Ответ 3
Чтобы читать файлы Excel с помощью С# без установки Excel, вы можете использовать Apache POI.
Это java-библиотека для чтения и записи форматов MS Office. Поскольку это java и вы используете С#, вам понадобится IKVM, а классы java из Проект POI.
Однако самый простой способ - просто загрузить Jon Iles excelent проект MPXJ, и у вас есть все. Просто установите ссылку на IKVM.OpendJDK.ClassLibrary.dll
, IKVM.Runtime.dll
, poi-3.2-FINAL-20081019.dll
Я взломал быстрое консольное приложение, чтобы показать вам простой способ чтения листа Excel.xls. Он читает только первый лист и не использует итераторы строк или ячеек, но он хорошо выполняет работу.
Примечание. Вам нужно посмотреть org.apache.poi.ss
, чтобы вы могли читать файлы .xlsx
etc.
//C# code for using the Apache POI libraries
using System;
using System.Collections.Generic;
using System.Text;
// poi for xls
using org.apache.poi;
using org.apache.poi.poifs;
using org.apache.poi.poifs.filesystem;
using org.apache.poi.hssf;
using org.apache.poi.hssf.usermodel;
using org.apache.poi.ss;
namespace ConsoleApplication1
{
class Test
{
static void Main(string[] args)
{
if (args.Length != 1)
{
Console.Out.WriteLine("Usage: XLSReadTest <xls file>");
}
else
{
XLSRead x = new XLSRead();
x.Process(args[0]);
//x.Process("c:\\temp\\testfile.xls");
}
}
}
class XLSRead
{
public void Process(string inputFile)
{
int r = 0;
Console.Out.WriteLine("Reading input file started.");
DateTime start = DateTime.Now;
java.io.InputStream inputStream = new java.io.FileInputStream(inputFile);
POIFSFileSystem fs = new POIFSFileSystem(inputStream);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sh = wb.getSheetAt(0);
r = sh.getFirstRowNum();
while (r <= sh.getLastRowNum())
{
HSSFRow row = sh.getRow(r);
int c = row.getFirstCellNum();
string val = "";
while (c < row.getLastCellNum())
{
HSSFCell cell = row.getCell(c);
switch(cell.getCellType())
{
case HSSFCell.CELL_TYPE_NUMERIC:
val = cell.getNumericCellValue().ToString();
break;
case HSSFCell.CELL_TYPE_STRING:
val = cell.getStringCellValue();
break;
}
Console.Out.WriteLine("Row: " + r + ", Cell: " + c + " = " + val);
c++;
}
r++;
}
long elapsed = DateTime.Now.Ticks - start.Ticks;
String seconds = String.Format("{0:n}", elapsed / 1000000);
Console.Out.WriteLine("\r\n\r\nReading input file completed in " + seconds + "s." + "\r\n");
}
}
}
Ответ 4
Я не уверен, почему объявление на SO не похоже на ваш вопрос.
Существует нечто подобное, называемое Excel Services от Microsoft. Я полагаю, это позволяет использовать Excel в стиле webservice. Я думаю, что SpreadSheetGear - это то, что использовали Microsoft, как объявление, используемое для отображения.:)
Ответ 5
Excel.
Спустя годы, пытаясь остановить людей от использования Excel на сервере, они отказались/приняли рыночную потребность и начали поддерживать это.
2007 имеет некоторое отношение к этому, и Excel 2010 должен иметь еще больше.
Ответ 6
Вот что можно прочитать в файлах .xls и xlsx. Это с открытым исходным кодом. http://code.google.com/p/excelmapper/.
Это в основном ORM, поэтому вам нужно просто иметь дело с объектами вместо OleDB.
Ответ 7
Вы пробовали SmartXLS для .net?
или ActiveXLS?
Ответ 8
Я думаю, что для этой темы я должен упомянуть EPPlus. Его проект с открытым исходным кодом доступен в codeplex.
Я использовал это в нескольких проектах и никогда не имел проблем с ним.