كيف يمكن التغلب على خطأ [1] IE أثناء حفظ ملف Excel من خادم ويب؟

StackOverflow https://stackoverflow.com/questions/120497

  •  02-07-2019
  •  | 
  •  

سؤال

لقد لاحظت أن Internet Explorer يضيف رقمًا بين قوسين مربعين إلى الملفات التي يتم تنزيلها من الإنترنت (عادةً [1]).يؤدي هذا إلى إنشاء مشكلة كبيرة عند تنزيل جداول بيانات Excel لأن الأقواس المربعة ليست حرف اسم ملف صالحًا داخل اسم ورقة عمل Excel.هذه المشكلة خاصة بـ IE، بينما تحتفظ المتصفحات الأخرى بنفس اسم الملف.

لذلك، إذا كان لديك جدول محوري تم تحديثه تلقائيًا عند فتح الملف على سبيل المثال، فستتلقى رسالة خطأ تفيد بأن الاسم "file[1].yourPivotTableName" غير صالح.

هل هناك أي حل لتلك المشكلة؟

يحرر :ويبدو أنه مهما كان اسم الملف المقترح بواسطة توجيهات HTTP, ، يضيف IE [1] في جميع الحالات، مما يسبب المشكلة!(لذا فإن الإجابات المتعلقة بأسماء الملفات ليست مفيدة في هذه الحالة)

يحرر :لقد جربت بعض رموز VBA لحفظ الملف تحت اسم آخر عند فتحه.ومع ذلك، فإنه لا يعمل (نفس رسالة الخطأ السابقة).هل تعتقد أن هناك طريقة لإصلاح ذلك باستخدام VBA؟

هل كانت مفيدة؟

المحلول

لقد نجحت في العمل باستخدام VBA الذي قدمه هذا الرجل الرائع (فكر فيه باعتزاز).يقوم بإعادة تسمية الملف ثم يعيد ربط المحاور.

http://php.kennedydatasolutions.com/blog/2008/02/05/internet-explorer-breaks-excel-pivot-tables/

نصائح أخرى

أعتقد أن هذا يحدث عند فتح جدول البيانات في IE ويقوم IE بحفظه في ملف مؤقت.وأعتقد أن هذا يحدث فقط عندما يحتوي اسم ملف جدول البيانات على أكثر من نقطة واحدة.جربه باستخدام "sample.xls" بسيط.الحل البديل الآخر هو مطالبة المستخدمين بحفظ الملف على سطح المكتب ثم فتحه.

إنها ميزة مضمنة في Internet Explorer.

توقف عن استخدام "فتح"، وابدأ في استخدام "حفظ" في نافذة تنزيل الملف، وإلا فسيقوم IE بإلحاق "[1]" باسم الملف الذي يضعه في بعض المجلدات المؤقتة.

يمكنك إنشاء بعض تطبيقات .NET باستخدام System.IO.FileSystemWatcher الذي يلتقط حدث إنشاء الملف الذي تم تنزيله أو شيء ما ويعيد تسمية الملف.

لقد قمت بحل هذه المشكلة باستخدام الطريقة حيث نمرر 3 معلمات:اسم الملف، وامتداد الملف (بدون .dot) وطلب HTTP)؛ثم القيام بتشفير UTF-8 لاسم الملف والامتداد.عينة من الرموز:

public static String encoding(String fileName, String extension, HttpServletRequest request)
{
    String user = request.getHeader( "user-agent" );
    boolean isInternetExplorer = ( user.indexOf( "MSIE" ) > -1 );
    String var = "";
    try
    {           
    fileName = URLEncoder.encode( fileName, "UTF-8" );
        fileName = fileName.trim().replaceAll( "\\+", " " );
        extension = URLEncoder.encode( extension, "UTF-8" );
        extension = extension.trim().replaceAll( "\\+", " " );
        if ( isInternetExplorer )
        {
        disposition = "attachment; filename=\"" + fileName+"."+extension+"\"";
        }
        else
        {
        var = "attachment; filename*=UTF-8''" + fileName+"."+extension;
        }            
    }
    catch ( UnsupportedEncodingException ence )
    {
    var = "attachment; filename=\"" + fileName+"."+extension;
        ence.printStackTrace();
    }

    return var;
}

