2011-03-04 91 views
1

如何用excel工作簿中的预定义模式创建xml?将excel转换为xml

+0

你有没有任何编程语言或框架? – 2011-03-04 10:43:51

+0

c#与.net框架 – harsh 2011-03-04 10:58:38

回答

0

有一招。您可以创建XSL(样式表)将您的XML转换为简单的HTML标记。使用XslCompiledTransform.Transform()进行转换并使用XLS(Excel电子表格)扩展名进行保存。它将通过MS Excel打开,并且所有Excel功能都将可用。据我所知,如果您真的需要快速转储数据,以便可以在Excel中打开,那么这是最佳解决方案。

+0

我想将excel转换为xml – harsh 2011-03-04 12:10:12

0

这是一个可能帮助你的功能,我没有那么了解你的问题。简单地把你的文件名和xls与数据集中的数据一起生成。

public static void exportToExcel(DataSet source, string fileName) 
    { 

     System.IO.StreamWriter excelDoc; 

     excelDoc = new System.IO.StreamWriter(fileName); 
     const string startExcelXML = "<xml version>\r\n<Workbook " + 
       "xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" + 
       " xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n " + 
       "xmlns:x=\"urn:schemas- microsoft-com:office:" + 
       "excel\"\r\n xmlns:ss=\"urn:schemas-microsoft-com:" + 
       "office:spreadsheet\">\r\n <Styles>\r\n " + 
       "<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n " + 
       "<Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>" + 
       "\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>" + 
       "\r\n <Protection/>\r\n </Style>\r\n " + 
       "<Style ss:ID=\"BoldColumn\">\r\n <Font " + 
       "x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n " + 
       "<Style  ss:ID=\"StringLiteral\">\r\n <NumberFormat" + 
       " ss:Format=\"@\"/>\r\n </Style>\r\n <Style " + 
       "ss:ID=\"Decimal\">\r\n <NumberFormat " + 
       "ss:Format=\"0.0000\"/>\r\n </Style>\r\n " + 
       "<Style ss:ID=\"Integer\">\r\n <NumberFormat " + 
       "ss:Format=\"0\"/>\r\n </Style>\r\n <Style " + 
       "ss:ID=\"DateLiteral\">\r\n <NumberFormat " + 
       "ss:Format=\"mm/dd/yyyy;@\"/>\r\n </Style>\r\n " + 
       "</Styles>\r\n "; 
     const string endExcelXML = "</Workbook>"; 

     int rowCount = 0; 
     int sheetCount = 1; 
     /* 
     <xml version> 
     <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
     xmlns:o="urn:schemas-microsoft-com:office:office" 
     xmlns:x="urn:schemas-microsoft-com:office:excel" 
     xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> 
     <Styles> 
     <Style ss:ID="Default" ss:Name="Normal"> 
     <Alignment ss:Vertical="Bottom"/> 
     <Borders/> 
     <Font/> 
     <Interior/> 
     <NumberFormat/> 
     <Protection/> 
     </Style> 
     <Style ss:ID="BoldColumn"> 
     <Font x:Family="Swiss" ss:Bold="1"/> 
     </Style> 
     <Style ss:ID="StringLiteral"> 
     <NumberFormat ss:Format="@"/> 
     </Style> 
     <Style ss:ID="Decimal"> 
     <NumberFormat ss:Format="0.0000"/> 
     </Style> 
     <Style ss:ID="Integer"> 
     <NumberFormat ss:Format="0"/> 
     </Style> 
     <Style ss:ID="DateLiteral"> 
     <NumberFormat ss:Format="mm/dd/yyyy;@"/> 
     </Style> 
     </Styles> 
     <Worksheet ss:Name="Sheet1"> 
     </Worksheet> 
     </Workbook> 
     */ 
     excelDoc.Write(startExcelXML); 
     excelDoc.Write("<Worksheet ss:Name=\"Sheet" + sheetCount + "\">"); 
     excelDoc.Write("<Table>"); 
     excelDoc.Write("<Row>"); 
     for (int x = 0; x < source.Tables[0].Columns.Count; x++) 
     { 
      excelDoc.Write("<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">"); 
      excelDoc.Write(source.Tables[0].Columns[x].ColumnName); 
      excelDoc.Write("</Data></Cell>"); 
     } 
     excelDoc.Write("</Row>"); 
     foreach (DataRow x in source.Tables[0].Rows) 
     { 
      rowCount++; 
      //if the number of rows is > 64000 create a new page to continue output 

      if (rowCount == 64000) 
      { 
       rowCount = 0; 
       sheetCount++; 
       excelDoc.Write("</Table>"); 
       excelDoc.Write(" </Worksheet>"); 
       excelDoc.Write("<Worksheet ss:Name=\"Sheet" + sheetCount + "\">"); 
       excelDoc.Write("<Table>"); 
      } 
      excelDoc.Write("<Row>"); //ID=" + rowCount + " 

      for (int y = 0; y < source.Tables[0].Columns.Count; y++) 
      { 
       System.Type rowType; 
       rowType = x[y].GetType(); 
       switch (rowType.ToString()) 
       { 
        case "System.String": 
         string XMLstring = x[y].ToString(); 
         XMLstring = XMLstring.Trim(); 
         XMLstring = XMLstring.Replace("&", "&"); 
         XMLstring = XMLstring.Replace(">", ">"); 
         XMLstring = XMLstring.Replace("<", "<"); 
         excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" + 
             "<Data ss:Type=\"String\">"); 
         excelDoc.Write(XMLstring); 
         excelDoc.Write("</Data></Cell>"); 
         break; 
        case "System.DateTime": 
         //Excel has a specific Date Format of YYYY-MM-DD followed by 

         //the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000 

         //The Following Code puts the date stored in XMLDate 

         //to the format above 

         DateTime XMLDate = (DateTime)x[y]; 
         string XMLDatetoString = ""; //Excel Converted Date 

         XMLDatetoString = XMLDate.Year.ToString() + 
          "-" + 
          (XMLDate.Month < 10 ? "0" + 
          XMLDate.Month.ToString() : XMLDate.Month.ToString()) + 
          "-" + 
          (XMLDate.Day < 10 ? "0" + 
          XMLDate.Day.ToString() : XMLDate.Day.ToString()) + 
          "T" + 
          (XMLDate.Hour < 10 ? "0" + 
          XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) + 
          ":" + 
          (XMLDate.Minute < 10 ? "0" + 
          XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) + 
          ":" + 
          (XMLDate.Second < 10 ? "0" + 
          XMLDate.Second.ToString() : XMLDate.Second.ToString()) + 
          ".000"; 
         excelDoc.Write("<Cell ss:StyleID=\"DateLiteral\">" + 
            "<Data ss:Type=\"DateTime\">"); 
         excelDoc.Write(XMLDatetoString); 
         excelDoc.Write("</Data></Cell>"); 
         break; 
        case "System.Boolean": 
         excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" + 
            "<Data ss:Type=\"String\">"); 
         excelDoc.Write(x[y].ToString()); 
         excelDoc.Write("</Data></Cell>"); 
         break; 
        case "System.Int16": 
        case "System.Int32": 
        case "System.Int64": 
        case "System.Byte": 
         excelDoc.Write("<Cell ss:StyleID=\"Integer\">" + 
           "<Data ss:Type=\"Number\">"); 
         excelDoc.Write(x[y].ToString()); 
         excelDoc.Write("</Data></Cell>"); 
         break; 
        case "System.Decimal": 
        case "System.Double": 
         excelDoc.Write("<Cell ss:StyleID=\"Decimal\">" + 
           "<Data ss:Type=\"Number\">"); 
         excelDoc.Write(x[y].ToString()); 
         excelDoc.Write("</Data></Cell>"); 
         break; 
        case "System.DBNull": 
         excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" + 
           "<Data ss:Type=\"String\">"); 
         excelDoc.Write(""); 
         excelDoc.Write("</Data></Cell>"); 
         break; 
        default: 
         throw (new Exception(rowType.ToString() + " not handled.")); 
       } 
      } 
      excelDoc.Write("</Row>"); 
     } 
     excelDoc.Write("</Table>"); 
     excelDoc.Write(" </Worksheet>"); 
     excelDoc.Write(endExcelXML); 
     excelDoc.Close(); 
    } 
0

如果你在excel中有一些数据并想将它们转换为xml,那么你应该有一个合适的XML Schema定义。我假设你有一个合适的模式,那么你只需要遵循几个简单的步骤在Excel中将其转换为XML。让我知道,如果你正在寻找如何在Excel中实现这个步骤...希望你有最新版本的微软办公室..