Как я читаю файл Excel в c#, не пропуская столбцов?

В Access вы создаете новый Movie, вместо этого вам нужно взять Movie уже созданного.

public class Access
{
    public void ShowMovieOutput(Movie mov)
    {
        Console.WriteLine(mov.Shows.ElementAt(0).ShowID);
    }
}

public static void Main(string[] args)
{
    // create new object of Show type
    Show s = new Show(153, 258, 391);

    Movie mv = new Movie();

    // add object to List
    mv.Shows.Add(s);

    Access.ShowMovieOutput(mv);

    // The output gives me 153, which is correct
    Console.WriteLine(mv.Shows.ElementAt(0).ShowID);
}
5
задан Austin 20 February 2009 в 19:56
поделиться

6 ответов

SpreadsheetGear для.NET дает Вам API для работы с xls и xlsx рабочими книгами от.NET. Легче использовать и быстрее, чем OleDB или модель COM-объекта Excel. Вы видите живые образцы или пробуете его за себя с бесплатной демонстрационной версией.

Отказ от ответственности: Я владею SpreadsheetGear LLC

Править:

StingyJack прокомментировал "Быстрее, чем OleDb? Лучше создайте резервную копию того требования".

Это - разумный запрос. Я вижу требования все время, которые я знаю для факта, чтобы быть ложью, таким образом, я не могу обвинить никого в том, что он был скептически настроен.

Ниже код, чтобы создать 50 000 строк рабочей книгой на 10 столбцов с SpreadsheetGear, сохранить его на диск и затем суммировать использование чисел OleDb и SpreadsheetGear. SpreadsheetGear читает 500K ячейки за 0,31 секунды по сравнению с 0,63 секундами с OleDB - чуть более чем вдвое более быстрый. SpreadsheetGear на самом деле создает и читает рабочую книгу за меньшее время, чем он берет для чтения рабочей книги с OleDB.

Код ниже. Можно попробовать его сами бесплатной демонстрационной версией SpreadsheetGear.

using System;
using System.Data; 
using System.Data.OleDb; 
using SpreadsheetGear;
using SpreadsheetGear.Advanced.Cells;
using System.Diagnostics;

namespace SpreadsheetGearAndOleDBBenchmark
{
    class Program
    {
        static void Main(string[] args)
        {
            // Warm up (get the code JITed).
            BM(10, 10);

            // Do it for real.
            BM(50000, 10);
        }

        static void BM(int rows, int cols)
        {
            // Compare the performance of OleDB to SpreadsheetGear for reading
            // workbooks. We sum numbers just to have something to do.
            //
            // Run on Windows Vista 32 bit, Visual Studio 2008, Release Build,
            // Run Without Debugger:
            //  Create time: 0.25 seconds
            //  OleDb Time: 0.63 seconds
            //  SpreadsheetGear Time: 0.31 seconds
            //
            // SpreadsheetGear is more than twice as fast at reading. Furthermore,
            // SpreadsheetGear can create the file and read it faster than OleDB
            // can just read it.
            string filename = @"C:\tmp\SpreadsheetGearOleDbBenchmark.xls";
            Console.WriteLine("\nCreating {0} rows x {1} columns", rows, cols);
            Stopwatch timer = Stopwatch.StartNew();
            double createSum = CreateWorkbook(filename, rows, cols);
            double createTime = timer.Elapsed.TotalSeconds;
            Console.WriteLine("Create sum of {0} took {1} seconds.", createSum, createTime);
            timer = Stopwatch.StartNew();
            double oleDbSum = ReadWithOleDB(filename);
            double oleDbTime = timer.Elapsed.TotalSeconds;
            Console.WriteLine("OleDb sum of {0} took {1} seconds.", oleDbSum, oleDbTime);
            timer = Stopwatch.StartNew();
            double spreadsheetGearSum = ReadWithSpreadsheetGear(filename);
            double spreadsheetGearTime = timer.Elapsed.TotalSeconds;
            Console.WriteLine("SpreadsheetGear sum of {0} took {1} seconds.", spreadsheetGearSum, spreadsheetGearTime);
        }

        static double CreateWorkbook(string filename, int rows, int cols)
        {
            IWorkbook workbook = Factory.GetWorkbook();
            IWorksheet worksheet = workbook.Worksheets[0];
            IValues values = (IValues)worksheet;
            double sum = 0.0;
            Random rand = new Random();
            // Put labels in the first row.
            foreach (IRange cell in worksheet.Cells[0, 0, 0, cols - 1])
                cell.Value = "Cell-" + cell.Address;
            // Using IRange and foreach be less code, 
            // but we'll do it the fast way.
            for (int row = 1; row <= rows; row++)
            {
                for (int col = 0; col < cols; col++)
                {
                    double number = rand.NextDouble();
                    sum += number;
                    values.SetNumber(row, col, number);
                }
            }
            workbook.SaveAs(filename, FileFormat.Excel8);
            return sum;
        }

