تصدير أوراق متعددة إلى Excel من خلال المتصفح

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

  •  03-07-2019
  •  | 
  •  

سؤال

أحتاج إلى تصدير جداول بيانات متعددة إلى برنامج Excel على جهاز العميل، كل منها إلى الورقة الخاصة به.إذا كانت ورقة واحدة فقط، فسأستخدم نوع محتوى Excel/csv، ولكنني سمعت شيئًا عن تنسيق XML الذي يمكن أن يمثل مصنفًا بأكمله.لا أريد السير في مسار التغليف و.xlsx، لذلك أحتاج إلى .xls القياسي.

كان متتبع الأخطاء لدينا، Gemini، يحتوي على وظيفة تصدير تنتج ملف XML يفتحه Excel تلقائيًا كمصنف متعدد الأوراق، لكن لا يمكنني العثور عليه.هل لا تزال هناك مثل هذه الآلية، وأين يمكنني أن أجد هذا المخطط؟

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

المحلول

ويمكنك استخدام على سبيل المثال هذه المكتبة ، إذا كنت لا تريد إنشاء الخاصة إكسل XML مكتبة الكاتب الخاص.

نصائح أخرى

في إكسل يمكنك حفظ المصنف في تنسيق XML. (في Excel 2007 ويطلق عليه XML جدول بيانات 2003).

وهذا قد تحصل على انك بدأته.

استخدم ما يلي في ملف فئة منفصل وفي ملف page.cs، قم بلصق الوظيفة مثل هذا عند النقر فوق الزر: ExcelHelperNS.ExcelHelper.ToExcel(Dataset1, "ExcelFileName", Page.Response);

استخدم هذا في فصل منفصل وسيعمل ..

