Чтение файлов 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.

Ответ 8

Я думаю, что для этой темы я должен упомянуть EPPlus. Его проект с открытым исходным кодом доступен в codeplex.

Я использовал это в нескольких проектах и ​​никогда не имел проблем с ним.