Чтение Excel с использованием C # и OleDB - Как определить используемый диапазон? - PullRequest
2 голосов
/ 10 февраля 2011

Я читаю файл Excel, используя старые добрые OleDBConnections и OleDBCommands. Как определить используемый диапазон листа Excel?

Например, если бы я использовал InterOp, я всегда могу сделать это -

Excel.Application xlApp = new Excel.Application();
Excel.Workbook xWb;
Excel.Worksheet xWs;
Excel.Range range;

xWb = xlApp.Workbooks.Open(@"D:\Technical\C#\WorkingFolder\HelloWorld.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xWs = (Excel.Worksheet)xWb.Worksheets.get_Item(1);
range = xWs.UsedRange;

Теперь я получаю список всех используемых столбцов. С OleDB как мне это получить. Теперь, даже если бы я записал список столбцов, как я узнаю, что строки заканчиваются здесь.

По сути, мое требование таково.

Я собираюсь получить файл Excel (2003). Данные всегда будут включать заголовки (то есть имя столбца). Это не значит, что данные всегда будут заполняться с A1: J200

Это также может быть от A5: J204 тоже.

Итак, при использовании OleDBCommand

string sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Technical\C#\WorkingFolder\HelloWorld.xls;Extended Properties=""Excel 8.0;HDR=YES;""";
string sCommandString = "SELECT Employee_Id, First_Name FROM [Sheet1$A1:J200]";
OleDbConnection xlConnection = new OleDbConnection(sConnectionString);
xlConnection.Open();
OleDbCommand xlCommand = new OleDbCommand(sCommandString, xlConnection);
OleDbDataAdapter tempDataAdapter = new OleDbDataAdapter();
tempDataAdapter.SelectCommand = xlCommand;
DataTable tempDataTable = new DataTable("Whatever_I_Want");
tempDataAdapter.Fill(tempDataTable);

Теперь линия

sCommandString имеет жестко заданное значение A1: J200, что если я получу Excel с диапазоном данных A5: 204, что мне делать?

Любая помощь будет отличной!

1 Ответ

2 голосов
/ 10 февраля 2011

Не проверено, но я думаю, что вы могли бы сделать это, сначала создав DataAdapter с оператором SELECT * FROM [Sheet], а затем использовать его при вызове FillSchema, после чего вы должны иметь возможность вызвать .Columns.Count на DataTable, который вы только что заполнили.

...