برای مثال اگر هاست شما از IIS7 به بعد استفاده میکند قسمت system.webServer فایل web.config شما باید شامل Elmah.ErrorMailModule شود در غیر اینصورت ایمیلی ارسال نخواهد شد.
این موارد دقیقا در این فایل راهنمای همراه مجموعه موجود است.
editbin.exe /STACK:1000000 $(TargetFileName)
Error 7 The command "editbin.exe /STACK:10000 MS-AUV.exe" exited with code 9009.MS-AUV
در برنامههای تحت وب، در بعضی موارد نیاز داریم تا برای کاربر، امکان ثبت دادههایش را با آپلود فایلهای Excel فراهم کنیم. برای مثال در مطلب خواندن اطلاعات از فایل اکسل با استفاده از LinqToExcel ، امکان خواندن از Excel توضیح داده شده، اما نقطه ضعف این روشها، وابستگی به Providerهای مایکروسافت است که در صورت عدم نصب آن ها:
Microsoft.Jet.OLEDB.4.0 provider --> Excel 97-2003 format (.xls) Microsoft.ACE.OLEDB.12.0 provider --> Excel 2007+ format (.xlsx)
The ‘Microsoft.Jet.OLEDB.4.0’ provider is not registered on the local machine The ‘Microsoft.ACE.OLEDB.12.0’ provider is not registered on the local machine
البته راه حل، نصب Office 2007 Data Connectivity Components یا Office 2010 Database Engine بر روی سرور میباشد. اما اگر هاست اشتراکی بوده و اجازه نصب نداشته باشیم؟
در این مقاله به بررسی کتابخانه ExcelDataReader میپردازیم که امکان خواندن فایلهای اکسل را بدون نیاز به نصب هرگونه پیش نیازی بر روی سرور، برای ما فراهم میکند.
برای این کار:
1- ابتدا یک پروژه خالی Asp.Net MVC را ایجاد میکنیم.
2- با استفاده از دستورات زیر در Package Manager Console بستههای ExcelDataReader و ExcelDataReader.DataSet را نصب میکنیم:
PM> Install-Package ExcelDataReader PM> Install-Package ExcelDataReader.DataSet
3- سپس کنترلر مورد نظر (در اینجا HomeController) را ایجاد نموده و اکشن Upload را بصورت زیر در آن قرار میدهیم:
public ActionResult Upload() { return View(); }
4- برای آپلود فایل، اکشن دیگری را با نام Upload نیاز داریم که آن را بصورت زیر ایجاد میکنیم:
توجه: در قطعه کد زیر سعی شده از حداقل کانفیگ کتابخانه استفاده شود. کانفیگ بیشتر
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Upload(HttpPostedFileBase upload) { // اعتبار سنجی فایل آپلود شده if (upload != null && upload.ContentLength > 0 && (upload.FileName.EndsWith(".xls") || upload.FileName.EndsWith(".xlsx"))) { // با خواندن فایل به صورت باینری، این کتابخانه نیازی به نصب پیش نیازهای آفیس ندارد Stream stream = upload.InputStream; // نیازی به نگرانی در مورد پسوند فایل نیست // کتابخانه به صورت خودکار کلاس مورد نظر برای پسوند مربوطه را استفاده میکند // ExcelDataReader.ExcelBinaryReader یا ExcelDataReader.ExcelOpenXmlReader IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream); // روش ذکر شده در قسمت دوم برای خواندن کل اطلاعات بصورت یکجا DataSet result = reader.AsDataSet(new ExcelDataSetConfiguration() { ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration() { // true: ردیف اول از فایل را به عنوان هدر در نظر میگیرد // مقدار پیش فرض: false UseHeaderRow = true } }); reader.Close(); return View(result.Tables[0]); } ModelState.AddModelError("File", "Please upload Excel file ..."); return View(); }
do { while (reader.Read()) { // reader.GetDouble(0); } } while (reader.NextResult());
@model System.Data.DataTable @using System.Data; <h2>Upload File</h2> @using (Html.BeginForm("Upload", "Home", null, FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.AntiForgeryToken() @Html.ValidationSummary() <div> <input type="file" id="dataFile" name="upload" /> </div> <div> <input type="submit" value="Upload" /> </div> if (Model != null) { <table> <thead> <tr> @foreach (DataColumn col in Model.Columns) { <th>@col.ColumnName</th> } </tr> </thead> <tbody> @foreach (DataRow row in Model.Rows) { <tr> @foreach (DataColumn col in Model.Columns) { <td>@row[col.ColumnName]</td> } </tr> } </tbody> </table> } }
6- حالا پروژه را اجرا میکنیم تا خروجی را مشاهده کنیم.
ابتدا فایل مورد نظر را انتخاب و آپلود میکنیم:
و خروجی به صورت زیر خواهد بود:
کدهای کامل این مثال را از اینجا میتوانید دریافت کنید: UploadExcelFiles.rar
C:\Program Files (x86)\Microsoft Visual Studio 14.0>csc /? Microsoft (R) Visual C# Compiler version 1.0.0.50618 Copyright (C) Microsoft Corporation. All rights reserved. Visual C# Compiler Options /analyzer:<file list> Run the analyzers from this assembly (Short form: /a)
void jsCall(string alert)
{
string script = @"alert('" + alert + "');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "jsCall", script, true);
}
if (page != null)
{
ScriptManager sMgr = ScriptManager.GetCurrent(page);
if (sMgr != null)
{
ScriptManager.RegisterStartupScript(page, page.GetType(),
"script" + new Guid().ToString("N"),
scriptBlock, false);
}
else
//همان روش قبلی
...