2012-01-25 60 views
0

我想將一個DataTable轉換成XLS文件。下面轉換DataTable不可逆?

Snippet1

Response.Clear(); 
     Response.Buffer = true; 

     Response.AddHeader("content-disposition","attachment;filename=New.xls"); 
     Response.Charset = ""; 
     Response.ContentType = "application/vnd.ms-excel"; 

     StringWriter sw = new StringWriter(); 
     HtmlTextWriter hw = new HtmlTextWriter(sw); 

     for (int i = 1; i < gvGridView.HeaderRow.Cells.Count; i++) 
     { 
      gvGridView.HeaderRow.Cells[i].Text = Table.Columns[i - 1].ColumnName; 
     } 

     for (int i = 0; i < gvGridView.Rows.Count; i++) 
     { 
      //Apply text style to each Row 
      gvGridView.Rows[i].Attributes.Add("class", "textmode"); 
     } 
     gvGridView.RenderControl(hw); 

     //style to format numbers to string 
     string style = @"<style> .textmode { mso-number-format:\@; } </style>"; 
     Response.Write(style); 
     Response.Output.Write(sw.ToString()); 
     Response.Flush(); 
     Response.End(); 

代碼此代碼似乎罰款。它生成了一個xls文件。它可以正確打開。不過,我試圖逆向工程這個過程。簡而言之,將這個特定的xls文件轉換回數據表。下面的代碼:

Snippet2
int idx = filen.IndexOf("."); 
     string tf = filen.Remove(idx, 4); 

     OleDbConnection MyConnection = null;  
     DataSet DtSet = null;  
     OleDbDataAdapter MyCommand = null; 
     //Connection for MS Excel 2003 .xls format 
     MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; Data Source='" + path + "';Extended Properties=Excel 8.0;");  
     MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [table$]", MyConnection);  
     DtSet = new System.Data.DataSet();  
     MyCommand.Fill(DtSet);   
     dt = DtSet.Tables[0];   
     MyConnection.Close();    
     if (dt.Rows.Count > 0)   
     {    
      theGridView.DataSource = dt;   
      theGridView.DataBind();  
     }   
     if(System.IO.File.Exists(path))  
     {    
      System.IO.File.Delete(path);  
     } 

此代碼產生錯誤。它說:

外部文件格式不支持

我注意到,當你使用了錯誤的OLEDB提供此錯誤是相似的。但在我的情況下,應該沒有問題,因爲我使用Microsoft.Jet.OLEDB.4.0 for .xls(2003)格式。但不知何故它仍然發生。

此代碼以某種方式適用於我測試的任何其他.xls文件。 它不適用於使用#Snippet1轉換而生成的文件。不過,假設我使用#Snippet1生成了一個文件,然後將所有單元複製到一個新的.xls文件中。 #Snippet2將對這個新文件起作用。總之,只有從#Snippet1直接生成的文件不起作用。

我想我做錯了什麼。所以我希望有人能夠幫助我。

回答

1

您的Excel輸出代碼操作系統不生成Excel文件。它生成一個html表格並設置內容類型以告訴計算機使用Excel打開它。

您需要使用一個庫來生成一個真正的excel文件或使用excel數據互操作(這裏有很多文章)才能直接使用它。

或者,您可以改爲生成.csv文件,但仍保留Excel內容類型,以便Excel可以打開它,但會丟失格式。然後,您導入可以檢查擴展名,將其作爲excel或純文本閱讀。

+0

你能告訴我怎麼做嗎?如果你願意的話,你會感到欣喜若狂。 – rofans91

+0

我自己設法解決了這個問題。你的解釋是對的。這是一個創建.xls文件的不好方法。 – rofans91