1. 程式人生 > >DataSet匯出到Excel比較完整的解決方案 一 --客戶端生成檔案 downmoon

DataSet匯出到Excel比較完整的解決方案 一 --客戶端生成檔案 downmoon

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

有一客戶需求:

1、要從SQL Server資料庫匯出並生成Excel ;

2、使用者下載對應的Excel並填寫上傳再匯入到SQL server。

費了將近六個小時,故一定要把過程寫下來,希望看到此文的朋友少走些不必要的彎路。

首先,想到的是直接匯出到客戶端,程式碼如下:

[c-sharp] view plain copy print ?
  1. public static void DataSetToExcel(DataSet oDS, HttpResponse Response, string fileName)  
  2.         {  
  3.             if (oDS == null || oDS.Tables[0] == null || oDS.Tables[0].Rows.Count == 0) { return; }  
  4.             Response.Clear();  
  5.             //Encoding pageEncode = Encoding.GetEncoding(PageEncode);  
  6.             HttpContext.Current.Response.Charset = "gb2312";  
  7.             //Response.ContentType = "application/vnd-excel";//"application/vnd.ms-excel";  
  8.             //Response.ContentType = "application/x-octet-stream";//"application/vnd.ms-excel";  
  9.             Response.ContentType = "text/csv";//"application/vnd.ms-excel";  
  10.             Response.AppendHeader("Content-Disposition""attachment;filename=" + fileName + ".cvs");  
  11.             System.IO.StringWriter oSW = new System.IO.StringWriter();  
  12.             HtmlTextWriter oHW = new HtmlTextWriter(oSW);  
  13.             DataGrid dg = new DataGrid();  
  14.             dg.DataSource = oDS.Tables[0];  
  15.             dg.DataBind();  
  16.             dg.RenderControl(oHW);  
  17.             Response.Write(oSW.ToString());  
  18.             Response.Flush();  
  19.             Response.Close();  
  20.         }  