الفئة العامة excelhelper {// Row Limits أقدم Excel Verion لكل ورقة ، حد الصف لـ Excel 2003 هو 65536 const int rowlimit = 65000 ؛

    private static string getWorkbookTemplate()
    {
        var sb = new StringBuilder(818);
        sb.AppendFormat(@"<?xml version=""1.0""?>{0}", Environment.NewLine);
        sb.AppendFormat(@"<?mso-application progid=""Excel.Sheet""?>{0}", Environment.NewLine);
        sb.AppendFormat(@"<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet""{0}", Environment.NewLine);
        sb.AppendFormat(@" xmlns:o=""urn:schemas-microsoft-com:office:office""{0}", Environment.NewLine);
        sb.AppendFormat(@" xmlns:x=""urn:schemas-microsoft-com:office:excel""{0}", Environment.NewLine);
        sb.AppendFormat(@" xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet""{0}", Environment.NewLine);
        sb.AppendFormat(@" xmlns:html=""http://www.w3.org/TR/REC-html40"">{0}", Environment.NewLine);
        sb.AppendFormat(@" <Styles>{0}", Environment.NewLine);
        sb.AppendFormat(@"  <Style ss:ID=""Default"" ss:Name=""Normal"">{0}", Environment.NewLine);
        sb.AppendFormat(@"   <Alignment ss:Vertical=""Bottom""/>{0}", Environment.NewLine);
        sb.AppendFormat(@"   <Borders/>{0}", Environment.NewLine);
        sb.AppendFormat(@"   <Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""/>{0}", Environment.NewLine);
        sb.AppendFormat(@"   <Interior/>{0}", Environment.NewLine);
        sb.AppendFormat(@"   <NumberFormat/>{0}", Environment.NewLine);
        sb.AppendFormat(@"   <Protection/>{0}", Environment.NewLine);
        sb.AppendFormat(@"  </Style>{0}", Environment.NewLine);
        sb.AppendFormat(@"  <Style ss:ID=""s62"">{0}", Environment.NewLine);
        sb.AppendFormat(@"   <Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""{0}", Environment.NewLine);
        sb.AppendFormat(@"    ss:Bold=""1""/>{0}", Environment.NewLine);
        sb.AppendFormat(@"  </Style>{0}", Environment.NewLine);
        sb.AppendFormat(@"  <Style ss:ID=""s63"">{0}", Environment.NewLine);
        sb.AppendFormat(@"   <NumberFormat ss:Format=""Short Date""/>{0}", Environment.NewLine);
        sb.AppendFormat(@"  </Style>{0}", Environment.NewLine);
        sb.AppendFormat(@" </Styles>{0}", Environment.NewLine);
        sb.Append(@"{0}\r\n</Workbook>");
        return sb.ToString();
    }

    private static string replaceXmlChar(string input)
    {
        input = input.Replace("&", "&amp");
        input = input.Replace("<", "&lt;");
        input = input.Replace(">", "&gt;");
        input = input.Replace("\"", "&quot;");
        input = input.Replace("'", "&apos;");
        return input;
    }

    private static string getCell(Type type, object cellData)
    {
        var data = (cellData is DBNull) ? "" : cellData;
        if (type.Name.Contains("Int") || type.Name.Contains("Double") || type.Name.Contains("Decimal")) return string.Format("<Cell><Data ss:Type=\"Number\">{0}</Data></Cell>", data);
        if (type.Name.Contains("Date") && data.ToString() != string.Empty)
        {
            return string.Format("<Cell ss:StyleID=\"s63\"><Data ss:Type=\"DateTime\">{0}</Data></Cell>", Convert.ToDateTime(data).ToString("yyyy-MM-dd"));
        }
        return string.Format("<Cell><Data ss:Type=\"String\">{0}</Data></Cell>", replaceXmlChar(data.ToString()));
    }
    private static string getWorksheets(DataSet source)
    {
        var sw = new StringWriter();
        if (source == null || source.Tables.Count == 0)
        {
            sw.Write("<Worksheet ss:Name=\"Sheet1\">\r\n<Table>\r\n<Row><Cell><Data ss:Type=\"String\"></Data></Cell></Row>\r\n</Table>\r\n</Worksheet>");
            return sw.ToString();
        }
        foreach (DataTable dt in source.Tables)
        {
            if (dt.Rows.Count == 0)
                sw.Write("<Worksheet ss:Name=\"" + replaceXmlChar(dt.TableName) + "\">\r\n<Table>\r\n<Row><Cell  ss:StyleID=\"s62\"><Data ss:Type=\"String\"></Data></Cell></Row>\r\n</Table>\r\n</Worksheet>");
            else
            {
                //write each row data                
                var sheetCount = 0;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if ((i % rowLimit) == 0)
                    {
                        //add close tags for previous sheet of the same data table
                        if ((i / rowLimit) > sheetCount)
                        {
                            sw.Write("\r\n</Table>\r\n</Worksheet>");
                            sheetCount = (i / rowLimit);
                        }
                        sw.Write("\r\n<Worksheet ss:Name=\"" + replaceXmlChar(dt.TableName) +
                                 (((i / rowLimit) == 0) ? "" : Convert.ToString(i / rowLimit)) + "\">\r\n<Table>");
                        //write column name row
                        sw.Write("\r\n<Row>");
                        foreach (DataColumn dc in dt.Columns)
                            sw.Write(string.Format("<Cell ss:StyleID=\"s62\"><Data ss:Type=\"String\">{0}</Data></Cell>", replaceXmlChar(dc.ColumnName)));
                        sw.Write("</Row>");
                    }
                    sw.Write("\r\n<Row>");
                    foreach (DataColumn dc in dt.Columns)
                        sw.Write(getCell(dc.DataType, dt.Rows[i][dc.ColumnName]));
                    sw.Write("</Row>");
                }
                sw.Write("\r\n</Table>\r\n</Worksheet>");
            }
        }

        return sw.ToString();
    }
    public static string GetExcelXml(DataTable dtInput, string filename)
    {
        var excelTemplate = getWorkbookTemplate();
        var ds = new DataSet();
        ds.Tables.Add(dtInput.Copy());
        var worksheets = getWorksheets(ds);
        var excelXml = string.Format(excelTemplate, worksheets);
        return excelXml;
    }

    public static string GetExcelXml(DataSet dsInput, string filename)
    {
        var excelTemplate = getWorkbookTemplate();
        var worksheets = getWorksheets(dsInput);
        var excelXml = string.Format(excelTemplate, worksheets);
        return excelXml;
    }

    public static void ToExcel(DataSet dsInput, string filename, HttpResponse response)
    {
        var excelXml = GetExcelXml(dsInput, filename);
        response.Clear();
        response.AppendHeader("Content-Type", "application/vnd.ms-excel");
        response.AppendHeader("Content-disposition", "attachment; filename=" + filename);
        response.Write(excelXml);
        response.Flush();
        response.End();
    }

    public static void ToExcel(DataTable dtInput, string filename, HttpResponse response)
    {
        var ds = new DataSet();
        ds.Tables.Add(dtInput.Copy());
        ToExcel(ds, filename, response);
    }
}

وانظر الرابط أدناه.

وباستخدام هذه الطريقة يمكن ش خلق أكس من مجموعة البيانات ... وإذا كانت البيانات اور ضخمة ... ش يمكن استخدام response.write لكتابة كل سلسلة XML إلى العميل بحيث استخدام الذاكرة في ملقم يمكن أن تخفض بشكل كبير .

تحويل XML لتتفوق مع ورقة عمل متعددة

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