অবশেষে এই কাজটি পরিচালনা করার জন্য পরিচালনা করুন এবং ভেবেছিলাম যে এখানে অন্যদের ব্যথা বাঁচানোর আশায় কীভাবে নথিবদ্ধ করব।
পরিবেশ
- VS2012
- এসকিউএল সার্ভার 2008 আর 2
- .NET 4.5
- এএসপি.নেট এমভিসি 4 (রেজার)
- উইন্ডোজ 7
সমর্থিত ওয়েব ব্রাউজারগুলি
- ফায়ারফক্স 23
- আইই 10
- ক্রোম 29
- অপেরা 16
- সাফারি 5.1.7 (উইন্ডোজের জন্য সর্বশেষ?)
আমার কাজটি একটি ইউআই বোতাম ক্লিকে ছিল, আমার কন্ট্রোলারে একটি পদ্ধতি কল করুন (কিছু প্যারাম দিয়ে) এবং তারপরে এটি একটি এক্সএসল্ট রূপান্তর মাধ্যমে একটি এমএস-এক্সেল এক্সএমএল ফিরিয়ে আনবে। ফিরে আসা এমএস-এক্সেল এক্সএমএল এর পরে ব্রাউজারটিকে ওপেন / সেভ ডায়ালগটি পপআপ করতে দেয়। এটিতে সমস্ত ব্রাউজারে কাজ করতে হয়েছিল (উপরে তালিকাভুক্ত)।
প্রথমে আমি আজাক্সের সাথে ফাইল ফাইলের জন্য "ডাউনলোড" অ্যাট্রিবিউট দিয়ে একটি গতিশীল অ্যাঙ্কর তৈরি করার চেষ্টা করেছি, তবে এটি কেবল 5 বা 3 ব্রাউজারের (এফএফ, ক্রোম, অপেরা) জন্য কাজ করেছে, আইই বা সাফারি নয়। এবং প্রকৃত "ডাউনলোড" হওয়ার কারণ হিসাবে অ্যাঙ্কারের ক্লিক ইভেন্টটিকে প্রোগ্রামগতভাবে ফায়ার করার চেষ্টা করার সমস্যা রয়েছে।
আমি যা করে শেষ করেছি তা হল একটি "অদৃশ্য" আইএফআরএম ব্যবহার করে এবং এটি 5 টি ব্রাউজারের জন্য কাজ করে!
সুতরাং আমি এখানে যা এলাম তা এখানে: [দয়া করে নোট করুন যে আমি কোনওভাবেই এইচটিএমএল / জাভাস্ক্রিপ্ট গুরু নই এবং কেবলমাত্র প্রাসঙ্গিক কোডই অন্তর্ভুক্ত করেছি]
এইচটিএমএল (প্রাসঙ্গিক বিটের স্নিপেট)
<div id="docxOutput">
<iframe id="ifOffice" name="ifOffice" width="0" height="0"
hidden="hidden" seamless='seamless' frameBorder="0" scrolling="no"></iframe></div>
অবশ্যই JAVASCRIPT
//url to call in the controller to get MS-Excel xml
var _lnkToControllerExcel = '@Url.Action("ExportToExcel", "Home")';
$("#btExportToExcel").on("click", function (event) {
event.preventDefault();
$("#ProgressDialog").show();//like an ajax loader gif
//grab the basket as xml
var keys = GetMyKeys();//returns delimited list of keys (for selected items from UI)
//potential problem - the querystring might be too long??
//2K in IE8
//4096 characters in ASP.Net
//parameter key names must match signature of Controller method
var qsParams = [
'keys=' + keys,
'locale=' + '@locale'
].join('&');
//The element with id="ifOffice"
var officeFrame = $("#ifOffice")[0];
//construct the url for the iframe
var srcUrl = _lnkToControllerExcel + '?' + qsParams;
try {
if (officeFrame != null) {
//Controller method can take up to 4 seconds to return
officeFrame.setAttribute("src", srcUrl);
}
else {
alert('ExportToExcel - failed to get reference to the office iframe!');
}
} catch (ex) {
var errMsg = "ExportToExcel Button Click Handler Error: ";
HandleException(ex, errMsg);
}
finally {
//Need a small 3 second ( delay for the generated MS-Excel XML to come down from server)
setTimeout(function () {
//after the timeout then hide the loader graphic
$("#ProgressDialog").hide();
}, 3000);
//clean up
officeFrame = null;
srcUrl = null;
qsParams = null;
keys = null;
}
});
সি # সার্ভার-সাইড (কোড স্নিপেট) @ ড্র একটি XMLActionResult নামে একটি কাস্টম অ্যাকশনারসাল্ট তৈরি করেছে যা আমি আমার উদ্দেশ্যে পরিবর্তিত করেছি।
এক্সিমারসাল্ট হিসাবে কোনও নিয়ন্ত্রণকারীর ক্রিয়া থেকে এক্সএমএল ফেরত দেবেন?
আমার নিয়ামক পদ্ধতি (অ্যাকশন রেজাল্ট প্রদান করে)
- কীগুলির প্যারামিটারগুলি একটি এসকিউএল সার্ভারের সঞ্চিত প্রোকগুলিতে পাস করে যা একটি এক্সএমএল উত্পন্ন করে
- এক্সএমএল এর পরে এক্সএসল্টের মাধ্যমে একটি এমএস-এক্সেল এক্সএমএল (এক্সএমএল ডকুমেন্ট) রূপান্তরিত হয়
পরিবর্তিত XMLActionResult এর উদাহরণ তৈরি করে এটি প্রদান করে
এক্সএমএলএকশনআরসাল্ট রেজাল্ট = নতুন এক্সএমএলএকশনআরসাল্ট (এক্সেলএক্সএমএল, "অ্যাপ্লিকেশন / ভিএনডি.এমএস-এক্সেল"); স্ট্রিং সংস্করণ = ডেটটাইম.নো। টুস্ট্রিং ("ডিডি_এমএমএম_ইউই_হম্মসস্টেট"); স্ট্রিং ফাইলমাস্ক = "LabelExport_ {0} .xML";
ফলাফল.ডাউনলোডফিলনাম = স্ট্রিং.ফর্ম্যাট (ফাইলমাস্ক, সংস্করণ); প্রত্যাবর্তনের ফলাফল;
@ ড্র তৈরি করা XMLActionResult শ্রেণিতে প্রধান পরিবর্তন।
public override void ExecuteResult(ControllerContext context)
{
string lastModDate = DateTime.Now.ToString("R");
//Content-Disposition: attachment; filename="<file name.xml>"
// must set the Content-Disposition so that the web browser will pop the open/save dialog
string disposition = "attachment; " +
"filename=\"" + this.DownloadFilename + "\"; ";
context.HttpContext.Response.Clear();
context.HttpContext.Response.ClearContent();
context.HttpContext.Response.ClearHeaders();
context.HttpContext.Response.Cookies.Clear();
context.HttpContext.Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);// Stop Caching in IE
context.HttpContext.Response.Cache.SetNoStore();// Stop Caching in Firefox
context.HttpContext.Response.Cache.SetMaxAge(TimeSpan.Zero);
context.HttpContext.Response.CacheControl = "private";
context.HttpContext.Response.Cache.SetLastModified(DateTime.Now.ToUniversalTime());
context.HttpContext.Response.ContentType = this.MimeType;
context.HttpContext.Response.Charset = System.Text.UTF8Encoding.UTF8.WebName;
//context.HttpContext.Response.Headers.Add("name", "value");
context.HttpContext.Response.Headers.Add("Last-Modified", lastModDate);
context.HttpContext.Response.Headers.Add("Pragma", "no-cache"); // HTTP 1.0.
context.HttpContext.Response.Headers.Add("Expires", "0"); // Proxies.
context.HttpContext.Response.AppendHeader("Content-Disposition", disposition);
using (var writer = new XmlTextWriter(context.HttpContext.Response.OutputStream, this.Encoding)
{ Formatting = this.Formatting })
this.Document.WriteTo(writer);
}
মূলত এটি ছিল। আশা করি এটি অন্যকে সহায়তা করবে।