public static void DataSetToExcel(DataSet oDS, HttpResponse Response, string fileName)        {            if (oDS == null || oDS.Tables[0] == null || oDS.Tables[0].Rows.Count == 0) { return; }            Response.Clear();            //Encoding pageEncode = Encoding.GetEncoding(PageEncode);            HttpContext.Current.Response.Charset = "gb2312";            //Response.ContentType = "application/vnd-excel";//"application/vnd.ms-excel";            //Response.ContentType = "application/x-octet-stream";//"application/vnd.ms-excel";            Response.ContentType = "text/csv";//"application/vnd.ms-excel";            Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName + ".cvs");            System.IO.StringWriter oSW = new System.IO.StringWriter();            HtmlTextWriter oHW = new HtmlTextWriter(oSW);            DataGrid dg = new DataGrid();            dg.DataSource = oDS.Tables[0];            dg.DataBind();            dg.RenderControl(oHW);            Response.Write(oSW.ToString());            Response.Flush();            Response.Close();        }   

這樣生成是生成了! 客戶也可以用Excel直接開啟並編輯,問題來了! 上傳時出錯,仔細看看生成的Excel.xls,

用記事本開啟,內容大致如下:

[css] view plain copy print ?
  1. <table cellspacing="0" rules="all" border="1" style="border-collapse:collapse;" mce_style="border-collapse:collapse;">  
  2.     <tr>  
  3.         <td>品名</td><td>最高價格</td><td>最低價格</td><td>平均價格</td><td>計量單位</td><td>備註</td>  
  4.     </tr><tr>  
  5.         <td>青菜</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>  
  6.     </tr><tr>  
  7.         <td>南瓜</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>  
  8.     </tr><tr>  
  9.         <td>瓠子</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>  
  10.     </tr><tr>  
  11.         <td>冬春筍</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>  
  12.     </tr><tr>  
  13.         <td>雪裡蕻</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>  
  14.     </tr><tr>  
  15.         <td>櫻桃蘿蔔</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>  
  16.     </tr><tr>  
  17.         <td>佛手瓜</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>  
  18.     </tr><tr>  
  19.         <td>白菜鼎</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>  
  20.     </tr><tr>  
  21.         <td>蒜</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>  
  22.     </tr><tr>  
  23.         <td>食用菌</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>  
  24.     </tr><tr>  
  25.         <td>黃瓜</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>  
  26.     </tr>  
  27. </table>   
<table cellspacing="0" rules="all" border="1" style="border-collapse:collapse;" mce_style="border-collapse:collapse;">    <tr>        <td>品名</td><td>最高價格</td><td>最低價格</td><td>平均價格</td><td>計量單位</td><td>備註</td>    </tr><tr>        <td>青菜</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>    </tr><tr>        <td>南瓜</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>    </tr><tr>        <td>瓠子</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>    </tr><tr>        <td>冬春筍</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>    </tr><tr>        <td>雪裡蕻</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>    </tr><tr>        <td>櫻桃蘿蔔</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>    </tr><tr>        <td>佛手瓜</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>    </tr><tr>        <td>白菜鼎</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>    </tr><tr>        <td>蒜</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>    </tr><tr>        <td>食用菌</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>    </tr><tr>        <td>黃瓜</td><td> </td><td> </td><td> </td><td>元/公斤</td><td> </td>    </tr></table>   

 

原來,就是純粹的html格式,披了件Excel的外衣。這樣使用者傳上來的檔案當然不是標準的Excel格式了!

於是, 想到直接生成xml格式的Excel文件,方法如下 :

 

 

[c-sharp] view plain copy print ?
  1. /// <summary>  
  2.         /// 執行匯出  
  3.         /// </summary>  
  4.         /// <param name="ds">要匯出的DataSet</param>  
  5.         /// <param name="strExcelFileName">要匯出的檔名</param>  
  6.         public static void ExportToExcel(DataSet source, string fileName)  
  7.         {  
  8.             System.IO.StreamWriter excelDoc;  
  9.             excelDoc = new System.IO.StreamWriter(fileName);  
  10.             const string startExcelXML = "<xml version>/r/n<Workbook " +  
  11.                   "xmlns=/"urn:schemas-microsoft-com:office:spreadsheet/"/r/n" +  
  12.                   " xmlns:o=/"urn:schemas-microsoft-com:office:office/"/r/n " +  
  13.                   "xmlns:x=/"urn:schemas-    microsoft-com:office:" +  
  14.                   "excel/"/r/n xmlns:ss=/"urn:schemas-microsoft-com:" +  
  15.                   "office:spreadsheet/">/r/n <Styles>/r/n " +  
  16.                   "<Style ss:ID=/"Default/" ss:Name=/"Normal/">/r/n " +  
  17.                   "<Alignment ss:Vertical=/"Bottom/"/>/r/n <Borders/>" +  
  18.                   "/r/n <Font/>/r/n <Interior/>/r/n <NumberFormat/>" +  
  19.                   "/r/n <Protection/>/r/n </Style>/r/n " +  
  20.                   "<Style ss:ID=/"BoldColumn/">/r/n <Font " +  
  21.                   "x:Family=/"Swiss/" ss:Bold=/"1/"/>/r/n </Style>/r/n " +  
  22.                   "<Style     ss:ID=/"StringLiteral/">/r/n <NumberFormat" +  
  23.                   " ss:Format=/"@/"/>/r/n </Style>/r/n <Style " +  
  24.                   "ss:ID=/"Decimal/">/r/n <NumberFormat " +  
  25.                   "ss:Format=/"0.0000/"/>/r/n </Style>/r/n " +  
  26.                   "<Style ss:ID=/"Integer/">/r/n <NumberFormat " +  
  27.                   "ss:Format=/"0/"/>/r/n </Style>/r/n <Style " +  
  28.                   "ss:ID=/"DateLiteral/">/r/n <NumberFormat " +  
  29.                   "ss:Format=/"mm/dd/yyyy;@/"/>/r/n </Style>/r/n " +  
  30.                   "</Styles>/r/n ";  
  31.             const string endExcelXML = "</Workbook>";  
  32.             int rowCount = 0;  
  33.             int sheetCount = 1;  
  34.             /**//* 
  35.            <xml version> 
  36.            <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
  37.            xmlns:o="urn:schemas-microsoft-com:office:office" 
  38.            xmlns:x="urn:schemas-microsoft-com:office:excel" 
  39.            xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> 
  40.            <Styles> 
  41.            <Style ss:ID="Default" ss:Name="Normal"> 
  42.              <Alignment ss:Vertical="Bottom"/> 
  43.              <Borders/> 
  44.              <Font/> 
  45.              <Interior/> 
  46.              <NumberFormat/> 
  47.              <Protection/> 
  48.            </Style> 
  49.            <Style ss:ID="BoldColumn"> 
  50.              <Font x:Family="Swiss" ss:Bold="1"/> 
  51.            </Style> 
  52.            <Style ss:ID="StringLiteral"> 
  53.              <NumberFormat ss:Format="@"/> 
  54.            </Style> 
  55.            <Style ss:ID="Decimal"> 
  56.              <NumberFormat ss:Format="0.0000"/> 
  57.            </Style> 
  58.            <Style ss:ID="Integer"> 
  59.              <NumberFormat ss:Format="0"/> 
  60.            </Style> 
  61.            <Style ss:ID="DateLiteral"> 
  62.              <NumberFormat ss:Format="mm/dd/yyyy;@"/> 
  63.            </Style> 
  64.            </Styles> 
  65.            <Worksheet ss:Name="Sheet1"> 
  66.            </Worksheet> 
  67.            </Workbook> 
  68.            */  
  69.             excelDoc.Write(startExcelXML);  
  70.             excelDoc.Write("<Worksheet ss:Name=/"Sheet" + sheetCount + "/">");  
  71.             excelDoc.Write("<Table>");  
  72.             excelDoc.Write("<Row>");  
  73.             for (int x = 0; x < source.Tables[0].Columns.Count; x++)  
  74.             {  
  75.                 excelDoc.Write("<Cell ss:StyleID=/"BoldColumn/"><Data ss:Type=/"String/">");  
  76.                 excelDoc.Write(source.Tables[0].Columns[x].ColumnName);  
  77.                 excelDoc.Write("</Data></Cell>");  
  78.             }  
  79.             excelDoc.Write("</Row>");  
  80.             foreach (DataRow x in source.Tables[0].Rows)  
  81.             {  
  82.                 rowCount++;  
  83.                 //if the number of rows is > 64000 create a new page to continue output  
  84.                 if (rowCount == 64000)  
  85.                 {  
  86.                     rowCount = 0;  
  87.                     sheetCount++;  
  88.                     excelDoc.Write("</Table>");  
  89.                     excelDoc.Write(" </Worksheet>");  
  90.                     excelDoc.Write("<Worksheet ss:Name=/"Sheet" + sheetCount + "/">");  
  91.                     excelDoc.Write("<Table>");  
  92.                 }  
  93.                 excelDoc.Write("<Row>"); //ID=" + rowCount + "  
  94.                 for (int y = 0; y < source.Tables[0].Columns.Count; y++)  
  95.                 {  
  96.                     System.Type rowType;  
  97.                     rowType = x[y].GetType();  
  98.                     switch (rowType.ToString())  
  99.                     {  
  100.                         case "System.String":  
  101.                             string XMLstring = x[y].ToString();  
  102.                             XMLstring = XMLstring.Trim();  
  103.                             XMLstring = XMLstring.Replace("&""&");  
  104.                             XMLstring = XMLstring.Replace(">"">");  
  105.                             XMLstring = XMLstring.Replace("<""<");  
  106.                             excelDoc.Write("<Cell ss:StyleID=/"StringLiteral/">" +  
  107.                                            "<Data ss:Type=/"String/">");  
  108.                             excelDoc.Write(XMLstring);  
  109.                             excelDoc.Write("</Data></Cell>");  
  110.                             break;  
  111.                         case "System.DateTime":  
  112.                             //Excel has a specific Date Format of YYYY-MM-DD followed by    
  113.                             //the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000  
  114.                             //The Following Code puts the date stored in XMLDate   
  115.                             //to the format above  
  116.                             DateTime XMLDate = (DateTime)x[y];  
  117.                             string XMLDatetoString = ""//Excel Converted Date  
  118.                             XMLDatetoString = XMLDate.Year.ToString() +  
  119.                                  "-" +  
  120.                                  (XMLDate.Month < 10 ? "0" +  
  121.                                  XMLDate.Month.ToString() : XMLDate.Month.ToString()) +  
  122.                                  "-" +  
  123.                                  (XMLDate.Day < 10 ? "0" +  
  124.                                  XMLDate.Day.ToString() : XMLDate.Day.ToString()) +  
  125.                                  "T" +  
  126.                                  (XMLDate.Hour < 10 ? "0" +  
  127.                                  XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) +  
  128.                                  ":" +  
  129.                                  (XMLDate.Minute < 10 ? "0" +  
  130.                                  XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) +  
  131.                                  ":" +  
  132.                                  (XMLDate.Second < 10 ? "0" +  
  133.                                  XMLDate.Second.ToString() : XMLDate.Second.ToString()) +  
  134.                                  ".000";  
  135.                             excelDoc.Write("<Cell ss:StyleID=/"DateLiteral/">" +  
  136.                                          "<Data ss:Type=/"DateTime/">");  
  137.                             excelDoc.Write(XMLDatetoString);  
  138.                             excelDoc.Write("</Data></Cell>");  
  139.                             break;  
  140.                         case "System.Boolean":  
  141.                             excelDoc.Write("<Cell ss:StyleID=/"StringLiteral/">" +  
  142.                                         "<Data ss:Type=/"String/">");  
  143.                             excelDoc.Write(x[y].ToString());  
  144.                             excelDoc.Write("</Data></Cell>");  
  145.                             break;  
  146.                         case "System.Int16":  
  147.                         case "System.Int32":  
  148.                         case "System.Int64":  
  149.                         case "System.Byte":  
  150.                             excelDoc.Write("<Cell ss:StyleID=/"Integer/">" +  
  151.                                     "<Data ss:Type=/"Number/">");  
  152.                             excelDoc.Write(x[y].ToString());  
  153.                             excelDoc.Write("</Data></Cell>");  
  154.                             break;  
  155.                         case "System.Decimal":  
  156.                         case "System.Double":  
  157.                             excelDoc.Write("<Cell ss:StyleID=/"Decimal/">" +  
  158.                                   "<Data ss:Type=/"Number/">");  
  159.                             excelDoc.Write(x[y].ToString());  
  160.                             excelDoc.Write("</Data></Cell>");  
  161.                             break;  
  162.                         case "System.DBNull":  
  163.                             excelDoc.Write("<Cell ss:StyleID=/"StringLiteral/">" +  
  164.                                   "<Data ss:Type=/"String/">");  
  165.                             excelDoc.Write("");  
  166.                             excelDoc.Write("</Data></Cell>");  
  167.                             break;  
  168.                         default:  
  169.                             throw (new Exception(rowType.ToString() + " not handled."));  
  170.                     }  
  171.                 }  
  172.                 excelDoc.Write("</Row>");  
  173.             }  
  174.             excelDoc.Write("</Table>");  
  175.             excelDoc.Write(" </Worksheet>");  
  176.             excelDoc.Write(endExcelXML);  
  177.             excelDoc.Close();  
  178.         }  
/// <summary>        /// 執行匯出        /// </summary>        /// <param name="ds">要匯出的DataSet</param>        /// <param name="strExcelFileName">要匯出的檔名</param>        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=/"In