DataSet,DataTable 不使用EXCEL组件直接保存为EXCEL

来源:互联网 发布:可牛闪图软件下载 编辑:程序博客网 时间:2024/06/08 15:28
DataSet,DataTable 不使用EXCEL组件直接保存为EXCEL

 B/S模式下DataSet导出保存为EXCEL直接可以Respone出来,比较简单,而C/S模式下将DataSet导出到EXCEL相对比较麻烦,要使用EXCEL要引用Microsoft.Office.Interop.Excel,经常会出现一些EXCEL进程无法关闭的问题,很让人厌恶,查看了网上一些资料,其实EXCEL也是有他自己的固定的XML格式的
。具体格式如下,首先要先定义好它的头部分,
显示出来的EXCEL 才不会错误。

  1. public  string ExcelHeader()
  2.         {
  3.             System.Text.StringBuilder sb = new System.Text.StringBuilder();
  4.             sb.Append("<?xml version=/"1.0/"?>/n");
  5.             sb.Append("<?mso-application progid=/"Excel.Sheet/"?>/n");
  6.             sb.Append(
  7.               "<Workbook xmlns=/"urn:schemas-microsoft-com:office:spreadsheet/" ");
  8.             sb.Append("xmlns:o=/"urn:schemas-microsoft-com:office:office/" ");
  9.             sb.Append("xmlns:x=/"urn:schemas-microsoft-com:office:excel/" ");
  10.             sb.Append("xmlns:ss=/"urn:schemas-microsoft-com:office:spreadsheet/" ");
  11.             sb.Append("xmlns:html=/"http://www.w3.org/TR/REC-html40/">/n");
  12.             sb.Append(
  13.               "<DocumentProperties xmlns=/"urn:schemas-microsoft-com:office:office/">");
  14.             sb.Append("</DocumentProperties>");
  15.             sb.Append(
  16.               "<ExcelWorkbook xmlns=/"urn:schemas-microsoft-com:office:excel/">/n");
  17.             sb.Append("<ProtectStructure>False</ProtectStructure>/n");
  18.             sb.Append("<ProtectWindows>False</ProtectWindows>/n");
  19.             sb.Append("</ExcelWorkbook>/n");
  20.             return sb.ToString();
  21.         }

 

接下来就是具体的内容了,包括DATASET,DATATABLE,等数据源

 
  1. public void exportToExcel(DataSet source, string fileName)
  2.         {
  3.             position = 0;
  4.             System.IO.StreamWriter excelDoc;
  5.             excelDoc = new System.IO.StreamWriter(fileName);
  6.             string startExcelXML = ExcelHeader();
  7.             startExcelXML += "<Styles>/r/n " +
  8.                 "<Style ss:ID=/"Default/" ss:Name=/"Normal/">/r/n " +
  9.                 "<Alignment ss:Vertical=/"Bottom/"/>/r/n <Borders/>" +
  10.                 "/r/n <Font/>/r/n <Interior/>/r/n <NumberFormat/>" +
  11.                 "/r/n <Protection/>/r/n </Style>/r/n " +
  12.                 "<Style ss:ID=/"BoldColumn/">/r/n <Font " +
  13.                 "x:Family=/"Swiss/" ss:Bold=/"1/"/>/r/n </Style>/r/n " +
  14.                 "<Style ss:ID=/"StringLiteral/">/r/n <NumberFormat" +
  15.                 " ss:Format=/"@/"/>/r/n </Style>/r/n <Style " +
  16.                 "ss:ID=/"Decimal/">/r/n <NumberFormat " +
  17.                 "ss:Format=/"0.0000/"/>/r/n </Style>/r/n " +
  18.                 "<Style ss:ID=/"Integer/">/r/n <NumberFormat " +
  19.                 "ss:Format=/"0/"/>/r/n </Style>/r/n <Style " +
  20.                 "ss:ID=/"DateLiteral/">/r/n <NumberFormat " +
  21.                 "ss:Format=/"mm/dd/yyyy;@/"/>/r/n </Style>/r/n " +
  22.                 "</Styles>/r/n ";
  23.             const string endExcelXML = "</Workbook>";
  24.             int rowCount = 0;
  25.             int sheetCount = 1;
  26.           
  27.             excelDoc.Write(startExcelXML);
  28.             excelDoc.Write("<Worksheet ss:Name=/"Sheet" + sheetCount + "/">");
  29.             excelDoc.Write("<Table>");
  30.             excelDoc.Write("<Row>");
  31.             for (int x = 0; x < source.Tables[0].Columns.Count; x++)
  32.             {
  33.                 excelDoc.Write("<Cell ss:StyleID=/"BoldColumn/"><Data ss:Type=/"String/">");
  34.                 excelDoc.Write(source.Tables[0].Columns[x].ColumnName);
  35.                 excelDoc.Write("</Data></Cell>");
  36.             }
  37.             excelDoc.Write("</Row>");
  38.             foreach (DataRow x in source.Tables[0].Rows)
  39.             {
  40.                 rowCount++;
  41. //Excel 最多只能显示64000条数据,在同一个WorkSheet里
  42.                 if (rowCount == 64000)
  43.                 {
  44.                     rowCount = 0;
  45.                     sheetCount++;
  46.                     excelDoc.Write("</Table>");
  47.                     excelDoc.Write(" </Worksheet>");
  48.                     excelDoc.Write("<Worksheet ss:Name=/"Sheet" + sheetCount + "/">");
  49.                     excelDoc.Write("<Table>");
  50.                 }
  51.                 excelDoc.Write("<Row>"); //ID=" + rowCount + "
  52.                 for (int y = 0; y < source.Tables[0].Columns.Count; y++)
  53.                 {
  54.                     System.Type rowType;
  55.                     rowType = x[y].GetType();
  56.                     switch (rowType.ToString())
  57.                     {
  58.                         case "System.String":
  59.                             string XMLstring = x[y].ToString();
  60.                             XMLstring = XMLstring.Trim();
  61.                             XMLstring = XMLstring.Replace("&""&");
  62.                             XMLstring = XMLstring.Replace(">"">");
  63.                             XMLstring = XMLstring.Replace("<""<");
  64.                             excelDoc.Write("<Cell ss:StyleID=/"StringLiteral/">" +
  65.                                            "<Data ss:Type=/"String/">");
  66.                             excelDoc.Write(XMLstring);
  67.                             excelDoc.Write("</Data></Cell>");
  68.                             break;
  69.                         case "System.DateTime"
  70.                             DateTime XMLDate = (DateTime)x[y];
  71.                             string XMLDatetoString = ""//Excel Converted Date
  72.                             XMLDatetoString = XMLDate.Year.ToString() +
  73.                                  "-" +
  74.                                  (XMLDate.Month < 10 ? "0" +
  75.                                  XMLDate.Month.ToString() : XMLDate.Month.ToString()) +
  76.                                  "-" +
  77.                                  (XMLDate.Day < 10 ? "0" +
  78.                                  XMLDate.Day.ToString() : XMLDate.Day.ToString()) +
  79.                                  "T" +
  80.                                  (XMLDate.Hour < 10 ? "0" +
  81.                                  XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) +
  82.                                  ":" +
  83.                                  (XMLDate.Minute < 10 ? "0" +
  84.                                  XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) +
  85.                                  ":" +
  86.                                  (XMLDate.Second < 10 ? "0" +
  87.                                  XMLDate.Second.ToString() : XMLDate.Second.ToString()) +
  88.                                  ".000";
  89.                             excelDoc.Write("<Cell ss:StyleID=/"DateLiteral/">" +
  90.                                          "<Data ss:Type=/"DateTime/">");
  91.                             excelDoc.Write(XMLDatetoString);
  92.                             excelDoc.Write("</Data></Cell>");
  93.                             break;
  94.                         case "System.Boolean":
  95.                             excelDoc.Write("<Cell ss:StyleID=/"StringLiteral/">" +
  96.                                         "<Data ss:Type=/"String/">");
  97.                             excelDoc.Write(x[y].ToString());
  98.                             excelDoc.Write("</Data></Cell>");
  99.                             break;
  100.                         case "System.Int16":
  101.                         case "System.Int32":
  102.                         case "System.Int64":
  103.                         case "System.Byte":
  104.                             excelDoc.Write("<Cell ss:StyleID=/"Integer/">" +
  105.                                     "<Data ss:Type=/"Number/">");
  106.                             excelDoc.Write(x[y].ToString());
  107.                             excelDoc.Write("</Data></Cell>");
  108.                             break;
  109.                         case "System.Decimal":
  110.                         case "System.Double":
  111.                             excelDoc.Write("<Cell ss:StyleID=/"Decimal/">" +
  112.                                   "<Data ss:Type=/"Number/">");
  113.                             excelDoc.Write(x[y].ToString());
  114.                             excelDoc.Write("</Data></Cell>");
  115.                             break;
  116.                         case "System.DBNull":
  117.                             excelDoc.Write("<Cell ss:StyleID=/"StringLiteral/">" +
  118.                                   "<Data ss:Type=/"String/">");
  119.                             excelDoc.Write("");
  120.                             excelDoc.Write("</Data></Cell>");
  121.                             break;
  122.                         default:
  123.                             throw (new Exception(rowType.ToString() + " not handled."));
  124.                     }
  125.                     position = y;
  126.                     ProgressEventArgs pe = new ProgressEventArgs(position);
  127.                     OnProgressChange(pe);
  128.                 }
  129.                 excelDoc.Write("</Row>");
  130.             }
  131.             excelDoc.Write("</Table>");
  132.             excelDoc.Write(" </Worksheet>");
  133.             excelDoc.Write(endExcelXML);
  134.             excelDoc.Close();
  135.         }
  136. }

 

原创粉丝点击