Как импортировать большой файл Excel в Datatable?
У меня есть файл Excel с 500 столбцами. Я использую OLEDB, чтобы импортировать его в DataTable. Но DataTable содержит только первые 255 столбцов. Я не могу понять, почему остальные столбцы не импортированы.
Мой код
public DataTable ToDataTable()
{
DataSet dsEmpMaster = new DataSet();
DataTable dtEmpMaster = null;
string strConnectionString;
string strSql;
string FileNameWithPath = String.Format("{0}\\{1}", System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName), _FileName);
try
{
dtEmpMaster = new DataTable();
strConnectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", FileNameWithPath);
strSql = String.Format("SELECT * FROM [{0}$]", _SheetName);
OleDbDataAdapter adpMasterData = new OleDbDataAdapter(strSql, strConnectionString);
adpMasterData.Fill(dsEmpMaster);
dtEmpMaster = dsEmpMaster.Tables[0];
adpMasterData.Dispose();
}
catch (Exception ex)
{
_ExcelError = ex.Message;
}
1 ответ
OLEDB не может поддерживать>256 столбцов, посмотрите это в качестве обходного пути.
var file_path = @"D:\doc\excel.xlsx";
Microsoft.Office.Interop.Excel.Application xlApp =
new Microsoft.Office.Interop.Excel.ApplicationClass();
// Disabling messageboxes to prevent losing control on Excel app
xlApp.DisplayAlerts = false;
Microsoft.Office.Interop.Excel.Workbook xlWorkBook =
xlApp.Workbooks.Open(file_path, 0, false, 5, "", "", true,
Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkBook.DoNotPromptForConvert = true;
for (var k = 1; k <= xlWorkBook.Worksheets.Count; k++)
{
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet =
(Microsoft.Office.Interop.Excel.Worksheet) this.xlWorkBook.Worksheets.get_Item(k);
int cCnt = xlWorkSheet.Cells.Count;
// processing all cells used, but can call named ranges
Microsoft.Office.Interop.Excel.Range range = xlWorkSheet.UsedRange;
for (var rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
{
for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++)
{
Microsoft.Office.Interop.Excel.Range rng =
(Microsoft.Office.Interop.Excel.Range) range.Cells[rCnt, cCnt];
// do something with range
}
}
}
Но, как уже упоминалось в этой теме, Interop может быть слишком медленным для ваших нужд, я лично не использовал его, но, возможно, стоит взглянуть на что-то вроде ExcelDataReader.
edit: исправлял форматирование кода по ссылке