2008-10-16 7 views
1

je dois exporter plusieurs tables de données vers Excel sur la machine de clients, chacun à leur propre feuille. S'il s'agissait d'une seule feuille, j'utiliserais le type de contenu Excel/CSV, mais j'ai entendu parler d'un format XML qui peut représenter un classeur entier. Je ne veux pas aller sur les routes Packaging et .xlsx, j'ai donc besoin de .xls standard.Exporter plusieurs feuilles à Excel via le navigateur

Notre bug tracker, Gemini, l'habitude d'avoir une fonction d'exportation qui a produit un fichier XML Excel ouvre automatiquement un classeur à feuilles multiples, mais je ne peux pas le trouver. Y a-t-il encore un tel mécanisme, et où puis-je trouver ce schéma?

Répondre

1

Vous pouvez par exemple utiliser this library, si vous ne voulez pas créer votre propre bibliothèque écrivain Excel XML.

0

Dans Excel, vous pouvez enregistrer un classeur au format XML. (dans Excel 2007, il s'appelle XML Spreadsheet 2003).

Cela pourrait commencer.

0

UTILISATION Le fichier ci-dessous classe séparée et le fichier page.cs coller la fonction comme celui-ci sur le bouton clic: ExcelHelperNS.ExcelHelper.ToExcel (Dataset1, « ExcelFileName », Page.Response);

cette utilisation en classe séparée et il fonctionnera ..

public class ExcelHelper {// limites rang plus excel verion par feuille, la limite de la ligne pour Excel 2003 est 65536 const int MAXLIGNES = 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); 
    } 
} 
+0

Merci, mais je suis sûr qu'il ya de meilleures façons de faire les choses que » .Replacer (« & »," &");. Je suis toujours critique, même de mon propre travail, mais cela signifie Je suis toujours constructif. – ProfK

0

Voir le lien ci-dessous. De cette façon, vous pouvez créer un fichier XML hors jeu de données ... et si vos données sont énormes ... vous pouvez utiliser response.write pour écrire chaque chaîne xml dans le côté client afin que l'utilisation de la mémoire sur le serveur puisse être réduite drastiquement.

convert xml to excel with multiple worksheet

Questions connexes