В 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);
}
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;
}
}
}
Мы всегда используем Excel Interop для открытия электронной таблицы и синтаксического анализа непосредственно (например, подобный тому, как Вы просканировали бы через ячейки в VBA), или мы создаем заблокированный, вниз обрабатывает по шаблону, которые осуществляют определенные столбцы, чтобы быть заполненными в том, прежде чем пользователь сможет сохранить данные.
Я рекомендую Вам попробовать Инструменты Visual Studio для Office и Excel Interop! Это использует, очень легко.
Вы могли бы попытаться использовать Excel и COM. Тем путем Вы будете добираться, Ваша информация прямо формируют рот лошади, как это было.
От D. Anand на форумах MSDN:
Создайте ссылку в своем проекте к Excel Objects Library. Библиотека объектов Excel может быть добавлена на вкладке COM добавления ссылочного диалогового окна.
Вот некоторая информация об объектной модели Excel в http://msdn.microsoft.com/en-us/library/aa168292 C# (офис 11) .aspx
Если бы мог потребовать, чтобы формат листа Excel имел заголовки столбцов, то у Вас всегда было бы 13 столбцов. Необходимо было бы просто пропустить строку заголовка при обработке.
Это также исправило бы ситуации, куда пользователь помещает столбцы в порядок, который Вы не ожидаете. (обнаружьте индексы столбца в строке заголовка и читайте соответственно),
Я вижу, что другие рекомендуют Excel interop, но здорово это - медленная опция по сравнению с OleDb путь. Плюс он требует, чтобы Excel или OWC были установлены на сервере (лицензирование).
Вы, вероятно, можете посмотреть ExcelMapper. Это инструмент для чтения файлов Excel как строго типизированных объектов. Он скрывает все детали чтения Excel из вашего кода. Он позаботится, если в вашем Excel отсутствует столбец или данные в столбце отсутствуют. Вы читаете интересующие вас данные. Вы можете получить код / исполняемый файл для ExcelMapper по адресу http://code.google.com/p/excelmapper/ .