lev*_*evi 8 c# iis oledb asp.net-mvc excel
我在IIS上托管了一个asp.net mvc应用程序.我有一个表单,用户上传包含50k +行的excel文件.我用以下C#代码读取了excel文件.
public DataTable GetExcelDataTable(string fileName)
{
string connectionString = Path.GetExtension(fileName) == "xls" ?
string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data source={0}; Extended Properties=Excel 8.0;", fileName) :
string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties=Excel 12.0;", fileName);
var conn = new OleDbConnection(connectionString);
using (var adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn))
{
var ds = new DataSet();
adapter.Fill(ds);
DataTable data = ds.Tables[0];
conn.Close();
conn.Dispose();
adapter.Dispose();
return data;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是它只读取多达30k行但从不读取整个excel文件.
有趣的是,如果我使用visual studio运行mvc app,我可以阅读(使用相同的代码)所有行,但是,再次,永远不会从IIS(IIS也在我的机器上)托管的网站上.
任何想法,为什么会这样?
在这种方法中,不需要在目标机器上安装excel
NPOI.SS.UserModel.IWorkbook hssfworkbook;
bool InitializeWorkbook(string path)
{
try
{
if (path.ToLower().EndsWith(".xlsx"))
{
FileStream file1 = File.OpenRead(path);
hssfworkbook = new XSSFWorkbook(file1);
}
else
{
//read the template via FileStream, it is suggested to use FileAccess.Read to prevent file lock.
//book1.xls is an Excel-2007-generated file, so some new unknown BIFF records are added.
using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
{
hssfworkbook = new HSSFWorkbook(file);
}
}
return true;
}
catch
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
在下面的 :
public DataTable GetExcelDataTable(NPOI.SS.UserModel.IWorkbook hssfworkbook, int rowCount)
{
NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
DataTable dt = new DataTable();
bool skipReadingHeaderRow = rows.MoveNext();
if (skipReadingHeaderRow)
{
dynamic row;
if (rows.Current is NPOI.HSSF.UserModel.HSSFRow)
row = (NPOI.HSSF.UserModel.HSSFRow)rows.Current;
else
row = (NPOI.XSSF.UserModel.XSSFRow)rows.Current;
for (int i = 0; i < row.LastCellNum; i++)
{
ICell cell = row.GetCell(i);
if (cell != null)
{
dt.Columns.Add(cell.ToString());
}
else
{
dt.Columns.Add(string.Empty);
}
}
}
int cnt = 0;
while (rows.MoveNext() && cnt < rowCount)
{
cnt++;
dynamic row;
if (rows.Current is NPOI.HSSF.UserModel.HSSFRow)
row = (NPOI.HSSF.UserModel.HSSFRow)rows.Current;
else
row = (XSSFRow)rows.Current;
DataRow dr = dt.NewRow();
for (int i = 0; i < row.LastCellNum; i++)
{
ICell cell = row.GetCell(i);
if (cell == null)
{
dr[i - 1] = null;
}
else if (i > 0)
{
dr[i - 1] = cell.ToString();
}
}
dt.Rows.Add(dr);
}
return dt;
}
Run Code Online (Sandbox Code Playgroud)
要么:
public DataTable GetExcelDataTable(NPOI.SS.UserModel.IWorkbook hssfworkbook, int rowCount)
{
NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
DataTable dt = new DataTable();
bool skipReadingHeaderRow = rows.MoveNext();
if (skipReadingHeaderRow)
{
dynamic row;
if (rows.Current is NPOI.HSSF.UserModel.HSSFRow)
row = (NPOI.HSSF.UserModel.HSSFRow)rows.Current;
else
row = (NPOI.XSSF.UserModel.XSSFRow)rows.Current;
for (int i = 0; i < row.LastCellNum; i++)
{
ICell cell = row.GetCell(i);
if (cell != null)
{
dt.Columns.Add(cell.ToString());
}
else
{
dt.Columns.Add(string.Empty);
}
}
}
int cnt = 0;
while (rows.MoveNext() && cnt < rowCount)
{
cnt++;
dynamic row;
if (rows.Current is NPOI.HSSF.UserModel.HSSFRow)
row = (HSSFRow)rows.Current;
else
row = (XSSFRow)rows.Current;
DataRow dr = dt.NewRow();
for (int i = 0; i < row.LastCellNum; i++)
{
ICell cell = row.GetCell(i);
if (cell == null && i > 0)
{
dr[i - 1] = null;
}
else if (i > 0)
{
switch (cell.CellType)
{
case CellType.Blank:
dr[i - 1] = "[null]";
break;
case CellType.Boolean:
dr[i - 1] = cell.BooleanCellValue;
break;
case CellType.Numeric:
dr[i - 1] = cell.ToString();
break;
case CellType.String:
dr[i - 1] = cell.StringCellValue;
break;
case CellType.Error:
dr[i - 1] = cell.ErrorCellValue;
break;
case CellType.Formula:
default:
dr[i - 1] = "=" + cell.CellFormula;
break;
}
}
}
dt.Rows.Add(dr);
}
return dt;
}
Run Code Online (Sandbox Code Playgroud)
要么 :
public DataTable GetExcelDataTable(NPOI.SS.UserModel.IWorkbook hssfworkbook, int segment, int rowCount)
{
NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
DataTable dt = new DataTable();
bool skipReadingHeaderRow = rows.MoveNext();
if (skipReadingHeaderRow)
{
dynamic row;
if (rows.Current is NPOI.HSSF.UserModel.HSSFRow)
row = (NPOI.HSSF.UserModel.HSSFRow)rows.Current;
else
row = (NPOI.XSSF.UserModel.XSSFRow)rows.Current;
for (int i = 0; i < row.LastCellNum; i++)
{
ICell cell = row.GetCell(i);
if (cell != null)
{
dt.Columns.Add(cell.ToString());
}
else
{
dt.Columns.Add(string.Empty);
}
}
}
for (int i = 0; i < (segment - 1)*rowCount; i++)
{
if (!rows.MoveNext()) break;
}
int cnt = 0;
while (rows.MoveNext() && cnt < rowCount)
{
cnt++;
dynamic row;
if (rows.Current is NPOI.HSSF.UserModel.HSSFRow)
row = (NPOI.HSSF.UserModel.HSSFRow) rows.Current;
else
row = (NPOI.XSSF.UserModel.XSSFRow) rows.Current;
DataRow dr = dt.NewRow();
for (int i = 0; i < row.LastCellNum; i++)
{
ICell cell = row.GetCell(i);
if (cell == null)
{
dr[i - 1] = null;
}
else if (i > 0)
{
switch (cell.CellType)
{
case CellType.Blank:
dr[i - 1] = "[null]";
break;
case CellType.Boolean:
dr[i - 1] = cell.BooleanCellValue;
break;
case CellType.Numeric:
dr[i - 1] = cell.ToString();
break;
case CellType.String:
dr[i - 1] = cell.StringCellValue;
break;
case CellType.Error:
dr[i - 1] = cell.ErrorCellValue;
break;
case CellType.Formula:
default:
dr[i - 1] = "=" + cell.CellFormula;
break;
}
}
}
dt.Rows.Add(dr);
}
return dt;
}
Run Code Online (Sandbox Code Playgroud)
你能发布一些你的服务器的规格吗?是否有机会基于 VM 和云?在过去,我成功地使用了:
NPOI : http://npoi.codeplex.com/
要读取 .xls 文件,但如果您可以将文件限制为 .xlsx,我将使用 ClosedXML。我已经在 Azure 中强大的 VM 上使用 ClosedXML 读取了大量 50K+ 的大文件,没有问题。我有一种感觉,您正在撞到服务器上的用户空间墙。如果用户达到这样的百分比,他们就会达到他们的使用配额并结束任务。
| 归档时间: |
|
| 查看次数: |
1360 次 |
| 最近记录: |