هذا يعمل بشكل جيد في حالتي.نأمل أن تساعدك جميعا.

في الواقع، رمز .NET الصحيح هو كما يلي:

Response.AppendHeader("content-disposition", "attachment;filename=file.xls");
Response.ContentType = "application/vnd.ms-excel";

ملحوظة: إلحاق رأس, ، لا AddHeader, ، والذي أعتقد أنه يعمل فقط في تصحيح أخطاء خادم الويب وIIS7.

لقد نجح ما يلي بالنسبة لي:

private string EncodeFileName(string fileName)
    {
        fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8).Replace("+", " ");
        if (HttpContext.Current.Request.UserAgent.ToLower().Contains("msie"))
        {
            var res = new StringBuilder();
            var chArr = fileName.ToCharArray();
            for (var j = 0; j < chArr.Length; j++)
            {
                if (chArr[j] == '.' && j != fileName.LastIndexOf("."))
                    res.Append("%2E");
                else
                    res.Append(chArr[j]);
            }
            fileName = res.ToString();
        }
        return "\"" + fileName + "\"";
    }

يمكنك فقط التأكد من إيقاف التحديث التلقائي في مربع الخيارات الخاص بالمحور.الآن، حتى عند فتحه من الخادم، سيعمل المحور المحوري بشكل مثالي

لقد واجهت نفس المشكلة وتوصلت إلى (imo) حلاً أفضل لا يحتاج إلى أي VBA.

إذا قمت بتعيين رأس "الترتيب للمحتوى" على "المرفق؛اسم الملف=<...>" بدلاً من "مضمّن؛filename=<...>" ستفتح المتصفحات العادية مربع حوار يسمح بحفظ أو فتح ملف باسم ملف محدد في الرأس، لكن Internet Explorer سيتصرف بطريقة غريبة نوعًا ما.سيتم فتح مربع حوار تنزيل الملف وإذا ضغطت يحفظ سيقترح اسم ملف تم تعريفه في الرأس، ولكن إذا ضغطت يفتح سيحفظ الملف في مجلد مؤقت ويفتحه باسم هو نفس URN الخاص بك (بدون "مساحة الاسم")، على سبيل المثالإذا كان URI الخاص بك هو http://server/folder/file.html, ، لذلك سيحفظ IE ملفك باسم file.html (بدون أقواس، وو هوو!).وهذا يقودنا إلى الحل:

اكتب برنامجًا نصيًا يتعامل مع الطلب من http://server/folder/* وعندما تحتاج إلى تقديم ملف XLS، ما عليك سوى إعادة التوجيه إلى هذا البرنامج النصي (استخدم اسم الملف الخاص بك بدلاً من العلامة النجمية) مع التصرف في المحتوى ضبط ل في النسق.

ضع هذه الأسطر الأربعة في الكود الخاص بك:

response.reset();
response.setHeader("Expires", "0");
response.setHeader("Cache-Control","must-revalidate,post-check=0, pre-check=0");
response.setHeader("Pragma", "public");

أتمنى أن يساعدك هذا.

في .NET وجدت من خلال تجربتي أن هذا فقط هو ما يناسبني:

            Response.AddHeader("Content-Disposition", "attachment; filename=excel.xls");
            Response.AddHeader("Content-Type", "application/vnd.ms-excel");
            Response.ContentType = "application/vnd.ms-excel";

رائحة الازدواجية، ولكن حتى الآن لم أتمكن من الوصول إلى الجزء السفلي منها (ربما يشرح منشور Sebs هذا).كما تظهر قيمة "الترتيب للمحتوى" صعبة للغاية، استخدم:بدل من ؛أو حذف المسافة بينه وبين "اسم الملف" وينفجر!

أيضًا إذا قمت بتمكين الضغط على IIS فقد يؤدي ذلك إلى إصلاح الأمور لك:

Response.ClearHeaders()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top