        static double ReadWithSpreadsheetGear(string filename)
        {
            IWorkbook workbook = Factory.GetWorkbook(filename);
            IWorksheet worksheet = workbook.Worksheets[0];
            IValues values = (IValues)worksheet;
            IRange usedRahge = worksheet.UsedRange;
            int rowCount = usedRahge.RowCount;
            int colCount = usedRahge.ColumnCount;
            double sum = 0.0;
            // We could use foreach (IRange cell in usedRange) for cleaner 
            // code, but this is faster.
            for (int row = 1; row <= rowCount; row++)
            {
                for (int col = 0; col < colCount; col++)
                {
                    IValue value = values[row, col];
                    if (value != null && value.Type == SpreadsheetGear.Advanced.Cells.ValueType.Number)
                        sum += value.Number;
                }
            }
            return sum;
        }

        static double ReadWithOleDB(string filename)
        {
            String connectionString =  
                "Provider=Microsoft.Jet.OLEDB.4.0;" + 
                "Data Source=" + filename + ";" + 
                "Extended Properties=Excel 8.0;"; 
            OleDbConnection connection = new OleDbConnection(connectionString); 
            connection.Open(); 
            OleDbCommand selectCommand =new OleDbCommand("SELECT * FROM [Sheet1$]", connection); 
            OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); 
            dataAdapter.SelectCommand = selectCommand; 
            DataSet dataSet = new DataSet(); 
            dataAdapter.Fill(dataSet); 
            connection.Close(); 
            double sum = 0.0;
            // We'll make some assumptions for brevity of the code.
            DataTable dataTable = dataSet.Tables[0];
            int cols = dataTable.Columns.Count;
            foreach (DataRow row in dataTable.Rows)
            {
                for (int i = 0; i < cols; i++)
                {
                    object val = row[i];
                    if (val is double)
                        sum += (double)val;
                }
            }
            return sum;
        }
    }
}
3
ответ дан 14 December 2019 в 19:27
поделиться

Мы всегда используем Excel Interop для открытия электронной таблицы и синтаксического анализа непосредственно (например, подобный тому, как Вы просканировали бы через ячейки в VBA), или мы создаем заблокированный, вниз обрабатывает по шаблону, которые осуществляют определенные столбцы, чтобы быть заполненными в том, прежде чем пользователь сможет сохранить данные.

1
ответ дан 14 December 2019 в 19:27
поделиться

Я рекомендую Вам попробовать Инструменты Visual Studio для Office и Excel Interop! Это использует, очень легко.

0
ответ дан 14 December 2019 в 19:27
поделиться

Вы могли бы попытаться использовать Excel и COM. Тем путем Вы будете добираться, Ваша информация прямо формируют рот лошади, как это было.

От D. Anand на форумах MSDN:

Создайте ссылку в своем проекте к Excel Objects Library. Библиотека объектов Excel может быть добавлена на вкладке COM добавления ссылочного диалогового окна.

Вот некоторая информация об объектной модели Excel в http://msdn.microsoft.com/en-us/library/aa168292 C# (офис 11) .aspx

0
ответ дан 14 December 2019 в 19:27
поделиться

Если бы мог потребовать, чтобы формат листа Excel имел заголовки столбцов, то у Вас всегда было бы 13 столбцов. Необходимо было бы просто пропустить строку заголовка при обработке.

Это также исправило бы ситуации, куда пользователь помещает столбцы в порядок, который Вы не ожидаете. (обнаружьте индексы столбца в строке заголовка и читайте соответственно),

Я вижу, что другие рекомендуют Excel interop, но здорово это - медленная опция по сравнению с OleDb путь. Плюс он требует, чтобы Excel или OWC были установлены на сервере (лицензирование).

0
ответ дан 14 December 2019 в 19:27
поделиться

Вы, вероятно, можете посмотреть ExcelMapper. Это инструмент для чтения файлов Excel как строго типизированных объектов. Он скрывает все детали чтения Excel из вашего кода. Он позаботится, если в вашем Excel отсутствует столбец или данные в столбце отсутствуют. Вы читаете интересующие вас данные. Вы можете получить код / ​​исполняемый файл для ExcelMapper по адресу http://code.google.com/p/excelmapper/ .

1
ответ дан 14 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: