2012-07-13 26 views
0

我使用LOC富林出口並從Excel導入表在我的asp.net應用程序出口數據集中項目的Excel工作表

protected void LinkbuttonExportToExcel_Click(object sender, EventArgs e) 
{ 
    UserManager manager = new UserManager(); 
    DataSet dataSet = manager.GetProductDataToExport(); 

    string attachment = "attachment; filename=Report.xls"; 
    Response.ClearContent(); 
    Response.AddHeader("content-disposition", attachment); 
    Response.ContentType = "application/vnd.ms-excel"; 
    string tab = ""; 
    string tab1 = ""; 
    foreach (DataTable table in dataSet.Tables) 
    { 
     foreach (DataColumn column in table.Columns) 
     { 
      Response.Write(tab1 + column.ColumnName); 
      tab1 = "\t"; 
     } 
    } 
    tab = "\n"; 
     foreach (DataRow dr in dataSet.Tables[0].Rows) 
    { 
     for (int i = 0; i < dataSet.Tables[0].Columns.Count; i++) 
     { 
      Response.Write(tab + dr[i].ToString()); 
      tab = "\t"; 
     } 
     tab = "\n"; 
    } 
    Response.End(); 
} 

protected void ButtonImportDataFromExcel_Click(object sender, EventArgs e) 
{ 
    FileUpload1.PostedFile.SaveAs(Server.MapPath("~/App_Data/ProductImport.xls")); 
    OleDbConnection objXConn = new OleDbConnection(); 
    objXConn.ConnectionString = ConfigurationManager.ConnectionStrings["sqlXCon"].ConnectionString; 
    if (objXConn.State == ConnectionState.Closed) 
    { 
     objXConn.Open(); 
    } 

     DataTable dt = new DataTable(); 
     dt = objXConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     string excelSheetName = string.Empty; ; 
     foreach (DataRow row in dt.Rows) 
     { 
      excelSheetName = row["TABLE_NAME"].ToString(); 
     } 
     OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + excelSheetName + "]", objXConn); 
     OleDbDataReader rd = cmd.ExecuteReader(); 
     UserManager manager = new UserManager(); 

     while (rd.Read()) 
     { 
      int productId = int.Parse((rd.GetValue(0).ToString())); 
      string productName = (rd.GetValue(1).ToString()); 
      string productNameHindi = (rd.GetValue(2).ToString()); 
      decimal productPrice = decimal.Parse((rd.GetValue(3).ToString())); 
      string productStatus = (rd.GetValue(4).ToString()); 
      manager.UpdateProductMasterFromExcelSheet(productId, productName); 
     } 
    } 
    else 
    { 
     objXConn.Close(); 
    } 
    msgBox1.alert("Products updated successfully"); 
} 

}

我使用下面的連接字符串..

<add name="sqlXCon" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source='|DataDirectory|ProductImport.xls';Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';" /> 

文件Report.xls成功導出。但問題是我無法導入「Report.xls」,除非我打開該文件並將其另存爲.xls。爲什麼發生這種情況?

回答

0

下載出現這種情況的原因是因爲你沒有真正導出Excel文件:你LinkbuttonExportToExcel_Click產生製表符分隔值文件,可以通過打開Excel,但不是Excel文件。

在另一方面,你ButtonImportDataFromExcel_Click功能從Excel文件讀取(那麼它必須是一個真正的Excel文件,而不是一個TSV)

所以你實際上必須手動打開它,它被轉換爲XLS再次保存。

爲此,如果您的服務器上有Excel,或者使用開源庫生成Excel文件,則可以使用Excel.Interop生成Excel文件。

+3

反黑組的方式..會盡力的.. Thanxs @T。 Fabre – Abhijeetchindhe 2012-07-13 07:36:36

+0

Thanxs @Waqar。 – Abhijeetchindhe 2012-07-13 07:38:08

0

使用Excel Libraray,從http://code.google.com/p/excellibrary/downloads/list

using System; 
using System.Data; 
using System.IO; 
using ExcelLibrary.SpreadSheet; 

namespace ExcelLibrary 
{ 
/// <summary> 
/// Provides simple way to convert Excel workbook into DataSet 
/// </summary> 
public sealed class DataSetHelper 
{ 
/// <summary> 
/// Populate all data (all converted into String) in all worksheets 
/// from a given Excel workbook. 
/// </summary> 
/// <param name="filePath">File path of the Excel workbook</param> 
/// <returns>DataSet with all worksheet populate into DataTable</returns> 
public static DataSet CreateDataSet(String filePath) 
{ 
    DataSet ds = new DataSet(); 
    Workbook workbook = Workbook.Load(filePath); 
    foreach (Worksheet ws in workbook.Worksheets) 
    { 
     DataTable dt = PopulateDataTable(ws); 
     ds.Tables.Add(dt); 
    } 
    return ds; 
} 

/// <summary> 
/// Populate data (all converted into String) from a given Excel 
/// workbook and also work sheet name into a new instance of DataTable. 
/// Returns null if given work sheet is not found. 
/// </summary> 
/// <param name="filePath">File path of the Excel workbook</param> 
/// <param name="sheetName">Worksheet name in workbook</param> 
/// <returns>DataTable with populate data</returns> 
public static DataTable CreateDataTable(String filePath, String sheetName) 
{ 
    Workbook workbook = Workbook.Load(filePath); 
    foreach (Worksheet ws in workbook.Worksheets) 
    { 
     if (ws.Name.Equals(sheetName)) 
      return PopulateDataTable(ws); 
    } 
    return null; 
} 

private static DataTable PopulateDataTable(Worksheet ws) 
{ 
    CellCollection Cells = ws.Cells; 

    // Creates DataTable from a Worksheet 
    // All values will be treated as Strings 
    DataTable dt = new DataTable(ws.Name); 

    // Extract columns 
    for (int i = 0; i <= Cells.LastColIndex; i++) 
     dt.Columns.Add(Cells[0, i].StringValue, typeof(String)); 

    // Extract data 
    for (int currentRowIndex = 1; currentRowIndex <= Cells.LastRowIndex; currentRowIndex++) 
    { 
     DataRow dr = dt.NewRow(); 
     for (int currentColumnIndex = 0; currentColumnIndex <= Cells.LastColIndex; currentColumnIndex++) 
      dr[currentColumnIndex] = Cells[currentRowIndex, currentColumnIndex].StringValue; 
     dt.Rows.Add(dr); 
    } 

    return dt; 
} 

/// <summary> 
/// Populate all data from the given DataSet into a new Excel workbook 
/// </summary> 
/// <param name="filePath">File path to new Excel workbook to be created</param> 
/// <param name="dataset">Source DataSet</param> 
public static void CreateWorkbook(String filePath, DataSet dataset) 
{ 
    if (dataset.Tables.Count == 0) 
     throw new ArgumentException("DataSet needs to have at least one DataTable", "dataset"); 

    Workbook workbook = new Workbook(); 
    foreach (DataTable dt in dataset.Tables) 
    { 
     Worksheet worksheet = new Worksheet(dt.TableName); 
     for (int i = 0; i < dt.Columns.Count; i++) 
     { 
      // Add column header 
      worksheet.Cells[0, i] = new Cell(dt.Columns[i].ColumnName); 

      // Populate row data 
      for (int j = 0; j < dt.Rows.Count; j++) 
       worksheet.Cells[j + 1, i] = new Cell(dt.Rows[j][i]); 
     } 
     workbook.Worksheets.Add(worksheet); 
    } 
    workbook.Save(filePath); 
} 
} 
} 
2

For More info abour Excel InterOp。請參閱本網站..

Excel.Interop

相關問題