2008-10-16 139 views
1

我需要将多个数据表格导出到客户端计算机上的Excel中,每个表格都到自己的工作表中。如果它只是一张表,我会使用Excel/csv内容类型,但我听说过一些可以表示整个工作簿的XML格式。我不想下载Packaging和.xlsx路由,所以我需要标准的.xls。通过浏览器将多个表格导出到Excel

我们的错误跟踪器Gemini曾经有一个导出函数生成一个XML文件,Excel自动打开为一个多页工作簿,但是我找不到它。是否还有这样的机制,我在哪里可以找到该模式?

回答

1

如果您不想创建自己的Excel XML编写器库,则可以使用例如this library

0

在Excel中,您可以将工作簿保存为XML格式。 (在Excel 2007中称为XML Spreadsheet 2003)。

这可能会让你开始。

0

采用以下方式在单独的类文件,并在文件page.cs粘贴功能类似这样的按钮点击: ExcelHelperNS.ExcelHelper.ToExcel(dataSet1的,“ExcelFileName”,Page.Response);

使用这在单独的类,它会工作..

公共类ExcelHelper { //行限制的年龄较大的每片练成优化版本,2003年Excel中的行限制是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); 
    } 
} 
+0

谢谢,但我敢肯定有做的事情比的更好的方式” .Replace(‘&’,“&");”。我曾经关键,甚至我自己的工作,但它意味着我永远是建设性的。 – ProfK 2009-07-11 17:30:05

0

请看下面的链接。

使用这种方式,你可以创建一个XML数据集...如果你的数据是巨大的...你可以使用response.write写每个XML字符串到客户端,以便在服务器的内存使用量可以减少急剧下降。

convert xml to excel with multiple worksheet