通过浏览器将多个工作表导出到Excel

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

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

如果您不想创build自己的Excel XML编写器库,则可以使用此库。

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

这可能会让你开始。

使用下面在单独的类文件和page.cs文件粘贴button单击这样的function: ExcelHelperNS.ExcelHelper.ToExcel(Dataset1,“ExcelFileName”,Page.Response);

在单独的类中使用它,它将工作..

公共类ExcelHelper {/ /行限制每个工作表的老年人Excel版本,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); } } 

看下面的链接。

使用这种方式,你可以创build一个XML数据集…如果你的数据是巨大的…你可以使用response.write写每个XMLstring到客户端,使服务器的内存使用可以大大减less。

将xml转换为具有多个工作表的excel