2008-10-16 5 views
1

클라이언트 컴퓨터에서 여러 개의 데이터 테이블을 각각의 시트에 Excel로 내보내야합니다. 그것이 단지 하나의 시트라면 Excel/csv 콘텐츠 유형을 사용 하겠지만 전체 통합 문서를 나타낼 수있는 XML 형식에 관한 내용을 들었습니다. Packaging 및 .xlsx 경로를 사용하지 않으려 고하므로 표준 .xls가 필요합니다.브라우저를 통해 Excel로 여러 시트 내보내기

Google의 버그 추적기 인 제미니 (Gemini)는 Excel이 자동으로 다중 시트 통합 문서로 열었지만 찾을 수없는 XML 파일을 생성하는 내보내기 기능을 사용했습니다. 여전히 그런 메커니즘이 존재하며, 그 스키마를 어디에서 찾을 수 있습니까?

답변

1

Excel XML 작성기 라이브러리를 직접 만들지 않으려면, 예를 들어 this library을 사용할 수 있습니다.

0

Excel에서 통합 문서를 XML 형식으로 저장할 수 있습니다. (Excel 2007에서는 XML 스프레드 시트 2003이라고 함).

이렇게하면 시작할 수 있습니다.

0

사용하는 별도의 클래스 파일에서와 page.cs 파일에 아래의 것은 버튼 클릭에이 같은 기능을 붙여 넣습니다 ExcelHelperNS.ExcelHelper.ToExcel (을 DataSet1, "ExcelFileName", Page.Response); 별도의 클래스와는 작동에

사용이 ..

{ // 행 제한 나이는 시트 당 혼란 스럽다 엑셀 ExcelHelper

공용 클래스는, 엑셀 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); 
    } 
} 
+0

감사합니다,하지만 내가보다 일을 더 나은 방법이 확신 해요 '.Replace는 ("&", "&");'는. 나는 심지어 내 자신의 작품으로, 지금까지 중요 해요,하지만 의미 나는 건설적이다. – ProfK

0

아래 링크를 참조하십시오.

이 방법을 사용하면 데이터 집합에서 xml을 만들 수 있고 ... ur 데이터가 큰 경우 ... response.write를 사용하여 각 xml 문자열을 클라이언트 측에 쓸 수 있으므로 서버의 메모리 사용량을 줄일 수 있습니다. 크게.

convert xml to excel with multiple worksheet

관련 문제